customref 是 vue 提供的高级响应式 api,用于自定义 ref 的 getter 和 setter 行为;它通过缓存值与防抖定时器配合,实现输入停止后才更新视图,避免频繁响应。

customRef 是什么,为什么用它做防抖
Vue 的 customRef 是一个高级响应式 API,允许你完全控制 ref 的 getter 和 setter 行为。它不直接存储值,而是让你定义「什么时候触发更新」和「怎么读写数据」——这正好适合实现输入防抖:我们想让视图只在用户停止输入一段时间后才更新,而不是每次按键都响应。
手写防抖 customRef 的核心逻辑
关键在于:setter 中不立即赋值,而是启动防抖定时器;getter 中返回当前缓存的值(不是原始输入值)。需要两个变量配合:内部缓存值(真正参与响应式的值)和待提交的输入值(用户实时打的字)。
- 用 ref 存内部缓存值(供模板响应式读取)
- 用普通变量存最新输入(避免闭包问题,也方便 clearTimeout)
- 每次 set 触发时清除旧定时器、设置新定时器,时间到再把输入值同步给缓存 ref
- get 始终返回缓存 ref 的值,保证视图只看到“防抖后的结果”
完整可运行代码示例
下面是一个封装好的 useDebouncedRef Hook:

