返回

Vue 3 学习笔记(7):巧妙运用 Hook 函数,打造交互式 Web 应用

前端

利用 Vue 3 的 Hook 函数提升 Web 应用程序的交互性

揭秘 Hook 函数:释放 Vue 3 的异步编程潜力

随着 Vue 3 的兴起,Hook 函数作为一项强大且灵活的新特性,为 Vue 开发人员打开了全新的可能性。Hook 函数允许我们直接访问 Vue 的内部特性和状态,从而能够创建出高度交互式和响应式的应用程序。本文将深入探讨 Vue 3 中的 Hook 函数,从基本用法到高级技巧,为您提供全面而深入的理解。

入门:用 useUserPosition Hook 捕捉用户鼠标点击

让我们从最简单的 useUserPosition Hook 出发。它允许我们监听用户鼠标点击事件,并获取点击的坐标。

import { onBeforeUnmount, onMounted, ref } from "vue";

export default function () {
  const x = ref('');
  const y = ref('');

  // 鼠标点击操作函数回调
  const handleClick = (e: MouseEvent) => {
    x.value = e.clientX;
    y.value = e.clientY;
  };

  // 挂载时监听鼠标点击事件
  onMounted(() => {
    window.addEventListener('click', handleClick);
  });

  // 卸载前移除鼠标点击事件监听
  onBeforeUnmount(() => {
    window.removeEventListener('click', handleClick);
  });

  // 返回 x 和 y 坐标
  return { x, y };
};

此 Hook 函数使用 onMountedonBeforeUnmount 生命周期钩子在组件挂载和卸载时添加和移除事件监听器。它返回两个 ref 变量 xy,其中包含鼠标点击的坐标。

进阶 Hook:用 useDebounce 和 useThrottle 驾驭异步世界的挑战

useDebounce 和 useThrottle Hook 函数是处理异步事件的利器。useDebounce 函数可延迟执行操作,直到一段时间后才真正执行,useThrottle 函数则会限制操作在指定时间间隔内只执行一次。

useDebounce Hook

import { ref, watch } from "vue";

export default function (callback: Function, delay: number = 300) {
  const timer = ref(null);
  let args;
  let context;

  const debounced = function (..._args: any[]) {
    args = _args;
    context = this;
    clearTimeout(timer.value);
    timer.value = setTimeout(() => {
      callback.apply(context, args);
    }, delay);
  };

  watch(
    () => delay,
    (newDelay: number) => {
      clearTimeout(timer.value);
      timer.value = setTimeout(() => {
        callback.apply(context, args);
      }, newDelay);
    }
  );

  return debounced;
};

useDebounce Hook 函数接收一个回调函数和一个可选的延迟时间。它使用 refwatch 来跟踪延迟时间,并使用 setTimeout 来延迟执行回调。当延迟时间改变时,它会重置 setTimeout

useThrottle Hook

import { ref, watch } from "vue";

export default function (callback: Function, delay: number = 300) {
  const timer = ref(null);
  let args;
  let context;
  let lastCallTime = 0;

  const throttled = function (..._args: any[]) {
    args = _args;
    context = this;

    const elapsed = Date.now() - lastCallTime;

    if (elapsed >= delay) {
      lastCallTime = Date.now();
      callback.apply(context, args);
    } else if (!timer.value) {
      timer.value = setTimeout(() => {
        lastCallTime = Date.now();
        timer.value = null;
        callback.apply(context, args);
      }, delay - elapsed);
    }
  };

  watch(
    () => delay,
    (newDelay: number) => {
      clearTimeout(timer.value);
      timer.value = setTimeout(() => {
        lastCallTime = Date.now();
        callback.apply(context, args);
      }, newDelay);
    }
  );

  return throttled;
};

useThrottle Hook 函数接收一个回调函数和一个可选的延迟时间。它使用 refwatch 来跟踪延迟时间,并使用 Date.now() 来跟踪上次调用时间。当间隔时间达到延迟时间时,它将执行回调。

善用 Hook 函数,释放应用程序的潜力

Hook 函数是 Vue 3 中强大的工具,可显著提升应用程序的交互性和响应性。通过灵活运用 Hook 函数,我们可以轻松构建出复杂的交互式界面和处理异步事件。

常见问题解答

  1. Hook 函数的优点是什么?
    Hook 函数直接访问 Vue 的内部特性和状态,提供更大的灵活性,无需使用混合或生命周期方法。

  2. Hook 函数是否适用于所有 Vue 组件?
    Hook 函数可以在任何 Vue 组件中使用,包括函数式组件和基于类组件。

  3. 如何使用 Hook 函数?
    Hook 函数以 use 前缀开始,例如 useUserPosition。它们可以像任何其他 Vue 函数一样导入和使用。

  4. useDebounce 和 useThrottle Hook 函数有什么区别?
    useDebounce Hook 函数延迟执行回调,直到一段时间后才真正执行,useThrottle Hook 函数则限制回调在指定时间间隔内只执行一次。

  5. Hook 函数有哪些其他用途?
    Hook 函数可用于各种目的,包括管理状态、处理异步请求、创建动画和构建自定义指令。