vue状态竞争本质是多异步操作争改同一数据导致结果错乱,需用watcheffect+oninvalidate拦截过期请求、storetorefs保响应式、热点字段走缓冲层、action只负责发请求并返回promise。

Vue 状态管理中的状态竞争条件,本质是多个异步操作或响应式更新“抢着改同一份数据”,导致最终状态与预期不符——比如后发请求先返回、覆盖了更晚发出但更早触发的更新。这不是 Vue 特有,而是前端并发场景下的共性问题,关键在于切断竞态链路、明确更新时序。
用 watchEffect + onInvalidate 拦截过期副作用
当响应式依赖频繁变化(如搜索关键词、分页参数),且每次变化都触发异步请求时,极易出现“后请求先完成、覆盖前请求结果”的竞态。watchEffect 默认不提供取消机制,必须显式使用 onInvalidate 标记并拦截已失效的执行:
- 在 watchEffect 回调中接收
onInvalidate参数 - 在发起异步操作前,设置一个标志位(如
let canceled = false) - 调用
onInvalidate(() => { canceled = true }),确保旧任务被标记为失效 - await 后检查
canceled,为 true 则直接 return,不写入结果
Store 层避免直接解构,用 storeToRefs 保响应式
Pinia 或组合式 Store 中,若在组件 setup 里直接解构 store 的属性(如 const { count } = useCounterStore()),count 会变成普通数字,失去响应性——后续 store 更新不会触发视图刷新,看似“没竞争”,实则是视图彻底失联,掩盖了真实状态流。正确做法是:
vue-composition-api-best-practices
Vue 3 组合式 API 与
热门下载
相关下载
精品课程
相关推荐
/
热门推荐
/
最新课程
最新文章
