返回

Nuxt3 和 VueUse 用 refDebounced 实现防抖触发的 API 调用

vue.js

Nuxt3 和 VueUse 中使用 useFetch:使用 refDebounced 触发 API 调用

在构建现代、响应迅速的 web 应用程序时,Nuxt3 和 VueUse 是必不可少的工具。结合使用这两个库,我们可以轻松实现复杂的功能,例如在用户输入时触发 API 调用。本文将引导你完成如何使用 VueUse 的 refDebounced 和 Nuxt3 的 useFetch 来实现这一功能,并针对至少 3 个字符的输入进行优化。

问题

假设我们有一个搜索栏,当用户输入至少 3 个字符时,需要触发 API 调用。同时,我们希望避免过早触发 API 调用,因此需要在每次输入后等待一段时间。

解决方案

为了解决这个问题,我们将使用 VueUse 的 refDebounced 函数来创建可防抖的 searchTerm,并在其值发生变化时触发 API 调用。以下是如何实现的:

  1. 创建可防抖的搜索项:

    const searchTerm = ref('');
    watch(searchTerm, (value) => {
      if (value && value.length >= 3) {
        debouncedFn(); // 调用防抖函数
      }
    });
    
  2. 防抖函数:

    const debouncedFn = useDebounceFn(() => {
      execute(); // 执行 API 调用
    }, { delay: 50 }); // 等待 50 毫秒后再执行
    
  3. 使用 useFetch:

    const { data, execute } = await useFetch('url', {
      query: {
        query: searchTerm.value, // 使用当前搜索项值
      },
      watch: [debouncedFn], // 在防抖函数执行时触发 API 调用
    });
    

优化:移出 debouncedFn

为了进一步优化代码,我们可以直接将 debouncedFn 作为 useFetchwatch 选项:

const { data, execute } = await useFetch('url', {
  query: {
    query: searchTerm.value,
  },
  watch: [useDebounceFn(() => { execute(); }, { delay: 50 })],
});

完整示例

以下是完整示例的代码:

const searchTerm = ref('');
watch(searchTerm, (value) => {
  if (value && value.length >= 3) {
    useDebounceFn(() => { execute(); }, { delay: 50 })();
  }
});

const { data, execute } = await useFetch('url', {
  query: {
    query: searchTerm.value,
  },
  watch: [useDebounceFn(() => { execute(); }, { delay: 50 })],
});

结论

通过结合使用 VueUse 的 refDebounced 和 Nuxt3 的 useFetch,我们可以轻松地为用户输入触发 API 调用。使用可防抖的搜索项,我们还可以防止过早触发调用,从而改善应用程序的性能和用户体验。

常见问题解答

  1. useDebounceFn 的延迟值应该是什么?
    这取决于特定应用程序的要求。对于大多数情况下,50 毫秒的延迟就足够了。

  2. 如何取消防抖函数?
    useDebounceFn 返回一个清除函数,可以使用它来取消防抖:debouncedFn.clear()

  3. refDebounced 和 useDebouncedFn 有什么区别?
    refDebounced 创建一个可防抖的值,而 useDebouncedFn 创建一个可防抖的函数。

  4. 如何处理 API 调用失败?
    可以使用 useFetcherror 属性来处理 API 调用失败。

  5. 是否可以使用 useFetch 触发多个 API 调用?
    是的,可以使用 watch 选项为不同的条件触发多个 API 调用。