CustomRef 实现简单的防抖和节流

本文档介绍了如何利用Vue.js中的CustomRef自定义实现防抖和节流功能。概念部分阐述了JS防抖和节流的基本原理,并推荐了一篇详细解释的文章。接着,通过代码展示了CustomRef如何用于创建具备跟踪依赖和更新触发机制的防抖和节流功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方阐述了怎么使用 customRef 自定义一个 ref 实现防抖,但是没有节流的代码,所以自己写了一个,区别不是很大。

概念

浅谈 JS 防抖和节流 可以看这篇文档了解什么是防抖和节流,讲的非常清晰,这里我就贴一下

CustomRef 用来自定义 ref ,它可以很好地跟踪依赖项和触发更新。它需要一个工厂函数,该函数接收 tracktrigger 作为参数,这两个都是函数,就像 resolvereject ,并且应该返回一个带有 getset 的对象。

代码实现
  • 防抖
<template>
  <div class="container">
    <label for="text">输入值: </label>
    <input id="text" v-model="text" class="text" />
    <div class="showText">{{ text }}</div>
  </div>
</template>
<script setup>
import { ref, customRef } from 'vue'
// const text = ref('')
// const text = useDebouncedRef('', 500)
const text = useThrottleRef('', 50)

// customRef, 传入一个工厂函数,track ,trigger 
// 返回一个对象, get, set

// 防抖
function useDebouncedRef(value, delay = 200) {
  let t = null
  return customRef((track ,tirgger) => {
    return {
      get() {
        track()
        return value
      },
      set(newVal) {
        clearTimeout(t)
        t = setTimeout(() => {
          value = newVal
          tirgger() // 告诉更新
        }, delay)
      }
    }
  })
}
</script>

<style>
.container {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  height: 400px;
}
.text {
  width: 40%;
  height: 20px;
}
.container .showText {
  font-size: 32px;
  margin: 20px;
  color: rgb(240, 88, 28);
}
</style>
  • 节流
// 节流
function useThrottleRef(value, delay = 200) {
  let canRun = true
  return customRef((track, trigger) => {
    return {
      get() {
        track()
        return value
      },
      set(newVal) {
        if(!canRun) return
        canRun = false
        setTimeout(() => {
          value = newVal
          canRun = true
          trigger()
        }, delay)
      }
    }
  })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值