Vue3通过hooks方式封装节流和防抖的代码详解

 更新时间:2024年10月20日 08:30:21   作者:侯亮平  
vue3 中的 hooks 就是函数的一种写法,就是将文件的一些单独功能的js代码进行抽离出来,放到单独的js文件中,或者说是一些可以复用的公共方法/功能,本文给大家介绍了Vue3通过hooks方式封装节流和防抖,需要的朋友可以参考下

创建 useThrottle Hook

节流函数的作用是确保一个函数在一段时间内只能被执行一次,即使它被连续调用多次也只会执行一次。

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); // 在组件卸载前清除定时器

  return [throttledCallback, cancel];
}

export default useThrottle;

创建 useDebounce Hook

防抖函数则是确保在一个给定的时间段内,只有最后一次操作会触发函数执行,如果在这段时间内还有新的操作发生,则重新计时。

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(); // 取消之前的定时器
    timerId.value = setTimeout(() => {
      callback(...args);
    }, delay);
  };

  onBeforeUnmount(cancel); // 在组件卸载前清除定时器

  return [debouncedCallback, cancel];
}

export default useDebounce;

解析

  • useThrottle: 这个 hook 接受一个回调函数 callback 和一个延迟时间 delay。它返回一个被节流的函数 throttledCallback,这个函数在首次调用后会设置一个定时器,在 delay 时间之后执行 callback 并重置定时器。此外,它还返回了一个 cancel 函数用来取消定时器。
  • useDebounce: 类似于 useThrottle,但是它在每次调用 debouncedCallback 时都会先取消任何未完成的定时器,然后再设置一个新的定时器。这意味着只有在最后一次调用后的 delay 时间结束后,callback 才会被执行。

在 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();
    };

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

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

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

这样,每次点击按钮时,节流或防抖处理函数就会被调用,并更新 lastClickTime。你可以根据需要选择使用节流或防抖处理函数。

以上就是Vue3通过hooks方式封装节流和防抖的代码详解的详细内容,更多关于Vue3 hooks封装节流和防抖的资料请关注脚本之家其它相关文章!

相关文章

  • Vue组件引用外部js的实战指南

    Vue组件引用外部js的实战指南

    在Vue.js应用开发中,有时候我们需要在组件内部引入外部JavaScript库或脚本文件来增强组件的功能,本文将详细探讨如何在Vue.js项目中安全有效地引用外部JS文件,并提供一系列示例代码来帮助理解这一过程,需要的朋友可以参考下
    2024-09-09
  • vue项目中的遇错:Invalid Host header问题

    vue项目中的遇错:Invalid Host header问题

    这篇文章主要介绍了vue项目中的遇错:Invalid Host header问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • vue如何实现多组关键词对应高亮显示

    vue如何实现多组关键词对应高亮显示

    这篇文章主要介绍了vue如何实现多组关键词对应高亮显示问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • vue 无法覆盖vant的UI组件的样式问题

    vue 无法覆盖vant的UI组件的样式问题

    这篇文章主要介绍了vue 无法覆盖vant的UI组件的样式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue使用NProgress的操作过程解析

    Vue使用NProgress的操作过程解析

    这篇文章主要介绍了Vue使用NProgress的操作过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Vue实现页面添加水印功能

    Vue实现页面添加水印功能

    今天小编就为大家分享一篇Vue实现页面添加水印功能,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue-cli或vue项目利用HBuilder打包成移动端app操作

    vue-cli或vue项目利用HBuilder打包成移动端app操作

    这篇文章主要介绍了vue-cli或vue项目利用HBuilder打包成移动端app操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue通过Blob对象实现导出Excel功能示例代码

    Vue通过Blob对象实现导出Excel功能示例代码

    这篇文章主要介绍了Vue通过Blob对象实现导出Excel功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 浅谈vuejs实现数据驱动视图原理

    浅谈vuejs实现数据驱动视图原理

    这篇文章主要介绍了浅谈vuejs实现数据驱动视图原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Vue3 Hooks 模块化抽离示例详解

    Vue3 Hooks 模块化抽离示例详解

    这篇文章主要为大家介绍了Vue3 Hooks 模块化抽离示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论