最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

VUE前端實(shí)現(xiàn)防抖節(jié)流Lodash工具庫(kù)舉例詳解

 更新時(shí)間:2025年01月23日 09:08:56   作者:百事老餅干  
這篇文章主要介紹了Lodash庫(kù)和自定義防抖、節(jié)流函數(shù)的使用方法,包括它們的定義、應(yīng)用示例及應(yīng)用場(chǎng)景文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

方法一:采用Lodash工具庫(kù)

Lodash 是一個(gè)一致性、模塊化、高性能的 JavaScript 實(shí)用工具庫(kù)。

(1)采用終端導(dǎo)入Lodash庫(kù)

$ npm i -g npm
$ npm i --save lodash

(2)應(yīng)用

示例:搜索框輸入防抖

在這個(gè)示例中,我們希望用戶在輸入框中停止輸入 500 毫秒后才執(zhí)行搜索操作,避免頻繁請(qǐng)求.

<input type="text" id="search" placeholder="Search...">

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
  // 假設(shè)這是一個(gè)執(zhí)行搜索操作的函數(shù)
  function performSearch(query) {
    console.log('Searching for:', query);
    // 這里可以發(fā)送 ajax 請(qǐng)求進(jìn)行搜索
  }

  // 使用 lodash 的 debounce 函數(shù)
  const debouncedSearch = _.debounce(function(event) {
    performSearch(event.target.value);
  }, 500);  // 500ms 的防抖時(shí)間

  // 監(jiān)聽輸入框的輸入事件
  document.getElementById('search').addEventListener('input', debouncedSearch);
</script>

示例:滾動(dòng)事件節(jié)流

在這個(gè)示例中,我們希望當(dāng)用戶滾動(dòng)頁(yè)面時(shí),每隔 1 秒才記錄一次滾動(dòng)事件,避免頻繁觸發(fā)回調(diào)函數(shù)。

<div style="height: 2000px;">Scroll down to see the effect</div>
<!-- 導(dǎo)入 throttle 函數(shù)-->
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
    // 這是一個(gè)處理滾動(dòng)事件的函數(shù)
    function handleScroll() {
        console.log('Scroll event detected at:', new Date().toLocaleTimeString());
    }

    // 使用 lodash 的 throttle 函數(shù),每隔 1 秒最多觸發(fā)一次
    const throttledScroll = _.throttle(handleScroll, 1000);

    // 監(jiān)聽滾動(dòng)事件
    window.addEventListener('scroll', throttledScroll);
</script>
  • 解釋
    • 當(dāng)用戶滾動(dòng)頁(yè)面時(shí),throttledScroll 函數(shù)會(huì)在 1 秒內(nèi)最多觸發(fā)一次,避免滾動(dòng)時(shí)回調(diào)函數(shù)被頻繁調(diào)用。
    • 這優(yōu)化了頁(yè)面滾動(dòng)的性能,特別是在回調(diào)函數(shù)較為復(fù)雜時(shí)。

示例:結(jié)合 leading 和 trailing 選項(xiàng)

假設(shè)我們希望在用戶第一次觸發(fā)事件時(shí)立即執(zhí)行函數(shù),并在停止觸發(fā) 1 秒后再次執(zhí)行。

<input type="text" id="input-field" placeholder="Type something...">

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
    // 假設(shè)這是一個(gè)處理輸入的函數(shù)
    function handleInput(value) {
        console.log('Input value processed:', value);
    }

    // 使用 debounce 函數(shù),并配置 leading 和 trailing 選項(xiàng)
    const debouncedInput = _.debounce(function(event) {
        handleInput(event.target.value);
    }, 1000, { leading: true, trailing: true });

    // 監(jiān)聽輸入框的輸入事件
    document.getElementById('input-field').addEventListener('input', debouncedInput);
</script>

方法二:自定義防抖、節(jié)流函數(shù)

(1)在utils文件夾下創(chuàng)建lodash.ts文件,里面定義防抖節(jié)流函數(shù)

// 防抖函數(shù)
export function debounce(fn: Function, delay: number) {
  let timer: ReturnType<typeof setTimeout> | null = null;

  return function (this: any, ...args: any[]) {
    // 清除上一個(gè)定時(shí)器
    if (timer) {
      clearTimeout(timer);
    }

    // 設(shè)置新的定時(shí)器
    timer = setTimeout(() => {
      fn.apply(this, args); // 使用apply確保this和參數(shù)正確傳遞
    }, delay);
  };
}

  
// 節(jié)流函數(shù)
export function throttle(fn: Function, delay: number) {
  let lastTime = 0;

  return function (this: any, ...args: any[]) {
    const now = Date.now();

    // 如果距離上次執(zhí)行時(shí)間已超過(guò)指定時(shí)間間隔,則執(zhí)行函數(shù)
    if (now - lastTime >= delay) {
      lastTime = now;  // 更新上次執(zhí)行時(shí)間
      fn.apply(this, args);
    }
  };
}

(2)應(yīng)用

防抖

  • 方式一:
<template>
  <div>
    <input v-model="searchText" placeholder="輸入搜索內(nèi)容" />
    <button @click="handleSubmit">提交</button>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import { debounce } from '@/utils/debounce';  // 引入自己寫的防抖函數(shù)

// 1. 聲明響應(yīng)式數(shù)據(jù)
const searchText = ref<string>('');

// 2. 防抖函數(shù),延遲1000毫秒執(zhí)行提交操作
const submitForm = (val: string) => {
  console.log('提交的搜索值:', val);
  // 在這里執(zhí)行提交操作
};

// 3. 使用防抖函數(shù)包裝提交操作
const handleSubmit = debounce(() => {
  submitForm(searchText.value);  // 使用當(dāng)前輸入的值執(zhí)行提交操作
}, 1000); // 防抖延遲設(shè)置為1000毫秒

</script>
  • 方式二:
<template>
  <div>
    <input v-model="searchText" placeholder="輸入搜索內(nèi)容" />
    <button @click="submitForm(searchText)">提交</button>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
import { debounce } from '@/utils/debounce';  // 引入自己寫的防抖函數(shù)

// 1. 聲明響應(yīng)式數(shù)據(jù)
const searchText = ref<string>('');

// 2. 定義提交表單操作
const submitForm = debounce((val: string) => {
  console.log('提交的搜索值:', val);
  // 在這里執(zhí)行提交操作
}, 1000);  // 防抖延遲設(shè)置為1000毫秒

</script>

節(jié)流

<template>
  <div @scroll="handleScroll" style="height: 300px; overflow-y: scroll;">
    <!-- 模擬內(nèi)容,超出容器高度以啟用滾動(dòng) -->
    <div style="height: 1000px;">滾動(dòng)內(nèi)容</div>
  </div>
</template>

<script lang="ts" setup>
import { throttle } from './debounce';  // 引入節(jié)流函數(shù)

// 1. 定義滾動(dòng)事件處理函數(shù)(節(jié)流)
const handleScroll = throttle(() => {
  console.log('滾動(dòng)事件觸發(fā)');
  // 在這里處理滾動(dòng)事件,例如加載更多內(nèi)容
}, 200);  // 每200毫秒只執(zhí)行一次

</script>
<template>
  <div @scroll="handleScroll" style="height: 300px; overflow-y: scroll;">
    <!-- 模擬內(nèi)容,超出容器高度以啟用滾動(dòng) -->
    <div style="height: 1000px;">滾動(dòng)內(nèi)容</div>
  </div>
</template>

<script lang="ts" setup>
import { throttle } from './debounce';  // 引入節(jié)流函數(shù)

// 1. 定義滾動(dòng)事件處理函數(shù)(節(jié)流)
const handleScroll = throttle(() => {
  console.log('滾動(dòng)事件觸發(fā)');
  // 在這里處理滾動(dòng)事件,例如加載更多內(nèi)容
}, 200);  // 每200毫秒只執(zhí)行一次

</script>

應(yīng)用場(chǎng)景

防抖 (debounce):

手抖了。。。多點(diǎn)了好幾次,一定時(shí)間內(nèi)只執(zhí)行一次。(年紀(jì)大了手抖)

  • 功能:只有在用戶停止觸發(fā)事件一段時(shí)間后,才會(huì)執(zhí)行回調(diào)函數(shù)。
  • 應(yīng)用場(chǎng)景:輸入框搜索、窗口大小調(diào)整(resize)、表單提交等。

節(jié)流 (throttle):

好比點(diǎn)了兩次下拉刷新列表頁(yè)面,他不會(huì)馬上直接執(zhí)行兩次,是在你定義的一定時(shí)間間隔前提前,先執(zhí)行第一次在執(zhí)行第二次

  • 功能:在指定的時(shí)間間隔內(nèi),只執(zhí)行一次函數(shù)。如果觸發(fā)頻繁,函數(shù)執(zhí)行會(huì)被限制在每個(gè)時(shí)間間隔內(nèi)最多執(zhí)行一次。
  • 應(yīng)用場(chǎng)景:滾動(dòng)事件、鼠標(biāo)移動(dòng)事件、resize 事件等。

附:安裝和引入問(wèn)題

問(wèn)題描述: 新手在使用 Vue-lodash 時(shí),可能會(huì)遇到安裝和引入的問(wèn)題。

解決步驟:

確保已經(jīng)正確安裝了 Vue 和 lodash。

使用 npm 或 yarn 安裝 Vue-lodash:

npm install --save vue-lodash lodash

yarn add vue-lodash lodash

在你的 Vue 項(xiàng)目中引入 Vue-lodash 和 lodash:

import Vue from 'vue';
import VueLodash from 'vue-lodash';
import lodash from 'lodash';

總結(jié) 

到此這篇關(guān)于VUE前端實(shí)現(xiàn)防抖節(jié)流Lodash工具庫(kù)的文章就介紹到這了,更多相關(guān)VUE前端防抖節(jié)流Lodash內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3之聲明式和編程式導(dǎo)航詳解

    vue3之聲明式和編程式導(dǎo)航詳解

    這篇文章主要介紹了vue3之聲明式和編程式導(dǎo)航,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • vue3中傳遞路徑參數(shù)的限制

    vue3中傳遞路徑參數(shù)的限制

    在 Vue 3 里使用路由跳轉(zhuǎn)到用戶頁(yè)并傳遞路徑參數(shù)時(shí),存在一些限制和需要注意的方面,下面給大家分享vue3中傳遞路徑參數(shù)有什么限制,感興趣的朋友一起看看吧
    2025-03-03
  • 解決vue單頁(yè)路由跳轉(zhuǎn)后scrollTop的問(wèn)題

    解決vue單頁(yè)路由跳轉(zhuǎn)后scrollTop的問(wèn)題

    今天小編就為大家分享一篇解決vue單頁(yè)路由跳轉(zhuǎn)后scrollTop的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 深度解析Vue3狀態(tài)管理中Hook與Store的區(qū)別

    深度解析Vue3狀態(tài)管理中Hook與Store的區(qū)別

    在?Vue?3?生態(tài)中,狀態(tài)管理是構(gòu)建可維護(hù)應(yīng)用的核心挑戰(zhàn),?本文將深入剖析Hook與Store的本質(zhì)區(qū)別,重點(diǎn)探討?Hook?實(shí)現(xiàn)數(shù)據(jù)共享的可行性,并提供實(shí)用的選型策略
    2026-05-05
  • vue輸入節(jié)流,避免實(shí)時(shí)請(qǐng)求接口的實(shí)例代碼

    vue輸入節(jié)流,避免實(shí)時(shí)請(qǐng)求接口的實(shí)例代碼

    今天小編就為大家分享一篇vue輸入節(jié)流,避免實(shí)時(shí)請(qǐng)求接口的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Vue和React中diff算法的區(qū)別及說(shuō)明

    Vue和React中diff算法的區(qū)別及說(shuō)明

    React和Vue都使用虛擬DOM和diff算法來(lái)更新DOM,但它們?cè)趯?shí)現(xiàn)上有所不同,React采用基于索引的比較,Vue采用雙端比較算法,React在比較時(shí)不復(fù)用不同類型的節(jié)點(diǎn),而Vue會(huì)優(yōu)先復(fù)用兩端相同的節(jié)點(diǎn),React對(duì)key的依賴較高,而Vue在沒(méi)有key時(shí)也能通過(guò)雙端比較優(yōu)化
    2025-03-03
  • vue父組件點(diǎn)擊觸發(fā)子組件事件的實(shí)例講解

    vue父組件點(diǎn)擊觸發(fā)子組件事件的實(shí)例講解

    下面小編就為大家分享一篇vue父組件點(diǎn)擊觸發(fā)子組件事件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • vue2.0實(shí)現(xiàn)列表數(shù)據(jù)增加和刪除

    vue2.0實(shí)現(xiàn)列表數(shù)據(jù)增加和刪除

    這篇文章主要為大家詳細(xì)介紹了vue2.0實(shí)現(xiàn)列表數(shù)據(jù)增加和刪除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • vue3.0公共組件自動(dòng)導(dǎo)入的方法實(shí)例

    vue3.0公共組件自動(dòng)導(dǎo)入的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于vue3.0公共組件自動(dòng)導(dǎo)入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • VUE?mixin?使用示例詳解

    VUE?mixin?使用示例詳解

    混入mixin提供了一種非常靈活的方式,來(lái)分發(fā)Vue組件中的可復(fù)用功能,一個(gè)混入對(duì)象可以包含任意組件選項(xiàng),接下來(lái)通過(guò)本文給大家介紹VUE?mixin?使用,需要的朋友可以參考下
    2022-08-08

最新評(píng)論

阿克| 孝昌县| 平遥县| 奇台县| 华蓥市| 赤壁市| 寻乌县| 南投县| 洞口县| 闻喜县| 九江市| 黑龙江省| 拜城县| 扎鲁特旗| 剑河县| 景谷| 辽阳县| 绵阳市| 融水| 长宁县| 河西区| 微博| 芦山县| 曲沃县| 南和县| 阿合奇县| 芜湖县| 江华| 寻乌县| 扶风县| 阜康市| 介休市| 鹤庆县| 和田县| 文安县| 东源县| 秀山| 兴城市| 常宁市| 沐川县| 平阴县|