返回

以CustomRef方式实现Vue 2防抖/节流的新鲜玩法

前端

自定义 Ref 助力 Vue 中的防抖与节流

引言

在前端开发中,事件处理是一个常见的任务。但如果事件频繁触发,就会导致性能问题和资源浪费。防抖和节流这两种技术应运而生,它们可以有效解决这个问题。本文将深入探讨如何借助 Vue 2 中的 CustomRef 实现防抖和节流。

防抖与节流

防抖(debounce)

防抖是指在一定时间内,如果事件多次触发,仅执行最后一次触发事件的处理函数。它通常用于搜索框中的自动补全功能。

节流(throttle)

节流是指在一定时间内,事件只会被处理一次。它通常用于处理频繁触发的事件,例如滚动事件或鼠标移动事件。

CustomRef

CustomRef 是 Vue 2 中引入的一个强大特性,它允许创建自定义的响应式引用。我们可以利用它来轻松构建防抖/节流函数。

利用 CustomRef 实现防抖

创建 CustomRef

import { ref, customRef } from 'vue'

const debouncedValue = customRef((track, trigger) => ({
  get() {
    return track()
  },
  set(value) {
    clearTimeout(timer)
    timer = setTimeout(() => {
      trigger(value)
    }, delay)
  }
}))

使用方法

const input = ref('')

watch(input, (newValue) => {
  debouncedValue.value = newValue
})

computed(() => {
  // 使用 debouncedValue 进行处理
})

利用 CustomRef 实现节流

创建 CustomRef

import { ref, customRef } from 'vue'

const throttledValue = customRef((track, trigger) => ({
  get() {
    return track()
  },
  set(value) {
    if (!isPending) {
      isPending = true
      trigger(value)

      setTimeout(() => {
        isPending = false
      }, delay)
    }
  }
}))

使用方法

const input = ref('')

watch(input, (newValue) => {
  throttledValue.value = newValue
})

computed(() => {
  // 使用 throttledValue 进行处理
})

防抖/节流的艺术

防抖和节流是前端开发中的必备技术。通过本文,你已经掌握了如何在 Vue 2 中利用 CustomRef 实现它们。希望这能帮助你提升性能和用户体验。

常见问题解答

1. 什么时候应该使用防抖?

当你想限制事件触发频率时,例如在搜索框中输入时自动补全。

2. 什么时候应该使用节流?

当你想防止事件在短时间内多次触发时,例如在滚动或鼠标移动事件中。

3. 如何确定防抖/节流的延迟时间?

延迟时间取决于特定应用程序的需求。一般来说,防抖延迟时间较长(100-500 毫秒),而节流延迟时间较短(10-100 毫秒)。

4. 防抖和节流之间的区别是什么?

防抖会在事件最后一次触发后执行处理函数,而节流会每隔一段时间执行一次处理函数。

5. CustomRef 与其他防抖/节流实现有什么优势?

CustomRef 提供了一个简洁且可定制的解决方案,允许你在 Vue 2 中灵活实现防抖和节流。