Vue customRef

customRef 是 Vue 3 中的一个高级响应式 API,用于创建自定义的响应式引用(ref),允许开发者对依赖追踪和更新触发过程进行细粒度控制。它通过一个工厂函数接收 tracktrigger 两个函数,返回一个包含 getset 方法的对象,从而实现灵活的响应式逻辑。‌

基本用法

customRef 的核心是自定义依赖管理:

  • 工厂函数 ‌:接收 track(用于收集依赖)和 trigger(用于触发更新)作为参数。
  • 返回对象 ‌:必须包含 get 方法(读取值时调用 track 收集依赖)和 set 方法(设置值时调用 trigger 触发更新)。‌

基础示例:

复制代码
const customRefValue = customRef((track, trigger) => {
  let value = 0;
  return {
    get: () => {
      track(); // 收集依赖
      return value;
    },
    set: (newValue) => {
      value = newValue;
      trigger(); // 触发更新
    }
  };
});
复制代码

主要应用场景

customRef 适用于需要精细控制响应式行为的场景:

  • 防抖/节流 ‌:在设置值后延迟触发更新,避免频繁响应。例如,实现输入防抖:

    复制代码
    function useDebouncedRef(value, delay) {
      let timer;
      return customRef((track, trigger) => ({
        get: () => {
          track();
          return value;
        },
        set: (newValue) => {
          clearTimeout(timer);
          timer = setTimeout(() => {
            value = newValue;
            trigger();
          }, delay);
        }
      }));
    }
  • 与外部状态集成 ‌:如本地存储(localStorage)同步:

    复制代码
    复制代码
    function useLocalStorage(key, initialValue) {
      return customRef((track, trigger) => ({
        get: () => {
          track();
          return localStorage.getItem(key) ?? initialValue;
        },
        set: (value) => {
          localStorage.setItem(key, value);
          trigger();
        }
      }));
    }
  • 性能优化‌:通过浅层响应式避免不必要的深层转换,适用于大型数据结构。‌

ref 的区别

  • ref 提供基础响应式包装,自动处理深层转换,适合常规场景。
  • customRef 允许手动控制依赖追踪和更新时机,更灵活但需谨慎使用,例如避免在 getter 中返回新对象导致不必要的重新渲染。‌

注意事项

  • 依赖管理 ‌:确保在 get 中调用 track,在 set 中调用 trigger,否则响应式失效。
  • 副作用处理 ‌:结合 effectScope 等 API 管理副作用生命周期,避免内存泄漏。‌

通过 customRef,开发者可以构建高度定制化的响应式逻辑,提升应用性能或实现复杂交互。

相关推荐
这儿有一堆花13 分钟前
深入解析 Video.js:现代 Web 视频播放的工程实践
前端·javascript·音视频
烤麻辣烫29 分钟前
JS基础
开发语言·前端·javascript·学习
IT_陈寒1 小时前
Vue的响应式把我坑惨了,原来问题出在这
前端·人工智能·后端
2603_953527991 小时前
WordPress Finale Lite 插件高危漏洞检测与利用工具 (CVE-2024-30485)
前端·python·安全·web3·xss
2601_949818091 小时前
头歌答案--爬虫实战
java·前端·爬虫
猫猫不是喵喵.2 小时前
layui表单项次大数据量导入并提交
前端·javascript·layui
张小潇2 小时前
AOSP15 WMS/AMS系统开发 - 窗口层级源码分析
android·前端
whuhewei3 小时前
HTTP1/2/3演变
前端·计算机网络
腹黑天蝎座3 小时前
从零实现一个前端监控系统:性能、错误与用户行为全方位监控
前端·监控
Hello--_--World3 小时前
ES13:类私有属性和方法、顶层 await、at() 方法、Object.hasOwnProperty()、类静态块 相关知识点
开发语言·javascript·es13