返回

Vue3语法糖setup(二)

前端

Vue 3 中 watch 和 computed 的深入探究

在 Vue 3 中,watchcomputed 这两个 API 仍然是开发响应式应用程序的强大工具,它们可以跟踪数据变化并派生计算属性。本篇博客将深入探索这两个 API 在 Vue 3 中的用法、选项和示例。

watch :监视数据变化

watch 函数用于监控响应式数据的变化。当被监控的数据发生变化时,watch 函数就会触发,执行指定的回调函数。watch 函数接受两个参数:

  • 目标数据: 要监控变化的数据。
  • 回调函数: 在数据变化时执行的函数。

示例:

import { ref, watch } from 'vue'

export default {
  setup() {
    const count = ref(0)

    watch(count, (newValue, oldValue) => {
      console.log(`count changed from ${oldValue} to ${newValue}`)
    })

    return {
      count
    }
  }
}

watch 选项:

  • immediate: 如果你想在组件首次渲染时立即执行 watch 函数,可以将 immediate 选项设置为 true。
  • deep: 通过将 deep 选项设置为 true,watch 函数将对目标数据的每个属性进行深度监控,包括嵌套对象。
  • flush: 可以通过 flush 选项指定 watch 函数的执行时机。设置为 sync 会在组件更新后立即执行,而设置为 post 会在下一个 tick 执行。

computed:计算属性

computed 函数用于创建计算属性,这些属性是根据其他响应式数据的派生值。计算属性的值是只读的。computed 函数接受一个函数作为参数,该函数计算属性的值。

示例:

import { ref, computed } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const doubleCount = computed(() => {
      return count.value * 2
    })

    return {
      count,
      doubleCount
    }
  }
}

computed 选项:

  • cache: 如果将 cache 选项设置为 false,computed 函数将在每次访问时重新计算其值,而不是缓存结果。
  • setter: 定义一个 setter 函数,允许 computed 属性的值被修改。

深入探讨 watch 和 computed

watch vs computed:

watch 函数用于监控数据变化并执行回调函数,而 computed 函数用于创建计算属性。主要区别在于:

  • computed 属性是只读的,而 watch 函数的回调函数可以修改数据。
  • computed 函数比 watch 函数开销更低,因为它们只在依赖项发生变化时才重新计算。

使用 watch 和 computed 的最佳实践:

  • 将 watch 函数用于需要立即执行的响应,例如更新用户界面。
  • 使用 computed 属性来计算不经常更改的值,例如列表的总和或对象的长度。
  • 尽可能使用 computed 属性,因为它们更有效。

代码示例:

以下代码示例演示了 watch 和 computed 的用法:

import { ref, watch, computed } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const watchCount = watch(count, (newValue, oldValue) => {
      console.log(`count changed from ${oldValue} to ${newValue}`)
    })

    const doubleCount = computed(() => {
      return count.value * 2
    })

    const resetCount = () => {
      count.value = 0
    }

    return {
      count,
      watchCount,
      doubleCount,
      resetCount
    }
  }
}

常见问题解答

1. watch 和 computed 在组件卸载时会被移除吗?

是的,当组件卸载时,watch 和 computed 实例会被自动移除。

2. watch 和 computed 可以用来监控对象数组吗?

可以使用 deep 选项深度监控对象数组。

3. computed 属性可以使用 watch 函数吗?

不能,computed 属性不能使用 watch 函数。

4. watch 函数可以执行异步操作吗?

可以,但应该使用 flush 选项将执行推迟到下一个 tick。

5. 什么时候应该使用 cache 选项?

当计算的属性不经常更改时,使用 cache 选项可以提高性能。

结论

watch 和 computed API 是 Vue 3 开发人员的有力工具,它们使开发响应式和可维护的应用程序成为可能。通过理解这些 API 的用法和选项,你可以构建高效且健壮的前端应用程序。