Vue 2 中的实现 CustomRef 方式防抖/节流

更新日期: 2023-02-27阅读: 1k标签: 节流

今天给大家带来的是vue 2 中的实现 CustomRef 方式防抖/节流这篇文章,前几天利用 customRef 实现了在 vue 3 中的极致防抖/节流的新方式。

前言

前端的开发过程中,在涉及到与用户交互的过程中是基本上都是需要处理的,常规操作就是在对应位置加上防抖或者节流。

加上防抖或者节流的作用:一是为了防止用户频繁操作;二是为了节约一定的服务器资源,减少资源浪费的情况。

背景

之所以写这篇文章是因为啥呢?我写完Vue 3 中的极致防抖/节流(含常见方式防抖/节流) 这篇文章后,突然萌发的一个问题,心想既然 vue 3 可以通过 customRef 实现,那 vue 2 是不是也可以这样进行照葫芦画瓢呢?然后我就想了一下,是可以的,然后加上今晚上有空,我就写了一下,虽然没 vue 3 自带的那么好,但还是很好用的。所以特此来分享一下。

有人说 vue 2 没 ref 和 customRef 啊?

诶,别忘了有 proxy 和 Object.defineProperty 呀。

我这里实现的方式就采用的是 proxy, 然后实现后的效果和 customRef 差不多,只是在 template 模板中会带个 value 不能去掉。

开始吧!

代码

我这里直接放代码,每行代码我都加了注释的,方便阅读,当然朋友你有疑问或者说没看懂的地方可以评论 + 私信。

防抖(debounce)

代码

// 声明
// data 为数据
// delay 为时间。delay = null 则直接不使用 防抖 方案
function debounceRef (data, delay = 300) {
// 定时器
let timer = null
// 数据
const value = {value: data}
// 创建 proxy 实例
const proxy = new Proxy(value, {
get(target, property) {
// 返回当前值
return target[property]
},
// set 参数说明
// target:目标, property:属性, newValue 值, receiver:接收者
set(target, property, newValue, receiver) {
// 定时器判断,如果存在则清除当前定时器
if(timer != null){
// 清除定时器
clearTimeout(timer)
// 将 timer 恢复默认值
timer = null
}
// 赋值并创建定时器
timer = setTimeout(() => {
// 修改值
target[property] = newValue
}, delay)
// 让 set 一直返回 true
// 不返回 true,则会报下列错误: 'set' on proxy: trap returned falsish for property 'value'
return true;
}
})
// 判断 delay === null,等于则返回未代理的对象,反之
return delay === null ?value : proxy
}

使用

// 引入
import debounceRef from "./utils/debounceRef.js"

// 创建
data () {
return {
count: debounceRef(0, 300)
}
}

在页面中使用:

// span
<span>{{ count.value }}</span>

// v-model
<input type="text" v-model="count.value">

函数中使用:

// 函数
addCount () {
this.count.value += 1
}

节流(throttle)

代码

// 声明
// data 为数据
// delay 为时间。delay = null 则直接不使用 节流 方案
function throttleRef (data, delay = 300) {
// 定时器
let timer = null
// 数据
const value = {value: data}
// 创建 proxy 实例
const proxy = new Proxy(value, {
get(target, property) {
// 返回当前值
return target[property]
},
// set 参数说明
// target:目标, property:属性, newValue 值, receiver:接收者
set(target, property, newValue, receiver) {
// 定时器判断
if(timer === null){
// 赋值并创建定时器
timer = setTimeout(() => {
// 修改值
target[property] = newValue
// 清除定时器
clearTimeout(timer)
// 将 timer 恢复默认值
timer = null
}, delay)
}
// 让 set 一直返回 true
// 不返回 true,则会报下列错误: 'set' on proxy: trap returned falsish for property 'value'
return true;
}
})
// 判断 delay === null,等于则返回未代理的对象,反之
return delay === null ?value : proxy
}

使用

// 引入
import throttleRef from "./utils/throttleRef.js"

// 创建
data () {
return {
count: throttleRef(0, 300)
}
}

在页面中使用:

// span
<span>{{ count.value }}</span>

// v-model
<input type="text" v-model="count.value">

在函数中使用:

// 函数
addCount () {
this.count.value += 1
}

总结

以上就是Vue 2 中的实现 CustomRef 方式防抖/节流这篇文章的全部内容。受Vue 3 中的极致防抖/节流(含常见方式防抖/节流)中利用 customRef的启发。

以上文章来自公众号:桃小瑞

链接: https://fly63.com/article/detial/12390

React 涉及e.target时候,使用debounce节流函数

在一个input搜索框中输入文本,如果2s内可能会有很多次input的onChange事件,每次都触发一个API请求,明显不合理,所以此时需要debounce节流函数,2s之内的所有输入只会请求一次API

前端防抖和节流

窗口的resize、scroll、输入框内容校验等操作时,如果这些操作处理函数是较为复杂或页面频繁重渲染等操作时,在这种情况下如果事件触发的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕

防抖与节流常见的几种实现方式

在限制的时间内持续触发事件的时候,函数是完全不执行的,非立即执行版,等最后一次触发结束的一段时间之后,再去执行,节流的意思是让函数有节制地执行

vue全局防抖和节流

一种是立即执行:频繁触发事件,第一次触发时执行函数,后面触发不会执行,停止触发,间隔一定时间之后再触发事件,函数才会再次执行

函数防抖和节流

函数防抖和节流都是对高频动作触发回调函数的一个优化,实现方式上有类似之处。先从使用场景做个区分。

JS 节流函数(throttle)与防抖函数(debounce)

节流:在一定时间内连续触发某事件,在这段时间段内只执行首次触发的那一次。1s内执行第一次,防抖:在一定时间内连续触发某事件,在这段时间内只执行最后一次触发的那一次。最后一次延时1s后执行

节流与防抖

概念:在规定的间隔时间范围内不会重复触发回调,只有大于这个时间间隔才会触发回调,把频繁触发变为少量触发。类似于技能CD。应用:点击按钮,轮播图点击左右箭头。

利用Css实现按钮节流

节流是指避免过于频繁地执行某个功能,例如保存按钮。 为了避免重复提交或者服务器的考虑,往往需要限制点击行为,否则接口会被频繁请求。 之前基本都是通过js控制节流问题

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!