在 uni-app 中挂载全局方法应于 main.js 中通过 Vue.prototype(Vue 2)或 app.config.globalProperties(Vue 3)实现,确保在首个实例创建前完成;需加 $ 前缀、避免 this 误用、做好跨平台兼容判断。
uni-app
里怎么挂载全局方法到
直接改
是最常用也最稳妥的方式,适用于所有 Vue 2 风格的 uni-app 项目(目前绝大多数 H5、小程序、App 端仍基于 Vue 2)。Vue 3(
)不支持该方式,需用
,但生态兼容性差,暂不推荐。
实操建议:
在
中创建函数后立即挂载,确保所有组件实例都能访问
函数名建议加前缀(如
、
),避免和原生属性或插件冲突
不要在挂载函数里直接使用
指向组件实例——它此时是 undefined;需显式传入
或用
(仅 Vue 3)
示例:
为什么不能在
里直接 export 函数然后 import 使用
能用,但不是“全局方法”的本意。用户真正需要的是“无需 import 就能在任意 .vue 文件中调用”,比如
。纯工具函数要 import,每次用都得写一行,容易漏、难统一管理、IDE 提示也不如挂载后稳定。
常见错误现象:
在
写了
,但在页面里写
报错:undefined
有人试图在
的
里挂载,结果子组件拿不到——因为挂载时机太晚,实例已创建完毕
关键点:挂载动作必须发生在 Vue 构造函数定义之后、首个实例创建之前,
是唯一可靠位置。
uni-app 编译到不同平台时,挂载的方法会失效吗
不会失效,只要挂载逻辑执行了,所有平台(微信小程序、支付宝、H5、App)都生效。但要注意平台 API 差异导致函数内部出错。
uni-app电商系统实战精讲课程课件
uni-app电商系统实战精讲课程
下载
典型坑:
在挂载的函数里直接调用
,却没判断当前是否在小程序环境(H5 不支持),运行时报错
用了
,H5 正常,小程序编译后白屏或报
挂载函数里用了
动态引入,但某些平台(如微信小程序)不支持 CommonJS 式 require
建议:所有跨平台函数内部必须做
或
判断,或用
统一 API 替代原生 Web API。
Vue 3 版 uni-app(
)怎么挂载
不能用
,要用
。但注意:这个版本目前文档少、插件兼容差、CLI 支持不稳定,多数人实际用不到。
如果真在用,操作很简单:
在
(或
)里拿到
实例后立刻挂载
函数内无法直接访问
,必须靠参数传入上下文,或用
+
挂载的属性在
里不可直接用
,要通过
访问(不推荐)或改用组合式 API 封装
示例:
真正麻烦的不是挂载动作本身,而是后续所有组件都要适配——尤其是已有项目升级时,
在 setup 里根本不可用,必须重构成
,这一步很容易被忽略。
Vue.prototypeVue.prototype@dcloudio/uni-app@nextapp.config.globalPropertiesmain.js$toast$httpthisvmgetCurrentInstance()// main.js
import Vue from 'vue'
Vue.prototype.$formatTime = function(timestamp) {
return new Date(timestamp).toLocaleString()
}
Vue.prototype.$safeGet = function(obj, path, def = null) {
return path.split('.').reduce((o, k) => o?.[k], obj) ?? def
}utils/this.$formatTime(171xxxx)utils/index.jsexport function $debounce() {...}this.$debounceApp.vuecreatedmain.jsuni.downloadFileuni.downloadFile is not a functiondocument.querySelectordocument is not definedrequire('xxx')uni.getSystemInfoSync().platformprocess.env.UNI_PLATFORMuni.@dcloudio/uni-app@nextVue.prototypeapp.config.globalPropertiesmain.jsmain.tsappthisgetCurrentInstance()proxysetup()this.xxxgetCurrentInstance().proxy.xxx// main.js(Vue 3 版)
import { createSSRApp } from 'vue'
import App from './App.vue'
export function createApp() {
const app = createSSRApp(App)
app.config.globalProperties.$log = function(msg) {
console.log('[uni]', msg)
}
return {
app
}
}this.$xxxconst { proxy } = getCurrentInstance()