uni-app 的 globalData 是 App 实例的普通非响应式属性,需通过 getApp() 访问,仅适合存低频读写的配置类数据,不支持自动更新,多端使用需判空并避免直接解构。

uni-app 的 globalData 不是全局变量,而是 App 实例上的一个普通对象
很多人以为 globalData 是类似 window 那样的全局作用域,其实它只是 App 类实例的一个属性,只有在 App.vue 里定义、且必须通过 getApp() 拿到 App 实例后才能访问。直接在组件里写 globalData.xxx 会报 undefined。
-
globalData不会自动响应式更新:改了值,已渲染的页面不会重绘,得手动触发this.$forceUpdate()或用watch监听变化 - 只适合存配置、token、用户基础信息等低频读写的数据,别塞大对象或频繁修改的列表
- 多端编译时注意:H5 端
getApp()在某些异步时机(比如onLaunch外)可能返回undefined,需加判空
在 App.vue 里正确初始化 globalData
必须在 App 的 data 函数中返回,不能写在 data 对象字面量里(否则 H5 端失效),也不能写成箭头函数(this 绑定错误)。
export default {
data() {
return {
globalData: {
userInfo: null,
theme: 'light',
apiBase: 'https://api.example.com'
}
}
},
onLaunch() {
// 这里可以初始化 userInfo 等
}
}
- 不要在
data外层直接写globalData = {...},uni-app 不识别 - 如果要用 TypeScript,
globalData类型需在declare module '@dcloudio/uni-app'中扩展,否则getApp().globalData会提示类型缺失 - 小程序端支持持久化(如存进
uni.setStorageSync),但globalData本身不自动同步存储,得自己桥接
在页面或组件中安全读写 globalData
必须用 getApp() 获取实例,且每次都要检查是否拿到有效对象——尤其在 onLoad、onShow 甚至 computed 中调用时,H5 和小程序生命周期节奏不同。
const app = getApp()
if (app && app.globalData) {
console.log(app.globalData.theme)
app.globalData.userInfo = { name: 'Tom' }
}
- 避免在
data()里直接解构赋值getApp().globalData,会导致响应式丢失;应改用computed或watch - 写操作建议封装成方法(如
setUserInfo),统一处理存储、通知、校验逻辑 - 多个页面同时写同一个字段?没锁机制,可能覆盖。高频场景建议换 Vuex / Pinia(uni-app 3.0+ 支持)或自建事件总线
为什么改了 globalData 页面没更新?
因为 globalData 是普通 JS 对象,不在 Vue 响应式系统内。Vue 只代理了 data、props、computed 这些明确声明的字段。
- 临时方案:在页面中用
computed包一层,强制依赖getApp().globalData(但注意 H5 下getApp()可能为null) - 更稳做法:用
EventChannel或uni.$emit/uni.$on主动通知变更 - 真要响应式?把数据挂到
Vue.prototype上(不推荐),或直接上Pinia—— 尤其当项目超过 3 个页面共享状态时,globalData就该退场了
globalData 的边界很窄:它不是状态管理,也不解决跨组件通信。用它省事的前提,是你清楚它什么时候会“突然消失”、什么时候“改了也不管用”。真正需要共享和响应的,别硬扛。

















