|
|
@@ -0,0 +1,50 @@
|
|
|
+import { customRef } from "vue";
|
|
|
+// 自定义响应性 Ref 函数
|
|
|
+// track(收集依赖) tigger(触发视图更新)
|
|
|
+
|
|
|
+
|
|
|
+// 封装防抖
|
|
|
+export function useDebounceRef<T>(value: T, delay: number) {
|
|
|
+ let timer: any = null;
|
|
|
+ return customRef((track, trigger) => {
|
|
|
+ return {
|
|
|
+ get() {
|
|
|
+ // 告诉Vue模版 当前组件模版依赖的数据
|
|
|
+ // Vue就会把当前渲染的函数存入该变量的依赖池
|
|
|
+ // 后续调用trigger时 Vue就会自动执行所有依赖变量的渲染原理 更新页面
|
|
|
+ track();
|
|
|
+ return value;
|
|
|
+ },
|
|
|
+ set(newVal: T) {
|
|
|
+ if (timer) clearTimeout(timer);
|
|
|
+ timer = setTimeout(function () {
|
|
|
+ // 将数据更新成最新的值
|
|
|
+ value = newVal;
|
|
|
+ trigger();
|
|
|
+ // 当值真正发生改变时所触发的依赖
|
|
|
+ }, delay)
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+// customRef((track, trigger) => {
|
|
|
+// return {
|
|
|
+// get() {
|
|
|
+// track();
|
|
|
+// 调用时机在get()里执行 当模版/计算属性读取你自定义的ref时 他就默认进入了get;
|
|
|
+// 当执行track,相当于告诉Vue,当前正在页面渲染这个数据,Vue此时会把当前渲染副作用函数放到该变量的依赖池中
|
|
|
+// return value;
|
|
|
+// },
|
|
|
+// set(newVal: T) {
|
|
|
+// value = newVal;
|
|
|
+// 调用时机:数据真正发生变化后 才会调用tigger
|
|
|
+// Vue会遍历所有收集的依赖,重新执行页面渲染 更新视图
|
|
|
+// trigger();
|
|
|
+// }
|
|
|
+// }
|
|
|
+// })
|
|
|
+
|
|
|
+// 流程
|
|
|
+// 模版读取 => get() => track() 收集依赖
|
|
|
+// ref.value = xx; => set() => 业务逻辑 => 更新数据 => trigger() => 视图更新
|