当前位置: 首页 > news >正文

`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,你可以控制何时进行依赖追踪,何时触发更新,以及如何处理数据的缓存和异步获取。这在需要精细控制响应式行为的场景中非常有用。

http://www.lryc.cn/news/573177.html

相关文章:

  • Duende Identity Server学习之一:认证服务器及一个Oidc/OAuth认证、用于Machine 2 Machine的客户端
  • 【C/C++】Gtest + GMock 简单使用示例
  • Android Studio 打 APK 包报错 Invalid keystore format 的解决方法
  • python web开发-Flask数据库集成
  • Solidity内部合约创建全解析:解锁Web3开发新姿势
  • 分布式锁 不同的拒绝策略 应用场景 业务上的思考
  • Docker简单介绍与使用以及下载对应镜像(项目前置)
  • AWS RDS/Aurora 开启 Database Insights 高级模式全攻略
  • C++11 std::thread 多线程编程详解
  • Python从入门到实战学习笔记(二)
  • 如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
  • PowerBI HtmlContent生成表格
  • Spring MVC异常处理机制
  • Java求职者面试指南:微服务技术与源码原理深度解析
  • 数据分析核心指标体系:从求和、计数到比较的全维度计算方法
  • 全面深入理解加法器架构:从全加器到并行前缀优化
  • 启动hardhat 项目,下载依赖的npm问题
  • GitHub Copilot快捷键
  • 【unitrix】 3.7 类型级加一计算(Add1.rs)
  • AI大模型学习之基础数学:微积分-AI大模型的数学引擎
  • Spring Boot的自动装配和自动配置
  • MySQL 数据库操作完整指南
  • ubuntu24.4 + ros2 jazzy 安装gazebo
  • vue3+arcgisAPI4案例:智慧林业资源监测分析平台(附源码下载)
  • C++ 的设计模式
  • 跟着AI学习C# Day29
  • 网站并发访问量达到1万以上需要注意哪些事项
  • 单点登录(SSO)系统
  • 海伯森3D闪测传感器,工业检测领域的高精度利器
  • JavaEE:使用JMeter进行接口并发测试