`customRef` 在实战中的使用:防抖、计算属性缓存和异步数据获取
🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
文章目录
- 使用场景
- 示例
- 防抖
- 计算属性的缓存
- 异步数据获取
- 总结
在 Vue3 中,customRef
允许你创建自定义的响应式引用,这为你提供了对依赖追踪和触发更新的完全控制。
使用场景
- 防抖和节流:在处理输入框等频繁触发的事件时,可以使用
customRef
实现防抖或节流,以减少不必要的更新。 - 计算属性的缓存:可以使用
customRef
来实现自定义的计算属性,这些属性只在相关依赖发生变化时重新计算。 - 异步数据获取:在需要根据异步数据创建响应式引用时,
customRef
可以帮助管理数据的响应性。
示例
防抖
import { customRef } from 'vue';function useDebouncedRef(value, delay) {
let timeout;
return customRef((track, trigger) => {
return {
get() {
track();
return value;
},
set(newValue) {
clearTimeout(timeout);
timeout = setTimeout(() => {
value = newValue;
trigger();
}, delay);
}
};
});// 使用
const debouncedInput = useDebouncedRef('', 500);
计算属性的缓存
import { customRef, watchEffect } from 'vue';function useComputedRef(getter) {
let value;
let dirty = true;
return customRef((track, trigger) => {
watchEffect(() => {
if (dirty) {
value = getter();
dirty = false;
}
track();
});
return {
get() {
if (dirty) {
value = getter();
dirty = false;
}
return value;
},
set(newValue) {
value = newValue;
dirty = true;
trigger();
}
};
});// 使用
const count = ref(0);
const doubled = useComputedRef(() => count.value * 2);
异步数据获取
import { customRef } from 'vue';function useAsyncRef(asyncFn) {
let value;
let loading = true;
asyncFn().then(result => {
value = result;
loading = false;
}).catch(error => {
console.error(error);
loading = false;
});
return customRef((track, trigger) => {
return {
get() {
track();
return value;
},
set(newValue) {
value = newValue;
trigger();
}
};
});// 使用
const asyncData = useAsyncRef(fetchSomeData);
总结
customRef
提供了一种创建自定义响应式引用的方式,它允许开发者实现更复杂的数据响应逻辑。通过 customRef
,你可以控制何时进行依赖追踪,何时触发更新,以及如何处理数据的缓存和异步获取。这在需要精细控制响应式行为的场景中非常有用。