vue3學習之防抖和節流

?
在前端開發中,我們經常會遇到這樣的情況:某些事件(如滾動、輸入、點擊等)會頻繁觸發,如果不加以控制,可能會導致性能問題。Vue3 中的防抖(Debounce)和節流(Throttle)就是用來解決這類問題的兩種常用技術。

一、什么是防抖和節流?

1. 防抖(Debounce)

什么是防抖?

??就像我們按電梯按鈕,不管你按多少次,電梯只會在你松手一段時間后才會啟動。

??當事件觸發時,不立即執行處理函數,而是等待一段時間(比如300ms)。如果在這段時間內事件再次觸發,則重新計時。只有在指定時間內事件不再觸發,才會真正執行處理函數。

??適用場景??:

1、搜索框輸入聯想(避免每次按鍵都發送請求)
2、窗口大小調整事件
3、按鈕點擊防重復提交

2. 節流(Throttle)

什么是節流?

當我們滾動頁面時,可能需要執行某些操作,比如懶加載圖片、檢測滾動位置等。如果不加限制,滾動事件會非常頻繁地觸發,導致性能問題。

在固定的時間間隔內(比如300ms),無論事件觸發多少次,處理函數只會執行一次。

適用場景??:

1、滾動事件
2、鼠標移動事件
3、游戲中的連續按鍵處理

二、簡單實現

1. 防抖的簡單實現

function debounce(func, delay) {let timer = null;return function(...args) {// 如果已經有計時器,先清除if (timer) clearTimeout(timer);// 設置新計時器timer = setTimeout(() => {func.apply(this, args);timer = null; // 執行后重置}, delay);}
}

??Vue3 組件示例??:

<script setup>
import { ref } from 'vue';const searchQuery = ref('');// 創建防抖函數
const debouncedSearch = debounce((query) => {console.log('執行搜索:', query);// 這里可以調用API
}, 500);const handleInput = (e) => {searchQuery.value = e.target.value;debouncedSearch(searchQuery.value);
};
</script>
<template><input @input="handleInput" placeholder="搜索..." />
</template>

2. 節流的簡單實現

function throttle(func, delay) {let lastTime = 0;return function(...args) {const now = Date.now();if (now - lastTime >= delay) {func.apply(this, args);lastTime = now;}}
}

??Vue3 組件示例??:

<script setup>
import { ref } from 'vue';const scrollPosition = ref(0);// 創建節流函數
const throttledScroll = throttle(() => {scrollPosition.value = window.scrollY;console.log('滾動位置:', scrollPosition.value);
}, 200);const handleScroll = (e) => {throttledScroll();
};
</script>
<template><div @scroll="handleScroll" style="height: 200px; overflow-y: scroll;"><!-- 很多內容 --><div v-for="i in 100" :key="i">內容 {{ i }}</div></div>
</template>

三、更健壯的實現(包含取消功能)

實際開發中,我們可能需要取消防抖/節流操作,比如組件卸載時清理定時器。

1. 帶取消功能的防抖

function debounce(func, delay) {let timer = null;// 返回一個函數對象,包含執行方法和取消方法const debounced = function(...args) {if (timer) clearTimeout(timer);timer = setTimeout(() => {func.apply(this, args);}, delay);};// 添加取消方法debounced.cancel = function() {clearTimeout(timer);timer = null;};return debounced;
}

??Vue3 組件中使用??:

<script setup>
import { onUnmounted, ref } from 'vue';const searchQuery = ref('');
let debouncedSearch = null;onUnmounted(() => {// 組件卸載時取消防抖if (debouncedSearch) debouncedSearch.cancel();
});debouncedSearch = debounce((query) => {console.log('執行搜索:', query);// 這里可以調用API
}, 500);const handleInput = (e) => {searchQuery.value = e.target.value;debouncedSearch(searchQuery.value);
};
</script>

四、使用 Lodash 庫

如果你不介意使用第三方庫,Lodash 提供了更完善的實現:

npm install lodash

yarn add lodash

??使用示例??:

import { debounce, throttle } from 'lodash';// 防抖
const debouncedFn = debounce(() => {console.log('防抖執行');
}, 300);// 節流
const throttledFn = throttle(() => {console.log('節流執行');
}, 300);

??Vue3 中使用??:

<script setup>
import { onUnmounted } from 'vue';
import { debounce } from 'lodash';const handleSearch = debounce((query) => {console.log('搜索:', query);
}, 300);const onInput = (e) => {handleSearch(e.target.value);
};onUnmounted(() => {// 取消防抖handleSearch.cancel();
});
</script>

五、總結

1、什么時候用防抖?什么時候用節流?

使用防抖:

1、用戶停止輸入后再搜索(搜索框)
2、窗口大小調整完成后再調整布局
3、按鈕點擊防止重復提交

使用節流:

1、滾動事件(如無限滾動加載)
2、鼠標移動事件(如拖拽操作)
3、游戲中的連續按鍵

特性區別

特性防抖節流
觸發時機??事件停止觸發后一段時間執行固定時間間隔內最多執行一次
行為重置計時器固定間隔執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903192.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4.2.2 MySQL索引原理以及SQL優化

文章目錄 4.2.2 MySQL索引原理以及SQL優化1. 索引與約束1. 索引是什么2. 索引的目的3. 幾種索引4. 約束1.外鍵2. 約束 vs 索引的區別 5. 索引實現1. 索引存儲2. 頁3. B樹4. B樹層高問題5. 自增id6. 聚集索引7. 輔助索引 8. innnodb體系結構1. buffer pool2. change buffer 9. 最…

【學習筆記】文件包含漏洞--本地遠程包含、偽協議、加密編碼

一、文件包含漏洞 和SQL等攻擊方式一樣&#xff0c;文件包含漏洞也是一種注入型漏洞&#xff0c;其本質就是輸入一段用戶能夠控制的腳本或者代碼&#xff0c;并讓服務端執行。 什么叫包含呢&#xff1f;以PHP為例&#xff0c;我們常常把可重復使用的函數寫入到單個文件中&…

藍橋杯 2021年模擬賽 掃雷問題

題目&#xff1a; 在一個 n 行 m 列的方格圖上有一些位置有地雷&#xff0c;另外一些位置為空。 請為每個空位置標一個整數&#xff0c;表示周圍八個相鄰的方格中有多少個地雷。 輸入描述 輸入的第一行包含兩個整數 n,m。 第 22行到第n1 行每行包含 m 個整數&#xff0c;相…

寫windows服務日志-.net4.5.2-定時修改數據庫中某些參數

環境&#xff1a; windows 11 Visual Studio 2015 .net 4.5.2 SQL Server 目的&#xff1a; 定時修改數據庫中某些參數的值 定時修改24小時內&#xff0c;SQL數據庫中&#xff0c;表JD_Reports 內&#xff0c;如果部門是‘體檢科&#xff0c;設置打印類型為 1 可以打印。步驟&a…

madvise MADV_FREE對文件頁統計的影響及原理

一、背景 madvise系統調用是一個與性能優化強相關的一個系統調用。madvise系統調用包括使用madvise函數&#xff0c;也包含使用posix_fadvise函數。如我們可以使用posix_fadvise傳入POSIX_FADV_DONTNEED來清除文件頁的page cache以減少內存壓力。 這篇博客里&#xff0c;我們…

于鍵值(KV)的表

基于鍵值&#xff08;KV&#xff09;的表 將行編碼為鍵值&#xff08;KVs&#xff09; 索引查詢&#xff1a;點查詢和范圍查詢 在關系型數據庫中&#xff0c;數據被建模為由行和列組成的二維表。用戶通過SQL表達他們的意圖&#xff0c;而數據庫則神奇地提供結果。不那么神奇的…

2025年邵陽市工程技術研究中心申報流程、條件、獎補

一、邵陽市工程技術研究中心申報條件 &#xff08;一&#xff09;工程技術研究中心主要依托科技型企業組建&#xff0c;依托單位應具有以下條件&#xff1a; 1.?具有較強技術創新意識的領導班子和技術水平高、工程化實踐經驗豐富的工程技術研發隊伍&#xff0c;其中固定人員…

Python+AI提示詞出租車出行軌跡預測:梯度提升GBR、KNN、LR回歸、隨機森林融合及貝葉斯概率異常檢測研究

原文鏈接&#xff1a;tecdat.cn/?p41693 在當今數字化浪潮席卷全球的時代&#xff0c;城市交通領域的海量數據如同蘊藏著無限價值的寶藏等待挖掘。作為數據科學家&#xff0c;我們肩負著從復雜數據中提取關鍵信息、構建有效模型以助力決策的使命&#xff08;點擊文末“閱讀原文…

系統重裝——聯想sharkbay主板電腦

上周給一臺老電腦重裝系統系統&#xff0c;型號是lenovo sharkbay主板的電腦&#xff0c;趁著最近固態便宜&#xff0c;入手了兩塊長城的固態&#xff0c;裝上以后插上啟動U盤&#xff0c;死活進不去boot系統。提示 bootmgr 缺失&#xff0c;上網查了許久&#xff0c;終于解決了…

python連接Elasticsearch并完成增刪改查

python庫提供了elasticsearch模塊,可以通過以下命令進行快速安裝,但是有個細節需要注意一下,安裝的模塊版本要跟es軟件版本一致,此處舉例:7.8.1 pip install elasticsearch==7.8.1 首先連接elasticsearch,以下是免密示例 from elasticsearch import Elasticsearch# El…

PDF嵌入圖片

所需依賴 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>9.0.0</version><type>pom</type> </dependency>源碼 /*** PDF工具*/ public class PdfUtils {/*** 嵌入圖…

目標檢測篇---faster R-CNN

目標檢測系列文章 第一章 R-CNN 第二篇 Fast R-CNN 目錄 目標檢測系列文章&#x1f4c4; 論文標題&#x1f9e0; 論文邏輯梳理1. 引言部分梳理 (動機與思想) &#x1f4dd; 三句話總結&#x1f50d; 方法邏輯梳理&#x1f680; 關鍵創新點&#x1f517; 方法流程圖關鍵疑問解答…

Seaborn模塊練習題

1.使用tips數據集&#xff0c;創建一個展示不同時間段(午餐/晚餐)賬單總額分布的箱線圖 import seaborn as sns import matplotlib.pyplot as plt import pandas as pdsns.set_style("darkgrid") plt.rcParams["axes.unicode_minus"] Falsetips pd.read…

計算機網絡 | 應用層(1)--應用層協議原理

&#x1f493;個人主頁&#xff1a;mooridy &#x1f493;專欄地址&#xff1a;《計算機網絡&#xff1a;自定向下方法》 大綱式閱讀筆記 關注我&#x1f339;&#xff0c;和我一起學習更多計算機的知識 &#x1f51d;&#x1f51d;&#x1f51d; 目錄 1. 應用層協議原理 1.1 …

論文導讀 - 基于大規模測量與多任務深度學習的電子鼻系統實現目標識別、濃度預測與狀態判斷

基于大規模測量與多任務深度學習的電子鼻系統實現目標識別、濃度預測與狀態判斷 原論文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0925400521014830 引用此論文&#xff08;GB/T 7714-2015&#xff09;&#xff1a; WANG T, ZHANG H, WU Y, …

React中createPortal 的詳細用法

createPortal 是 React 提供的一個實用工具&#xff0c;用于將 React 子元素渲染到 DOM 中的某個位置&#xff0c;而該位置與父組件不在同一個 DOM 層次結構中。這在某些特殊場景下非常有用&#xff0c;比如實現模態框、彈出菜單、固定定位元素等功能。 基本語法 JavaScript …

電池的壽命

思路&#xff1a; 首先&#xff0c;我們觀察發現&#xff1a;由于每枚電池的使用時間不同&#xff0c;而我們又要減少浪費才能使所有電池加起來用得最久&#xff0c;不難發現&#xff1a;當n2時&#xff0c;輸出較小值。 第一步&#xff1a;將電池分為兩組&#xff0c;使兩組…

LeetCode每日一題4.27

3392. 統計符合條件長度為 3 的子數組數目 問題 問題分析 統計符合條件的長度為 3 的子數組數目。具體條件是&#xff1a;子數組的第一個數和第三個數的和恰好為第二個數的一半。 思路 遍歷數組&#xff1a;由于子數組長度固定為 3&#xff0c;我們可以通過遍歷數組來檢查每…

Linux日志處理命令多管道實戰應用

全文目錄 1 日志處理1.1 實時日志分析1.1.1 nginx日志配置1.1.2 nginx日志示例1.1.3 日志分析示例 1.2 多文件合并分析1.3 時間范圍日志提取 2 問題追查2.1 進程級問題定位2.2 網絡連接排查2.3 硬件故障追蹤 3 數據統計3.1 磁盤空間預警3.2 進程資源消耗排名3.3 HTTP狀態碼統計…

0803分頁_加載更多-網絡ajax請求2-react-仿低代碼平臺項目

文章目錄 1 分頁1.1 url與分頁參數1.2 分頁組件與url1.3 列表頁引用分頁組件 2 加載更多2.1 狀態2.2 觸發時機2.3 加載數據2.4優化 結語 1 分頁 1.1 url與分頁參數 查詢問卷列表接口&#xff0c;添加分頁參數&#xff1a; page&#xff1a;當前頁碼&#xff08;第幾頁&#…