watch 和 computed 的区别

38 阅读4分钟

当谈论Vue.js的数据响应性时,你可能会遇到两个重要的概念:watchcomputed。这两者都是Vue.js中用于处理数据变化的工具,但它们的用途和工作方式有着明显的区别。

1. watchcomputed的基本概念

1.1 watch

watch是Vue.js提供的一个用于监视数据变化并采取相应操作的功能。它通常用于监听一个特定的数据属性,并在该属性变化时执行一些自定义的代码。watch的基本语法如下:

watch: {
  propName: function(newVal, oldVal) {
    // 在propName变化时执行的代码
  }
}

watch的回调函数会接收两个参数:newValoldVal,分别表示属性变化后的新值和变化前的旧值。

1.2 computed

watch不同,computed是一个用于计算派生属性的工具。它通常用于基于现有数据属性计算新的属性,并且只有在相关的数据发生变化时才会重新计算。computed的基本语法如下:

computed: {
  computedPropName: function() {
    // 计算computedPropName的值
    return someValueBasedOnOtherDataProperties;
  }
}

computed属性的值是一个函数,该函数返回计算得到的属性的值。Vue.js会自动追踪该属性所依赖的数据属性,当这些依赖属性发生变化时,Vue.js会重新计算computed属性的值。

2. 区别

2.1 数据响应性

一个主要的区别在于数据响应性。在使用watch时,您可以手动监听数据属性的变化,并执行自定义操作。这意味着您可以在回调函数中执行任何操作,包括异步操作。而computed属性是基于依赖的数据属性自动计算的,只有在相关数据变化时才会触发计算。这使得computed更适合处理派生属性的场景,而不是执行副作用操作。

2.2 使用场景

  • watch的适用场景

    • 当您需要监听某个特定数据属性的变化,并在发生变化时执行自定义操作时,watch是一个不错的选择。
    • 适合处理异步操作,例如发起网络请求或执行动画。
    • 当您需要监听多个数据属性的变化,并根据它们的变化执行不同的操作时,watch可以胜任。
  • computed的适用场景

    • 当您需要计算或派生新的属性,该属性依赖于已有的数据属性时,computed是首选。
    • 用于避免重复计算,因为只有依赖数据变化时才会重新计算。
    • 当您需要创建一些与模板直接关联的属性,以便轻松地在模板中使用时,computed非常有用。

2.3 返回值类型

另一个重要的区别在于返回值类型。watch没有返回值,它主要用于执行副作用操作。而computed总是有一个返回值,它是根据依赖数据计算得到的。这意味着您可以直接在模板中使用computed属性的值。

3. 示例

让我们通过一些示例来更好地理解watchcomputed之间的区别。

3.1 watch示例

假设我们有一个Vue组件,需要在user属性发生变化时发起一个网络请求:

{
    data: {
      user: null
    },
    watch: {
      user: function(newVal, oldVal) {
        // 发起网络请求
        this.fetchUserData(newVal);
      }
    },
    methods: {
      fetchUserData(userId) {
        // 发起网络请求并更新数据
      }
    }
}

在这个示例中,我们使用watch来监听user属性的变化,并在变化时触发fetchUserData方法。

3.2 computed示例

现在,假设我们有一个需要计算用户的年龄的场景:

{
    data: {
      birthYear: 1990,
      currentYear: new Date().getFullYear()
    },
    computed: {
      userAge: function() {
        return this.currentYear - this.birthYear;
      }
    }
}

在这个示例中,我们使用computed属性userAge来计算用户的年龄,该计算依赖于birthYearcurrentYear两个数据属性。userAge会在这两个属性发生变化时自动更新。

4. 总结

watchcomputed都是Vue.js中用于处理数据响应性的重要工具,但它们在用途和工作方式上有着明显的区别。watch适用于手动监听数据变化并执行自定义操作的场景,而computed则更适合计算派生属性,并确保它们只在相关数据发生变化时重新计算。