watchEffect 通过自动追踪响应式数据变化实现推荐逻辑的实时更新:监听用户画像、行为等状态,触发候选池筛选与加权排序,并利用 onInvalidate 清理异步请求,最终将结果暴露为 ref 供模板消费。
watchEffect 本身不会直接“实现推荐”,它的作用是帮助你响应式数据一旦变化,推荐更新逻辑便会由自动追踪机制启动。其价值体现在推荐结果会随用户画像、行为、偏好等响应式状态的改变而立刻重算;大量 ref 或 computed 无须逐个手动监听,响应因此更及时,代码也更简洁。
用户动态特征的监听交由 watchEffect
将响应式对象或 ref 用于承载 userPreferences、recentSearches、activeCategory 等用户关键属性,再在 setup 中使用 watchEffect 包裹推荐函数调用:
- 只要相关值有更新,watchEffect 便会自动重跑;这些更新来自用户输入搜索词、点击偏好按钮或切换标签页等操作
- 一个 effect 可以集中聚合多个依赖,从而避免编写多个 watch 以及重复的防抖/节流逻辑
- 无限循环可能由此产生:在 effect 内部修改其监听的响应式变量,因此不要这样操作
推荐候选集先交给 computed 缓存,排序与截取再由 watchEffect 触发
推荐一般分成两步:首先筛选候选池,例如找出所有符合偏好的商品;然后依据热度、时效、协同分数等实时信号排序。候选池可以交由 computed 缓存,之后利用 watchEffect 结合用户上下文完成轻量级重排序:
- 未排序的候选数组由 computed 返回,以便高效复用;它的来源是原始数据 + 用户偏好
- 候选数组的本地加权排序、去重、限流由 watchEffect 执行,其监听信号包括 userLocation、currentTime、isWeekend 等
- 这种安排既通过 computed 避免频繁重算来保障性能,也凭借快速响应的排序逻辑维持实时性
竞态处理与副作用清理由 onInvalidate 配合完成
。查用户相似画像、拉实时热度等异步请求若为推荐所需,可使用 watchEffect 的 onInvalidate 妥善取消上一项尚未完成的任务:
- onInvalidate 适合取消 debounce、abort fetch 请求和清除定时器,因为它会在每次新 effect 开始执行前先行调用
- 例如:搜索词被用户快速输入时,前一个请求可能尚未返回;此时由新 effect 启动并 abort 旧请求,就不会让旧结果覆盖新结果
- 如果缺少清理,UI 很容易展示“过期推荐”,在网络波动或高频交互环境中尤其明显
将推荐结果以 ref 暴露,供模板或子组件使用
先将最终推荐列表设为 ref([]),赋值操作放进 watchEffect。完成后,子组件可通过 v-model 或 props 接收,模板也可直接使用 v-for 渲染:
- 推荐数据无需借助 provide/inject 或事件总线传递,整个响应式链条会更加清楚
- 骨架屏可由 loading 状态控制;推荐逻辑较重时,将该状态加入 watchEffect 内
- 搭配 watchEffect(() => {}, { flush: 'post' }) 可确保 DOM 更新后才执行(比如要基于元素尺寸做个性化卡片布局)