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

Vue3通過(guò)hooks方式封裝節(jié)流和防抖的代碼詳解

 更新時(shí)間:2024年10月20日 08:30:21   作者:侯亮平  
vue3 中的 hooks 就是函數(shù)的一種寫法,就是將文件的一些單獨(dú)功能的js代碼進(jìn)行抽離出來(lái),放到單獨(dú)的js文件中,或者說(shuō)是一些可以復(fù)用的公共方法/功能,本文給大家介紹了Vue3通過(guò)hooks方式封裝節(jié)流和防抖,需要的朋友可以參考下

創(chuàng)建 useThrottle Hook

節(jié)流函數(shù)的作用是確保一個(gè)函數(shù)在一段時(shí)間內(nèi)只能被執(zhí)行一次,即使它被連續(xù)調(diào)用多次也只會(huì)執(zhí)行一次。

import { ref, onBeforeUnmount } from 'vue';

function useThrottle(callback, delay = 100) {
  let timerId = ref(null);

  const cancel = () => {
    if (timerId.value !== null) {
      clearTimeout(timerId.value);
      timerId.value = null;
    }
  };

  const throttledCallback = (...args) => {
    if (!timerId.value) {
      timerId.value = setTimeout(() => {
        callback(...args);
        timerId.value = null;
      }, delay);
    }
  };

  onBeforeUnmount(cancel); // 在組件卸載前清除定時(shí)器

  return [throttledCallback, cancel];
}

export default useThrottle;

創(chuàng)建 useDebounce Hook

防抖函數(shù)則是確保在一個(gè)給定的時(shí)間段內(nèi),只有最后一次操作會(huì)觸發(fā)函數(shù)執(zhí)行,如果在這段時(shí)間內(nèi)還有新的操作發(fā)生,則重新計(jì)時(shí)。

import { ref, onBeforeUnmount } from 'vue';

function useDebounce(callback, delay = 100) {
  let timerId = ref(null);

  const cancel = () => {
    if (timerId.value !== null) {
      clearTimeout(timerId.value);
      timerId.value = null;
    }
  };

  const debouncedCallback = (...args) => {
    cancel(); // 取消之前的定時(shí)器
    timerId.value = setTimeout(() => {
      callback(...args);
    }, delay);
  };

  onBeforeUnmount(cancel); // 在組件卸載前清除定時(shí)器

  return [debouncedCallback, cancel];
}

export default useDebounce;

解析

  • useThrottle: 這個(gè) hook 接受一個(gè)回調(diào)函數(shù) callback 和一個(gè)延遲時(shí)間 delay。它返回一個(gè)被節(jié)流的函數(shù) throttledCallback,這個(gè)函數(shù)在首次調(diào)用后會(huì)設(shè)置一個(gè)定時(shí)器,在 delay 時(shí)間之后執(zhí)行 callback 并重置定時(shí)器。此外,它還返回了一個(gè) cancel 函數(shù)用來(lái)取消定時(shí)器。
  • useDebounce: 類似于 useThrottle,但是它在每次調(diào)用 debouncedCallback 時(shí)都會(huì)先取消任何未完成的定時(shí)器,然后再設(shè)置一個(gè)新的定時(shí)器。這意味著只有在最后一次調(diào)用后的 delay 時(shí)間結(jié)束后,callback 才會(huì)被執(zhí)行。

在 Vue 組件中使用這些 hooks

<template>
  <div>
    <button @click="handleClick">Click me</button>
    <p>Clicked at: {{ lastClickTime }}</p>
  </div>
</template>

<script>
import useThrottle from './useThrottle';
import useDebounce from './useDebounce';

export default {
  setup() {
    const lastClickTime = ref('');
    const handleAction = () => {
      lastClickTime.value = new Date().toISOString();
    };

    // 使用節(jié)流
    const [handleClickThrottled] = useThrottle(handleAction, 500);

    // 或者使用防抖
    // const [handleClickDebounced] = useDebounce(handleAction, 500);

    return {
      lastClickTime,
      handleClick: handleClickThrottled,
      // 或者使用防抖版本
      // handleClick: handleClickDebounced,
    };
  },
};
</script>

這樣,每次點(diǎn)擊按鈕時(shí),節(jié)流或防抖處理函數(shù)就會(huì)被調(diào)用,并更新 lastClickTime。你可以根據(jù)需要選擇使用節(jié)流或防抖處理函數(shù)。

以上就是Vue3通過(guò)hooks方式封裝節(jié)流和防抖的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue3 hooks封裝節(jié)流和防抖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 查看vue版本號(hào)以及vue/cli腳手架版本號(hào)方式

    查看vue版本號(hào)以及vue/cli腳手架版本號(hào)方式

    這篇文章主要介紹了查看vue版本號(hào)以及vue/cli腳手架版本號(hào)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue3中pinia的使用及持久化的實(shí)現(xiàn)

    vue3中pinia的使用及持久化的實(shí)現(xiàn)

    Pinia是一個(gè)基于Vue3的狀態(tài)管理庫(kù),本文主要介紹了vue3中pinia的使用及持久化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • vue移動(dòng)端設(shè)置全屏背景的項(xiàng)目實(shí)踐

    vue移動(dòng)端設(shè)置全屏背景的項(xiàng)目實(shí)踐

    本vue移動(dòng)端項(xiàng)目設(shè)置全屏背景,關(guān)鍵是要找對(duì)文件,然后添加background屬性即可,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • vue css 引入asstes中的圖片無(wú)法顯示的四種解決方法

    vue css 引入asstes中的圖片無(wú)法顯示的四種解決方法

    這篇文章主要介紹了vue css 引入asstes中的圖片 無(wú)法顯示的幾種解決方案,本文給出了四種解決方法,每種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 前端框架Vue父子組件數(shù)據(jù)雙向綁定的實(shí)現(xiàn)

    前端框架Vue父子組件數(shù)據(jù)雙向綁定的實(shí)現(xiàn)

    Vue項(xiàng)目中經(jīng)常使用到組件之間的數(shù)值傳遞,實(shí)現(xiàn)的方法很多,但是原理上基本大同小異。這篇文章將給大家介紹Vue 父子組件數(shù)據(jù)單向綁定與Vue 父子組件數(shù)據(jù)雙向綁定的對(duì)比從而認(rèn)識(shí)雙向綁定
    2021-09-09
  • vue下如何利用canvas實(shí)現(xiàn)在線圖片標(biāo)注

    vue下如何利用canvas實(shí)現(xiàn)在線圖片標(biāo)注

    這篇文章主要介紹了vue下如何利用canvas實(shí)現(xiàn)在線圖片標(biāo)注,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • elementUI中el-dropdown的command實(shí)現(xiàn)傳遞多個(gè)參數(shù)

    elementUI中el-dropdown的command實(shí)現(xiàn)傳遞多個(gè)參數(shù)

    這篇文章主要介紹了elementUI中el-dropdown的command實(shí)現(xiàn)傳遞多個(gè)參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue實(shí)現(xiàn)一個(gè)返回頂部backToTop組件

    Vue實(shí)現(xiàn)一個(gè)返回頂部backToTop組件

    本篇文章主要介紹了Vue實(shí)現(xiàn)一個(gè)返回頂部backToTop組件,可以實(shí)現(xiàn)回到頂部效果,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • Vue.js中v-bind指令的用法介紹

    Vue.js中v-bind指令的用法介紹

    這篇文章介紹了Vue.js中v-bind指令的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • vue實(shí)現(xiàn)四級(jí)導(dǎo)航及驗(yàn)證碼的方法實(shí)例

    vue實(shí)現(xiàn)四級(jí)導(dǎo)航及驗(yàn)證碼的方法實(shí)例

    我們?cè)谧鲰?xiàng)目經(jīng)常會(huì)遇到多級(jí)導(dǎo)航這個(gè)需求,所以下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)四級(jí)導(dǎo)航及驗(yàn)證碼的相關(guān)資料,文章通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07

最新評(píng)論

汶上县| 张家口市| 麻城市| 来宾市| 临泉县| 大邑县| 嘉黎县| 玛多县| 通辽市| 吉林市| 和硕县| 延边| 巴马| 周宁县| 原平市| 阳朔县| 伊吾县| 公安县| 临汾市| 兰州市| 平阴县| 阿图什市| 合川市| 江门市| 孝义市| 望城县| 香河县| 昌黎县| 芦溪县| 师宗县| 大同市| 高邮市| 敦化市| 武隆县| 合江县| 墨竹工卡县| 伊通| 班戈县| 荔波县| 庆阳市| 元谋县|