组件通信和 Vuex 怎么设计
先理解原理和示例,再练习完整口述与追问。
回答要点
父子优先 props / events,跨层按场景选 provide / inject,跨页面共享用 Vuex。actions 组织异步流程,mutations 同步修改状态。Vue2 的 provide / inject 不能一概当作自动响应式,取决于提供值是否已被观察等条件。
原理拆解
state 保存共享事实,getters 派生值,mutations 同步表达状态改变,actions 组织异步过程并 commit。同步 mutation 的目的包括让变化记录更可追踪,不是 JavaScript 本身不能异步赋值。actions 可以返回 Promise,让调用方等待完成;页面局部草稿和一次弹窗状态通常没有必要进入全局。
示例与推演
获取用户信息的 action 等待接口后 commit setUser,页面 await dispatch 后再继续依赖用户的流程。并发查询时还需决定结果以哪个请求为准,不能因为放进 action 就自然消除竞态。共享列表若由多个路由使用,应把缓存键与筛选条件绑定,而不是用一个全局 rows 承载所有查询。
易错点
不要在组件中直接写 store.state.user.name 绕过 mutation,也不要把请求 Promise 或大型第三方实例长期塞进可序列化状态。SSR store 必须按请求创建。
参考回答可直接练习口述
局部交互状态放组件,父子用 props/events,兄弟共享提升到共同父级;跨层组件族可 provide/inject,跨页面共享再放 Vuex。Vuex 中 actions 组织异步、mutations 同步修改,getters 负责派生。Vue2 的 provide/inject 不会无条件把普通提供值变成响应式;需要提供已观察对象等明确关联。退出和切换用户清理共享状态,SSR 每请求独立创建。