Vue.js 中 computed 和 watch 的用法及差异分析

Vue.js 是一款非常流行且易于使用的前端框架。computed 和 watch 是 Vue.js 中两个非常重要的计算属性和观察属性。本文将详细介绍 computed 和 watch 的用法和区别,并提供示例代码。

computed

computed 是一种计算属性,用于在模板中对变量进行动态绑定,从而实现数据的计算和处理。computed 计算属性可以依赖于其它属性的值,并且在计算后会被缓存,只有当其依赖的值发生变化时才会重新计算。

用法

下面是 computed 的基本用法。

----------
  -----
    ----- -------- ------
  ------
-----------

--------
------ ------- -
  ------ -
    ------ -
      ---------- -------
      --------- ------
    --
  --
  --------- -
    ---------- -
      ------ -------------- - - - - --------------
    --
  --
--
---------

在这个示例中,我们定义了两个属性 firstNamelastName,然后定义了一个 fullName 计算属性,该计算属性依赖于 firstNamelastName 的值,并返回它们的拼接字符串。

在模板中,我们调用 fullName 计算属性,并将其显示出来。如果 firstNamelastName 的值发生变化,fullName 计算属性会自动重新计算。

深入理解 computed

除了基本用法外,computed 还有很多其他的用法和用途。下面是一些我们需要深入理解 computed 的原因:

计算属性 vs 方法

从外观上看,computed 和方法看起来非常相似。因为它们都可以计算并返回一个值,而且都可以接受参数。但是,它们之间有一个重要的区别,就是计算属性是基于它们的依赖缓存的。也就是说,只要 firstNamelastName 的值没有改变,那么 fullName 就不会重新计算。而方法则没有缓存和优化这个过程,每次都是重新调用方法。

这意味着什么呢?实际上,计算属性比方法更加高效,因为它们可以避免不必要的计算。但是,如果你确实需要每次调用时都重新计算值,那么应该使用方法,而不是计算属性。

计算属性 vs 监听属性

computed 和 watch 是 Vue.js 中两个非常重要的属性,它们都可以监视数据的变化。然而,它们之间也有很大的区别。

watch 是一个观察属性,用于观察特定属性的变化,并在特定条件下执行回调函数。与 computed 不同,watch 不会缓存值,并且需要手动指定回调函数。

----------
  -----
    ------ ----------------- --
  ------
-----------

--------
------ ------- -
  ------ -
    ------ -
      -------- ---
    --
  --
  ------ -
    --------------- ------- -
      ---------------- -------- ---------- --- -------- ------------
    --
  --
--
---------

在这个示例中,我们定义了一个监听留言 message 的 watch 属性。每当 message 属性的值发生变化时,会执行相应的回调函数,并输出新值和旧值。

尽管 computed 和 watch 都可以计算新值,但它们之间还有很多不同之处。下面是它们之间的一些不同之处:

  • computed 是基于它们的依赖缓存的,而 watch 不会缓存值。
  • computed 用于计算新值,而 watch 用于执行一些特定的操作,比如 Ajax 请求、限制触发次数 等。
  • computed 不支持异步操作,而 watch 支持。
  • computed 是同步的,而 watch 是异步的。
  • computed 只在其依赖的值发生变化时才会重新计算,而 watch 可以在不同的情况下执行不同的操作。

因此,当需要处理异步操作或执行一些特定的操作时,应该使用 watch,而不是 computed。

watch

watch 是一个观察属性,用于观察特定属性的变化,并在特定条件下执行回调函数。与 computed 不同,watch 不会缓存值,并且需要手动指定回调函数。

用法

下面是 watch 的基本用法。

----------
  -----
    ------ ----------------- --
  ------
-----------

--------
------ ------- -
  ------ -
    ------ -
      -------- ---
    --
  --
  ------ -
    --------------- ------- -
      ---------------- -------- ---------- --- -------- ------------
    --
  --
--
---------

在这个示例中,我们定义了一个监听留言 message 的 watch 属性。每当 message 属性的值发生变化时,会执行相应的回调函数,并输出新值和旧值。

深入理解 watch

watch 的用法有很多细节,下面是一些必要的几点:

监听特定属性

watch 可以用于监听特定属性的变化。比如:

--------
------ ------- -
  ------ -
    ------ -
      -------- ---
    --
  --
  ------ -
    ---------- -
      --------------- ------- -
        ---------------- -------- ---------- --- -------- ------------
      --
      ---------- -----
    --
  --
--
---------

在这个示例中,我们使用 watch 监听了 message 属性的变化,并指定了回调函数。当 message 属性的值发生变化时,会执行相应的回调函数,并输出新值和旧值。

我们还使用了immediate: true选项,指定在初始化组件时立即调用回调函数,而不需要先发生属性变化。

监听多个属性

watch 还可以监听多个属性的变化,并在满足特定条件时执行相应的回调函数。比如:

--------
------ ------- -
  ------ -
    ------ -
      ---------- ---
      --------- ---
      --------- ---
    --
  --
  ------ -
    ----------------- ------- -
      ------------- - ---------- ------------------
    --
    ---------------- ------- -
      ------------- - ------------------ -----------
    --
  --
--
---------

在这个示例中,我们定义了三个属性:firstNamelastNamefullName,其中 fullName 为计算属性。我们使用 watch 监听了 firstNamelastName 属性的变化,并在满足相应条件时更新 fullName 计算属性的值。

监听对象属性

在 Vue.js 中,我们可以使用对象或数组存储数据。如果需要监听对象属性的变化,可以使用前缀 obj. 表示该对象属性。比如:

--------
------ ------- -
  ------ -
    ------ -
      ---- -
        ----- ---
        ---- ---
      --
    --
  --
  ------ -
    ----------- -
      --------------- ------- -
        ---------------- ----- ---------- --- ----- ------------
      --
      ---------- -----
    --
    ---------- -
      --------------- ------- -
        ---------------- ---- ---------- --- ---- ------------
      --
    --
  --
--
---------

在这个示例中,我们使用了前缀 obj. 来监听对象属性的变化,并指定相应的回调函数。当 obj.name 属性或 obj.age 属性的值发生变化时,会执行相应的回调函数,并输出新值和旧值。

computed 和 watch 的差异分析

通过上述内容的讲解,我们了解了 computed 和 watch 的用法和特点。下面对两者进行简单的对比:

第一,computed 的类型是计算属性,它在监测到变化时会自动缓存起来,需要的时候会直接调用缓存,使得其计算量和运行时间很少。

第二,watch 是侦听属性,它用于侦听是否有值变化,并且有一个选项是 deep,它可以深度遍历监听对象的每一个属性。

第三,computed 不支持异步操作,而 watch 支持。

第四,computed 在组件中使用时可以直接调用,不需要加括号。但使用 watch 需要手动注册它,然后带上要监听的值和回调函数。

在我们的项目开发中,应该根据实际情况选择使用 computed 还是 watch。如果需要计算值、缓存值或者监听到一个特定的值,那么就使用计算属性 computed。相反,如果需要操作异步数据、监听非常复杂的变化、在数据变化时执行异步操作,那么就使用 watch。

总结

总的来说,computed 和 watch 都是 Vue.js 中非常重要的属性,它们都用于计算、处理和监听数据的变化。其中,computed 是一种计算属性,用于计算和缓存数据的值;而 watch 是一种观察属性,用于观察数据的变化并执行特定的操作。

基本上,computed 是用来读取数据,而 watch 是用来监听数据的变化。它们之间的区别在于,computed 缓存了计算结果,只有当依赖项发生变化时才会重新计算;而 watch 在每次变化时都会执行回调函数,在特定条件下执行特定的操作。

当你需要监听对象属性的变化时,你需要使用 watch;当你需要处理异步操作时,你也需要使用 watch。而当你需要缓存值或者计算值时,你应该使用 computed。在实际项目中,需要根据实际情况选择合适的属性,并结合模板使用。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66475fb5d3423812e45ad5c9