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,开发者可以构建高度定制化的响应式逻辑,提升应用性能或实现复杂交互。

相关推荐
八角丶16 分钟前
Node 网络编程 —— TLS 模块
javascript·后端·node.js
倔强的石头10619 分钟前
【Linux指南】动静态库系列(七):符号表与重定位:链接器如何把函数调用接起来
linux·前端·javascript
图扑软件1 小时前
中篇・运笔|统一 DataModel 底座,HT UI 组件万物同源
javascript·低代码·ui·性能优化·数据可视化
a1117761 小时前
3D 脑图谱 / Bilingual 3D Brain Atlas 项目
前端
T1mzhou2 小时前
ARM64 Linux 6.10内核启动流程2-rootfs 怎么挂上
linux·服务器·前端
小小尚@2 小时前
WebGIS/ECharts 地图开发|MapLand 在线行政区划边界一键下载 GeoJSON 工具
前端·javascript·echarts
葡萄城技术团队2 小时前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
默_笙3 小时前
🚍 一条 Todo 的奇幻漂流:TypeScript 全栈类型安全的"护照检查"
前端·javascript
计算机魔术师4 小时前
NVIDIA 以 129.3 亿美元收购 Hugging Face
前端
平头哥技术团队4 小时前
Day 01 | 用 HTML 写第一个网页:双击就能在浏览器打开
前端