Vuex 是 uni-app 中大型项目避免状态混乱的底线方案,需在 main.js 注册 store,state 修改必须通过 mutations,异步操作走 actions,跨页面注意初始化时机,并手动衔接持久化。

uni-app 项目里直接用 globalData 或 uni.setStorageSync 做全局状态共享,短期能跑通,但一上多页面联动、异步授权、跨端一致性,立刻暴露问题:状态不同步、调试无迹可循、类型不可靠。Vuex 是 uni-app 官方内置且真正可控的全局状态方案,不是“可选”,而是中大型项目里避免状态混乱的底线。
uni-app 中 Vuex 不需要 npm install
uni-app 内置了 Vuex,版本与 Vue 运行时匹配,直接 import 即可。如果你在 store/index.js 里写 import Vuex from 'vuex' 报错,大概率是路径没配对或文件没被正确引入——检查是否在 main.js 中通过 Vue.use(Vuex) 注册过 store 实例。
- 不装包:删掉
npm install vuex --save这类命令,它对 uni-app 无效甚至冲突 - 入口固定:必须在
main.js中创建并挂载 store,否则组件里this.$store为 undefined - 模块拆分建议放
store/modules/下,避免index.js膨胀成千行巨文件
state 修改必须走 mutations,不能直接赋值
这是最容易踩的坑:看到 this.$store.state.count 是个数字,顺手写 this.$store.state.count = 5,结果视图不更新、devtools 无记录、后续逻辑全错。Vuex 的响应式依赖于 mutation 的显式提交,绕过它等于关闭响应链。
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
- 正确写法:
this.$store.commit('setCount', 5),对应 mutations 中定义的setCount - 异步操作必须走 actions:比如用户点击“同意隐私协议”后要先调 API,再存状态,就得用
dispatch('acceptPrivacy'),而不是在组件里手动commit - 直接改 state 不会触发 getters 重计算,也不会被 vue-devtools 捕获,调试时等于“隐身修改”
跨页面读写状态时,注意生命周期和初始化时机
App.vue 的 onLaunch 是全局最早可执行 JS 的钩子,但很多开发者在这里 dispatch 初始化 action,却忘了某些页面(如首页)可能在 store 初始化完成前就已渲染,导致 mapState 取到空值或默认值。
立即学习“前端免费学习笔记(深入)”;
- 推荐在
store/index.js的 state 初始值里设合理默认(如privacyAccepted: null),而非false,避免“未加载完就判断拒绝” - 页面中用
computed+mapState读取,不要在data()里缓存一份副本,否则 store 更新后副本不会变 - 如果页面需响应 store 变化后执行副作用(如跳转),监听
watch: { '$store.state.privacyAccepted' },别依赖mounted一次性读取
最常被忽略的其实是持久化衔接:Vuex 状态默认只存在内存里,App 杀后台或小程序冷启动后就丢了。真要“记住用户选择”,得在 mutation 提交后同步写入 uni.setStorageSync,并在 onLaunch 里从 storage 拉取初始值——这不是 Vuex 的功能边界,而是你必须亲手缝合的关键一环。

















