uni-app设全局变量应避免挂载Vue.prototype,推荐Vuex(复杂响应式状态)或globalData(只读轻量数据);Vuex需手动挂载且注意小程序序列化限制,globalData非响应式但跨平台稳定,二者混用须统一入口同步更新。

uni-app 里怎么设全局变量?别直接挂 Vue.prototype
直接在 main.js 里写 Vue.prototype.$myVar = 'xxx' 看似简单,但在 uni-app(尤其编译到小程序平台)会失效或引发响应式丢失。原因很简单:小程序端的 Vue 实例不是标准 Vue,prototype 注入不被 runtime 正确识别;H5 端虽能用,但破坏了数据响应追踪和类型提示,后续维护容易出错。
真正可靠的方式只有两种:Vuex(适合状态较复杂、需响应式同步的场景),或 globalData(适合只读配置、token、用户基础信息等轻量共享)。
Vuex 在 uni-app 中必须手动初始化,不能靠自动注入
uni-app 的 App.vue 生命周期和 Vue 实例创建时机与标准 Vue 不同,createStore 返回的 store 不会自动挂载到所有组件的 this.$store 上——尤其是分包加载的页面,$store 可能为 undefined。
- 必须在
main.js中显式调用Vue.prototype.$store = store(H5/APP 有效),同时在每个需要 store 的页面或组件中,手动 import 并使用import store from '@/store'直接引用 - store 文件建议放在
/store/index.js,导出的是new Vuex.Store({})实例,而非函数(避免多次 new) - 小程序端注意:不要在 store 的
state里放不可序列化的值(如function、RegExp),否则可能触发 setData 警告或白屏 - 如果用了 TypeScript,记得给 store 添加类型定义,否则
store.state.xxx无法推导类型
什么时候该用 getApp().globalData?
当你要存的是登录态 token、用户 nickname、设备信息、API 基础 URL 这类“只读+低频更新”的数据时,globalData 更轻、更稳、跨平台兼容性更好。
立即学习“前端免费学习笔记(深入)”;
它本质是小程序原生的全局对象,在 uni-app 所有平台都可用,且不会因分包、异步组件加载而丢失。
- 在
app.vue的onLaunch或onShow中初始化:getApp().globalData.token = 'xxx' - 在任意页面中读取:
const token = getApp().globalData.token - 注意:它不是响应式的,修改后不会触发视图更新;如需监听变化,得自己加事件总线或配合
watch+ computed 模拟 - 不要往
globalData放大对象或频繁变动的数据,容易内存泄漏,也不利于调试
Vuex 和 globalData 混用时最容易踩的坑
最常见的错误是:把 token 存 Vuex,又在登录成功后忘记同步更新 getApp().globalData.token,结果 API 请求头里拿不到最新 token;或者反过来,只更新了 globalData,但页面里用 mapState 订阅的 user.token 还是旧值。
- 统一入口管理:封装一个
setAuthInfo({ token, userInfo })方法,内部同时写入 Vuex state 和getApp().globalData - 避免双写逻辑散落:所有登录、刷新 token、退出操作,必须走这个统一方法
- 调试时优先查
getApp().globalData的实际值(小程序开发者工具 Console 输入即可),比看 Vuex Devtools 更直接
复杂状态交给 Vuex,简单元数据交给 globalData,边界划清了,问题就少一半。但千万别以为设一次就万事大吉——跨平台运行时,它们根本不在同一个响应系统里。


















