Files
frontend-app/uni_modules/uview-plus/index.js
T
2026-07-23 14:31:06 +08:00

313 lines
8.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 补齐部分平台缺失的 uni API(如支付宝小程序的 onWindowResize)
import { applyUniApiShims } from './libs/function/uni-api-shims.js'
applyUniApiShims()
// 看到此报错,是因为没有配置vite.config.js的【transpileDependencies】
// const pleaseSetTranspileDependencies = {}, babelTest = pleaseSetTranspileDependencies?.test
// 引入全局mixin
import { mixin } from './libs/mixin/mixin.js'
// 小程序特有的mixin
import { mpMixin } from './libs/mixin/mpMixin.js'
// 路由封装
import route from './libs/util/route.js'
// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制
import colorGradient from './libs/function/colorGradient.js'
// 规则检验
import test from './libs/function/test.js'
// 防抖方法
import debounce from './libs/function/debounce.js'
// 节流方法
import throttle from './libs/function/throttle.js'
// 浮点计算
import calc from './libs/function/calc.js'
// 浮点计算
import digit from './libs/function/digit.js'
// 公共文件写入的方法
import index, { rpx2px } from './libs/function/index.js'
// 配置信息
import config from './libs/config/config.js'
// props配置信息
import props, { setPropsConfig } from './libs/config/props.js'
// 各个需要fixed的地方的z-index配置文件
import zIndex from './libs/config/zIndex.js'
// 关于颜色的配置,特殊场景使用
import color from './libs/config/color.js'
// 平台
import platform from './libs/function/platform'
// http
import http from './libs/function/http.js'
// fontUtil
import fontUtil from './components/u-icon/util.js';
// i18n
import i18n, { t } from './libs/i18n/index.js'
import {
themeState,
setTheme,
setThemePreference,
getThemePreference,
getSystemTheme,
getThemeVars,
initThemeSystem,
refreshThemeFromConfig,
syncThemeColorOverrideState
} from './libs/theme/theme.js'
import {
applyNativeThemeUI,
getThemeCardStyle,
getThemeIsDark,
getThemePageStyle,
getThemeTabBarStyle,
getThemeVar,
getThemeVarsForStyle
} from './libs/theme/runtime.js'
const rootToastState = {
ref: null
}
const rootNotifyState = {
ref: null
}
function normalizeRootToastOptions(options = {}) {
const toastOptions = typeof options === 'string'
? { message: options }
: (options && typeof options === 'object' ? { ...options } : {})
if (!toastOptions.message && toastOptions.title) {
toastOptions.message = toastOptions.title
}
return toastOptions
}
function setRootToastRef(ref = null) {
rootToastState.ref = ref || null
}
function rootToast(options = {}) {
const toastOptions = normalizeRootToastOptions(options)
const toastRef = rootToastState.ref
if (toastRef && typeof toastRef.show === 'function') {
toastRef.show(toastOptions)
return
}
if (!toastOptions.message) return
if (typeof uni !== 'undefined' && typeof uni.showToast === 'function') {
uni.showToast({
title: toastOptions.message,
icon: 'none',
duration: Number(toastOptions.duration) || 2000,
})
}
}
function normalizeRootNotifyOptions(options = {}) {
const notifyOptions = typeof options === 'string'
? { message: options }
: (options && typeof options === 'object' ? { ...options } : {})
if (!notifyOptions.message && notifyOptions.title) {
notifyOptions.message = notifyOptions.title
}
return notifyOptions
}
function setRootNotifyRef(ref = null) {
rootNotifyState.ref = ref || null
}
function rootNotify(options = {}) {
const notifyOptions = normalizeRootNotifyOptions(options)
const notifyRef = rootNotifyState.ref
if (notifyRef && typeof notifyRef.show === 'function') {
notifyRef.show(notifyOptions)
return
}
if (!notifyOptions.message) return
if (typeof uni !== 'undefined' && typeof uni.showToast === 'function') {
uni.showToast({
title: notifyOptions.message,
icon: 'none',
duration: Number(notifyOptions.duration) || 3000,
})
}
}
// 导出
let themeType = ['primary', 'success', 'error', 'warning', 'info'];
export { route, http, debounce, throttle, calc, digit, platform, themeType, mixin, mpMixin, props, color, test, zIndex, fontUtil, i18n , rpx2px, t}
export * from './libs/function/index.js'
export * from './libs/function/colorGradient.js'
/**
* @description 修改uView内置属性值
* @param {object} props 修改内置props属性
* @param {object} config 修改内置config属性
* @param {object} color 修改内置color属性
* @param {object} zIndex 修改内置zIndex属性
*/
export function setConfig(configs) {
const settings = configs || {}
index.shallowMerge(config, settings.config || {})
setPropsConfig(settings.props || {})
index.shallowMerge(color, settings.color || {})
index.shallowMerge(zIndex, settings.zIndex || {})
syncThemeColorOverrideState({
color: settings.color,
configColor: settings?.config?.color
})
const shouldRefreshTheme = !!settings.color
|| !!settings?.config?.color
|| themeState.version > 0
if (shouldRefreshTheme) {
refreshThemeFromConfig()
}
}
index.setConfig = setConfig
const $u = {
route,
date: index.timeFormat, // 另名date
colorGradient: colorGradient.colorGradient,
hexToRgb: colorGradient.hexToRgb,
rgbToHex: colorGradient.rgbToHex,
colorToRgba: colorGradient.colorToRgba,
test,
type: themeType,
http,
config, // uview-plus配置信息相关,比如版本号
zIndex,
debounce,
throttle,
calc,
mixin,
mpMixin,
props,
...index,
color,
platform,
theme: themeState,
setTheme,
setThemePreference,
getThemePreference,
getSystemTheme,
getThemeVars,
getThemeTabBarStyle,
applyNativeThemeUI,
rootToast,
setRootToastRef,
rootNotify,
setRootNotifyRef
}
export const mount$u = function() {
uni.$u = $u
initThemeSystem()
}
function defineGlobalThemeHelpers(Vue) {
const globalProperties = Vue?.config?.globalProperties
if (!globalProperties) return
Object.defineProperty(globalProperties, 'upThemeIsDark', {
configurable: true,
get() {
return getThemeIsDark()
}
})
Object.defineProperty(globalProperties, 'upThemeVars', {
configurable: true,
get() {
return getThemeVarsForStyle()
}
})
Object.defineProperty(globalProperties, 'upThemePageStyle', {
configurable: true,
get() {
return getThemePageStyle()
}
})
Object.defineProperty(globalProperties, 'upThemeCardStyle', {
configurable: true,
get() {
return getThemeCardStyle()
}
})
globalProperties.upThemeVar = function(varName, fallbackColor) {
return getThemeVar(varName, fallbackColor)
}
globalProperties.upApplyNativeThemeUI = function() {
return applyNativeThemeUI()
}
}
function toCamelCase(str) {
return str.replace(/-([a-z])/g, function(match, group1) {
return group1.toUpperCase();
}).replace(/^[a-z]/, function(match) {
return match.toUpperCase();
});
}
let components = []
function resolveComponents() {
if (components.length) return components
// #ifdef H5
// import.meta.glob is a Vite compile-time macro; the runtime guard would
// always fail in the browser and block component registration.
const importFn = import.meta.glob('./components/u-*/u-*.vue', { eager: true })
for (const key in importFn) {
const component = importFn[key]?.default
if (component?.name && component.name.indexOf('u--') !== 0) {
components.push(component)
}
}
// #endif
return components
}
const install = (Vue, upuiParams = '') => {
// #ifdef H5
resolveComponents().forEach(function(component) {
const name = component.name.replace(/u-([a-zA-Z0-9-_]+)/g, 'up-$1');
if (name != component.name) {
Vue.component(component.name, component);
}
Vue.component(name, component);
});
// #endif
// 初始化
if (upuiParams) {
uni.upuiParams = upuiParams
let temp = upuiParams()
if (temp.httpIns) {
temp.httpIns(http)
}
if (temp.options) {
setConfig(temp.options)
}
}
// 同时挂载到uni和Vue.prototype中
// $u挂载到uni对象上
uni.$u = $u
initThemeSystem()
if (Vue && Vue.config && Vue.config.globalProperties) {
Vue.config.globalProperties.$u = $u
defineGlobalThemeHelpers(Vue)
}
if (Vue && typeof Vue.mixin === 'function') {
Vue.mixin(mixin)
}
}
export default {
install
}