iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >深入浅析Vue3中的极致防抖/节流
  • 574
分享到

深入浅析Vue3中的极致防抖/节流

JavaScript前端Vue.js 2023-05-14 22:05:56 574人浏览 泡泡鱼
摘要

本篇文章给大家带来的是Vue 3 中的极致防抖/节流(含常见方式防抖/节流)这篇文章,文章中不仅会讲述原来使用的防抖或节流方式,还会带来新的一种封装方式,使用起来更简单、更清晰。在前端的开发过程中,在涉及到与用户交互的过程中是基本上都是需要

本篇文章给大家带来的是Vue 3 中的极致防抖/节流(含常见方式防抖/节流)这篇文章,文章中不仅会讲述原来使用的防抖或节流方式,还会带来新的一种封装方式,使用起来更简单、更清晰。

深入浅析Vue3中的极致防抖/节流

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

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

防抖或节流原理


防抖(debounce)

如果用户多次频繁操作以最后一次为准,当然也可以以第一次为准,进行数据更新或者网络资源请求,以消除冗余的操作,或者减少一定的请求资源浪费。【相关推荐:vuejs视频教程WEB前端开发

示例代码

function debounce (fn, delay = 300){
    let timer = null
    return function (...args) {
        clearTimeout(timer)
        timer = setTimeout(()=>{
            fn.call(this, ...args)
        }, delay);
    }
}

使用

debounce(()=> count += 1, 1000)

节流(throttle )

在一定时间范围内,用户触发多次只会执行一次以达到防止用户频繁操作的目的。

示例代码

let timer = null
function throttle (fn, delay = 300) {
    if(timer == null){
        timer = setTimeout(() => {
            fn()

            clearTimeout(timer)
            timer = null
        }, delay);
    }
}

使用

throttle(()=> count += 1, 1000)

环境说明


  • vue 3

  • vite

新封装


这里我分两个模块来讲述。一个是防抖;另一个是节流。

虽然这两个差别不是很大,但还是有区别的。上车,兄弟们。

防抖(debounce)

先看常见封装内容。

常见封装-1

代码

function debounce (fn, delay = 300){
    let timer = null
    return function (...args) {
        if(timer != null){
            clearTimeout(timer)
            timer = null
        }
        timer = setTimeout(()=>{
            fn.call(this, ...args)
        }, delay);
    }
}

使用

const addCount = debounce(()=> count.value += 1, 1000)

常见封装-2

代码

let timer = null
function debounce (fn, delay = 1000){
    if(timer != null){
        clearTimeout(timer)
        timer = null
    }
    timer = setTimeout(fn, delay)
}

使用

const addCount = () => debounce(()=> count.value += 1, 1000)

新封装

这里我们需要借助 vue 3 中的 customRef 来实现我们的新方式。这里我就不具体写了。我直接在每行代码上面添加注释。我相信朋友你是能看懂的。

代码

// 从 vue 中引入 customRef 和 ref
import { customRef, ref } from "vue"

// data 为创建时的数据
// delay 为防抖时间
function debounceRef (data, delay = 300){
    // 创建定时器
    let timer = null;
    // 对 delay 进行判断,如果传递的是 null 则不需要使用 防抖方案,直接返回使用 ref 创建的。
    return delay == null 
        ? 
        // 返回 ref 创建的
        ref(data)
        : 
        // customRef 中会返回两个函数参数。一个是:track 在获取数据时收集依赖的;一个是:trigger 在修改数据时进行通知派发更新的。
        customRef((track, trigger) => {
            return {
                get () {
                    // 收集依赖
                    track()
                    // 返回当前数据的值
                    return data
                },
                set (value) {
                    // 清除定时器
                    if(timer != null){
                        clearTimeout(timer)
                        timer = null
                    }
                    // 创建定时器
                    timer = setTimeout(() => {
                        // 修改数据
                        data = value;
                        // 派发更新
                        trigger()
                    }, delay)
                }
            }
        })
}

使用

// 创建
const count = debounceRef(0, 300)

// 函数中使用
const addCount = () => {
  count.value += 1
}

// v-model 中使用
<input type="text" v-model="count">

节流(throttle)

我们还是一样,先看常见封装内容。

常见封装-1

代码

let timer = null
function throttle (fn, delay = 300) {
    if(timer == null){
        timer = setTimeout(() => {
            fn()

            clearTimeout(timer)
            timer = null
        }, delay);
    }
}

使用

const addCount = () => throttle(()=> count.value += 1, 1000)

常见封装-2

代码

function throttle (fn, delay = 300) {
    let timer = null
    return function (...args) {
        if(timer == null){
            timer = setTimeout(() => {
                fn.call(this, ...args)
    
                clearTimeout(timer)
                timer = null
            }, delay);
        }
    }
}

使用

const addCount = throttle(()=> count.value += 1, 1000)

新封装

节流和防抖在封装和使用上大同小异。

代码

// data 为创建时的数据
// delay 为节流时间
function throttleRef (data, delay = 300){
    // 创建定时器
    let timer = null;
    // 对 delay 进行判断,如果传递的是 null 则不需要使用 节流方案,直接返回使用 ref 创建的。
    return delay == null 
        ? 
        // 返回 ref 创建的
        ref(data)
        : 
        // customRef 中会返回两个函数参数。一个是:track 在获取数据时收集依赖的;一个是:trigger 在修改数据时进行通知派发更新的。
        customRef((track, trigger) => {
            return {
                get () {
                    // 收集依赖
                    track()
                    // 返回当前数据的值
                    return data
                },
                set (value) {
                    // 判断
                    if(timer == null){
                        // 创建定时器
                        timer = setTimeout(() => {
                            // 修改数据
                            data = value;
                            // 派发更新
                            trigger()
                            // 清除定时器
                            clearTimeout(timer)
                            timer = null
                        }, delay)
                    }
                    
                }
            }
        })
}

使用

// 创建
const count = debounceRef(0, 300)

// 函数中使用
const addCount = () => {
  count.value += 1
}

// v-model 中使用
<input type="text" v-model="count">

总结


以上便是Vue 3 中的极致防抖/节流(含常见方式防抖/节流)这篇文章的全部内容,如有不足或朋友你有更好的方式或者其他独到的见解,欢迎评论 + 私信。

当然朋友你又学到了一招可以点赞 + 关注 + 评论哦。

希望本篇文章对正在阅读的朋友你有所帮助。

想了解vue 2中如何实现相同方案的朋友可以点击这里 ? Vue 2 中的实现 CustomRef 方式防抖/节流

学习视频分享:vuejs入门教程、编程基础视频)

以上就是深入浅析vue3中的极致防抖/节流的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 深入浅析Vue3中的极致防抖/节流

本文链接: https://www.lsjlt.com/news/207012.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 小程序速报[No.90] | 小程序最新资讯,错过还要等2周
    ⭐本期内容速览:1、平台支付手续费调整通知2、关于canvas v2 保存图片的实现3、小程序变现锦囊:交易解决方案上线,新能力助力好生意4、交易类目限制订单金额及账期调整通知5、助力留资转化率,留资组件内测开启6、官方小程序上线,提升经营...
    99+
    2024-05-14
    头条 抖音 小程序 更新
  • 代码级质量技术之基本框架介绍
    一、背景代码级质量技术:顾名思义为了服务质量更好,涉及到代码层面的相关技术,特别要指出的是,代码级质量技术不单纯指代码召回技术,如静态代码扫描、单元测试等。研究代码级质量技术主要有以下几个方面的原因:1、随着精准测试等概念的兴起,对代码覆盖...
    99+
    2024-05-14
    代码级质量 框架
  • jquery清除同级div
    随着Web应用不断复杂,JavaScript框架变得越来越重要。其中最受欢迎的框架之一是jQuery,jQuery是一个流行的JavaScript库,它可以使处理文档元素、处理事件和创建特效更加容易。在这篇文章中,我们将学习如何使用jQue...
    99+
    2024-05-14
  • jquery 查询筛选
    JQuery是一款非常优秀的JavaScript库,提供了许多便捷的方法使得前端开发变得更加快捷高效。在JQuery中,查询筛选是其最常用的功能之一,本文将详细介绍JQuery查询筛选的相关部分。一、概述JQuery的查询筛选机制是其最重要...
    99+
    2024-05-14
  • jquery 图片无法显示
    在网页开发过程中,经常会用到图片来丰富页面内容,但有时会出现图片无法显示的情况,这个问题通常与文件路径或文件名有关。本文将介绍使用 jQuery 快速解决图片无法显示的问题。一、确认图片文件路径最常见的原因是图片文件路径错误或者图片文件不存...
    99+
    2024-05-14
  • jquery移除只读
    在使用HTML表单时,经常需要将一些输入框设置为只读状态,以防止用户对这些信息进行修改。但有时候需要在特定情况下,将这些输入框的只读属性移除,以便用户可以进行修改或编辑。这时候就需要使用jQuery来移除只读属性。jQuery是一种Java...
    99+
    2024-05-14
  • vue选择地址怎么做
    Vue是一种流行的JavaScript框架,用于构建交互式Web应用程序。在许多Web应用程序中,选择地址是常见的功能需求。本文将介绍如何使用Vue实现选择地址,包括如何使用第三方库和如何自定义Vue组件。一、使用第三方库一个常见的选择地址...
    99+
    2024-05-14
  • VUe双中括号属性如何使用
    Vue是一种流行的JavaScript框架,它使用双花括号(“{{”和“}}”)语法来实现属性与视图之间的数据绑定。VUe框架中的模板显示了被框架监控的变量的特定属性,当这些变量的值改变时,这些属性也跟随改变,从而在视图中自动更新相应的值。...
    99+
    2024-05-14
  • vue refs 方法参数
    随着前端技术的不断发展,Vue框架毫无疑问成为了前端框架中最受欢迎的一种。Vue组件的复杂性也越来越高,因此,Vue框架提供了许多API来使得开发更加灵活和高效。其中之一就是refs方法。refs 方法用于在Vue中访问组件的实例或元素。这...
    99+
    2024-05-14
  • vue.js函数求和
    Vue.js是一个流行的JavaScript框架,它使得前端开发变得更容易和更快速。在Vue.js中,我们可以通过函数来实现对数据的操作,并实现一些加减乘除等简单的数学计算。本文将介绍如何使用Vue.js实现一个函数求和功能。首先,我们需要...
    99+
    2024-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作