【愚公系列】《循序渐进Vue.js 3.x前端开发实践》012-Vue 组件的属性和方法:进行函数限流

举报
愚公搬代码 发表于 2025/02/28 23:14:15 2025/02/28
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。博客内容.NET、...
标题 详情
作者简介 愚公搬代码
头衔 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
博客内容 .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎 👍点赞、✍评论、⭐收藏

🚀前言

在现代Web开发中,性能优化是一个不可忽视的话题,尤其是在使用 Vue.js 构建复杂应用时,如何有效管理事件和数据更新显得尤为重要。函数限流(throttling)作为一种常见的性能优化手段,可以帮助我们控制函数的调用频率,从而提升应用的响应速度和用户体验。

本文将深入探讨如何在 Vue 组件中实现函数限流。我们将首先了解函数限流的基本概念及其重要性,然后通过具体示例演示如何在 Vue 组件中应用限流技术,以应对高频率触发的事件,如滚动、输入和窗口大小调整等。无论你是 Vue 新手还是有一定开发经验的程序员,这篇文章都将为你提供实用的技巧与思路,助你打造更加流畅和高效的用户界面。让我们一起揭开函数限流的神秘面纱,提升我们的 Vue 应用性能吧!

🚀一、进行函数限流

在工程开发中,限流是一个非常重要的概念。我们在实际开发中,经常会遇到需要进行限流的场景,例如网页上的某个按钮,当用户单击后,会从后端服务器进行数据的请求,在数据请求回来之前,用户额外的单击是无效且消耗性能的。或者,网页中某个按钮会导致页面的更新,我们需要限制用户对其频繁地进行操作。这时就可以使用限流函数,常见的限流方案是根据时间间隔进行限流,即在指定的时间间隔内不允许重复执行同一函数。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>限流函数</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script src="https://unpkg.com/lodash@4.17.20/lodash.min.js"></script>
</head>
<body>
    <div id="Application">
        <button @click="click">按钮</button>
        <button @click="throttleClick">限流按钮</button>
        <button @click="debounceClick">防抖按钮</button>
    </div>
    <script>
        const {createApp, ref} = Vue
        var throttle = false
        function throttleTool(callback, timeout) {
            if (!throttle) {
                callback()
            } else {
                return
            }
            throttle = true
            setTimeout(() => {
                throttle = false
            }, timeout)
        }
        const config = {
            setup() {
                // 控制按钮是否可触发的变量
                const throttle = ref(false)
                const click = () => {
                    throttleTool(()=>{
                        console.log(Date())
                    }, 2000)
                }
                const throttleClick = _.throttle(function(){
                    console.log(Date())
                }, 2000)
                const debounceClick = _.debounce(function(){
                    console.log(Date())
                }, 2000)
                return {throttle, click, throttleClick, debounceClick}
            }
        }
        createApp(config).mount("#Application") 
    </script>
</body>
</html>

该代码展示了三种不同的按钮点击处理方式,分别是无限流手动实现的限流使用Lodash库的限流和防抖。在分析过程中,我们将分别探讨每种限流实现方式的逻辑和作用。

🔎1.代码解析

  1. HTML和库引用部分

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script src="https://unpkg.com/lodash@4.17.20/lodash.min.js"></script>
    

    页面使用Vue 3进行构建,并引入了Lodash库(v4.17.20),后者提供了throttledebounce方法,用于简化限流和防抖操作。

  2. 三个按钮功能

    <button @click="click">按钮</button>
    <button @click="throttleClick">限流按钮</button>
    <button @click="debounceClick">防抖按钮</button>
    
    • 按钮:普通点击事件,没有限流。
    • 限流按钮:使用Lodash的throttle进行限流处理。
    • 防抖按钮:使用Lodash的debounce进行防抖处理。

🔎2.限流实现角度解析

🦋2.1 手动实现限流

throttleTool函数中,通过手动设置一个节流锁来实现限流操作:

var throttle = false;
function throttleTool(callback, timeout) {
    if (!throttle) {
        callback();  // 调用函数
    } else {
        return;  // 如果锁定,退出
    }
    throttle = true;  // 设置锁
    setTimeout(() => {
        throttle = false;  // 在timeout时间后释放锁
    }, timeout);
}

解析

  • throttle变量充当锁,控制回调函数的执行频率。
  • throttlefalse时,函数可以立即执行;执行后将其置为true,并开启计时器setTimeout
  • 计时器结束后将throttle重置为false,允许再次执行。

这种实现方式在时间段内只允许一次点击生效,适用于低频触发场景。

🦋2.2 使用Lodash库的限流和防抖

在Vue组件setup方法中,定义了Lodash限流和防抖按钮的功能:

const throttleClick = _.throttle(function() {
    console.log(Date());
}, 2000);
const debounceClick = _.debounce(function() {
    console.log(Date());
}, 2000);

解析

  • _.throttle:每隔2000毫秒触发一次throttleClick,在时间间隔内忽略多余调用,适合频繁触发但需要固定速率的场景(如滚动事件)。
  • _.debounce:延迟2000毫秒触发debounceClick,若在延迟期间再次触发,则重置计时器。适合用户停止触发一段时间后再进行操作的场景(如搜索框输入)。

🦋2.3 代码运行逻辑

  • click:调用click方法执行throttleTool手动限流,只有每隔2秒一次的点击会触发console.log(Date())
  • throttleClick:调用Lodash的_.throttle限流,每隔2秒输出一次时间,不会因频繁点击加快执行频率。
  • debounceClick:调用Lodash的_.debounce防抖,点击停止2秒后才会输出时间,若2秒内继续点击,延迟计时重置。

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。