Vuex 的 state、getters、mutations、actions 怎么分工?

先理解原理和示例,再练习完整口述与追问。

state 存状态,getters 派生数据,mutations 同步改状态,actions 编排异步及提交 mutation。组件临时交互状态不用全部放 Vuex。模块化、命名空间和退出清理要有边界。

state 保存共享事实,getters 派生值,mutations 同步表达状态改变,actions 组织异步过程并 commit。同步 mutation 的目的包括让变化记录更可追踪,不是 JavaScript 本身不能异步赋值。actions 可以返回 Promise,让调用方等待完成;页面局部草稿和一次弹窗状态通常没有必要进入全局。

获取用户信息的 action 等待接口后 commit setUser,页面 await dispatch 后再继续依赖用户的流程。并发查询时还需决定结果以哪个请求为准,不能因为放进 action 就自然消除竞态。共享列表若由多个路由使用,应把缓存键与筛选条件绑定,而不是用一个全局 rows 承载所有查询。

不要在组件中直接写 store.state.user.name 绕过 mutation,也不要把请求 Promise 或大型第三方实例长期塞进可序列化状态。SSR store 必须按请求创建。

Vuex 中 state 存共享数据,getters 表达派生数据,mutations 同步修改状态,actions 负责异步请求和流程编排,再提交 mutation。临时弹窗开关和单页草稿通常留在组件,跨页面的用户、权限等才共享。模块应有明确边界,退出或切换用户时清理相关状态,避免旧数据残留。

面试官可能继续问追问与完整解答展开收起

请求失败后 loading 谁负责恢复?持久化哪些字段?多个用户请求如何隔离 store?

谁启动请求,谁通过 try/finally 等方式恢复对应 loading;并发请求要避免旧任务结束时错误清掉新任务状态。持久化只保存必要且允许落盘的数据,并做版本迁移与退出清理。SSR 每个请求创建独立 store,不能让用户状态存在模块级单例。