watcheffect 通过自动追踪响应式数据变化实现推荐逻辑的实时更新:监听用户画像、行为等状态,触发候选池筛选与加权排序,并利用 oninvalidate 清理异步请求,最终将结果暴露为 ref 供模板消费。

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










