watcheffect 可自动追踪 searchkey 等响应式值变化并触发联想请求,配合防抖、loading 状态、空值处理、请求取消和缓存实现完整搜索体验。

用 watchEffect 实现搜索关键词联想,核心是让它自动追踪关键词变化,并在变化后触发请求逻辑——它不关心“谁变了”,只关注“哪些响应式值被读了”。只要你在回调里访问了 searchKey.value,它就会自动监听。
自动收集依赖,不用手动列监听项
比如你有多个筛选条件:searchKey、category、region,传统 watch 得写数组或多个监听器。而 watchEffect 一行搞定:
- 直接在回调中读取它们:
fetchSuggestions({ q: searchKey.value, cat: category.value, reg: region.value }) - 任意一个值更新,函数就重跑,无需声明依赖源
- 代码更简洁,增减字段也不用同步改监听列表
加防抖控制请求节奏
用户快速输入时,不能每按一次键都发请求。要在 watchEffect 内部手动加防抖:
- 定义一个定时器变量:
let timer - 利用
onInvalidate清除上一次未执行的定时器 - 只在停顿 300ms 后才真正调用接口
- 示例:
onInvalidate(() => clearTimeout(timer)); timer = setTimeout(() => fetch(), 300)
配合 loading 和空状态做体验闭环
联想结果不是立刻返回,需要明确的状态反馈:
- 请求开始前设
loading.value = true,显示加载动画或骨架屏 - 请求完成后更新
suggestions.value,并设loading.value = false - 若
searchKey.value.trim() === ''或长度小于 2,直接清空建议列表,不发请求 - 后端返回空数组时,前端可显示“暂无匹配建议”提示
避免过期响应和重复请求
用户输“ab”→删掉→输“abc”,旧请求返回“ab”的结果不该覆盖新结果:
- 每次请求配一个唯一标识(如时间戳或 AbortController)
- 在
onInvalidate中调用controller.abort()取消上一个请求 - 请求成功后先判断是否已被取消:
if (signal.aborted) return - 缓存已查过的关键词结果,用
Map存key → suggestions,减少无效请求
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










