今天给大家带来的是Vue 2 中的实现 CustomRef 方式防抖/节流
这篇文章,前几天利用 customRef
实现了在 vue 3 中的极致防抖/节流的新方式。感兴趣的朋友可以点击 👉 Vue 3 中的极致防抖/节流(含常见方式防抖/节流) 进行查看。
前言
在前端的开发过程中,在涉及到与用户交互的过程中是基本上都是需要处理的,常规操作就是在对应位置加上防抖或者节流。
加上防抖或者节流的作用:一是为了防止用户频繁操作;二是为了节约一定的服务器资源,减少资源浪费的情况。
背景
之所以写这篇文章是因为啥呢?我写完Vue 3 中的极致防抖/节流(含常见方式防抖/节流) 这篇文章后,突然萌发的一个问题,心想既然 vue 3
可以通过 customRef
实现,那 vue 2
是不是也可以这样进行照葫芦画瓢呢?然后我就想了一下,是可以的,然后加上今晚上有空,我就写了一下,虽然没 vue 3
自带的那么好,但还是很好用的。所以特此来分享一下。
有人说 vue 2
没 ref
和 customRef
啊?
诶,别忘了有 proxy
和 Object.defineProperty
呀。
我这里实现的方式就采用的是 proxy
, 然后实现后的效果和 customRef
差不多,只是在 template
模板中会带个 value
不能去掉。
开始吧!
撸代码
我这里直接放代码,每行代码我都加了注释的,方便阅读,当然朋友你有疑问或者说没看懂的地方可以评论 + 私信。
防抖(debounce)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
function debounceRef (data, delay = 300) { let timer = null const value = {value: data} const proxy = new Proxy(value, { get(target, property) { return target[property] }, set(target, property, newValue, receiver) { if(timer != null){ clearTimeout(timer) timer = null } timer = setTimeout(() => { target[property] = newValue }, delay) return true; } }) return delay === null ?value : proxy }
|
使用
1 2 3 4 5 6 7 8 9
| import debounceRef from "./utils/debounceRef.js"
data () { return { count: debounceRef(0, 300) } }
|
在页面中使用:
1 2 3 4 5
| // span <span>{{ count.value }}</span>
// v-model <input type="text" v-model="count.value">
|
在函数中使用:
1 2 3 4
| addCount () { this.count.value += 1 }
|
节流(throttle)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
function throttleRef (data, delay = 300) { let timer = null const value = {value: data} const proxy = new Proxy(value, { get(target, property) { return target[property] }, set(target, property, newValue, receiver) { if(timer === null){ timer = setTimeout(() => { target[property] = newValue clearTimeout(timer) timer = null }, delay) } return true; } }) return delay === null ?value : proxy }
|
使用
1 2 3 4 5 6 7 8 9
| import throttleRef from "./utils/throttleRef.js"
data () { return { count: throttleRef(0, 300) } }
|
在页面中使用:
1 2 3 4 5
| // span <span>{{ count.value }}</span>
// v-model <input type="text" v-model="count.value">
|
在函数中使用:
1 2 3 4
| addCount () { this.count.value += 1 }
|
总结
以上就是Vue 2 中的实现 CustomRef 方式防抖/节流
这篇文章的全部内容。受Vue 3 中的极致防抖/节流(含常见方式防抖/节流)中利用 customRef
的启发。
希望本篇文章对朋友你在使用 vue 2
的过程中有所帮助。若篇中有不足之处或你有不一样的想法或见解,欢迎在评论区留言 + 关注。
我是桃小瑞,公众号 @ 桃小瑞。