Vue.js 中使用 computed 和 watch 的区别及应用

阅读时长 6 分钟读完

在 Vue.js 中,computed 和 watch 是两个常用的属性,用于响应式地处理数据。显然它们的作用是不同的,但往往会被新手混淆或误用。本文将详细介绍它们的区别及应用。

computed

computed 是一个属性,它用于声明一个计算属性。计算属性是根据其他数据属性值计算而来的,通常是简单的加、减、乘、除等数学运算,也可以是更复杂的函数调用和条件逻辑。

computed 的使用方式如下:

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

这段组件代码中声明了一个计算属性 area,通过返回 this.width * this.height 的结果来计算得到。此时如果调用 area,将得到 20000 的返回值。而当 widthheight 的值发生变化时,Vue.js 会智能地重新计算 area 的值并更新组件。因此可以在模板中直接使用 area 作为响应式的数据源:

计算属性具有缓存特性。当一个计算属性被多次引用时,第一次计算后的结果会被缓存起来,以后的引用直接返回缓存结果,而不必重新计算。这样可以节省性能开销,并且让代码更简洁易懂。

computed 对于单纯的数据计算、数据格式化、数据过滤等场景非常适用,它可以让代码更加简洁、优雅。

watch

watch 是 Vue.js 提供的一个属性,用于监听某个数据的变化。当数据变化时,watch 可以执行用户定义的操作,比如发送网络请求、更新本地存储、操作 DOM 等。

watch 的使用方式如下:

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

这段组件代码中声明了一个 watch,用于监听 message 的变化。当 message 的值发生变化时,就会执行一个函数,打印出 message 的新旧值。这个 watch 比较简单,实际应用中可以进行更复杂的操作。

需要注意的是,watch 不仅可以监听数据的变化,还可以监听对象、数组等复杂数据类型的变化,并进行深度观察。监听数组变化时可以使用 deep 选项:

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

这里会监听 items 数组的变化,当数组中的某个元素发生变化、被添加或删除时均会触发 watch,执行相应的操作。

总的来说,watch 适用于监听数据的变化,从而执行相应操作的场景。但是需要注意的是,watch 中的函数可能会被执行多次,因此需要确保函数的执行不会产生副作用或造成性能上的负担。

computed vs watch

理解 computed 和 watch 的区别非常重要,因为它们的应用场景是不同的。

  • computed 适用于单纯的数据计算、格式化、过滤等场景,它可以使代码更加简洁、易懂,也可以提升性能。使用 computed 计算的属性是基于其它响应式属性的值,并且会进行缓存。计算属性只有在必要的情况下(当它所依赖的响应式属性改变时)才会重新计算。
  • watch 适用于需要在数据变化时执行副作用操作的场景,比如发送请求、操作 DOM 等。watch 还可以监听对象、数组等复杂数据类型的变化,并进行深度观察。

当我们需要对某个数据进行数据转换、数据处理等操作时,使用 computed 更加方便,而当我们需要对数据进行特定操作时,使用 watch 更为合适。

示例

下面是一个示例,展示了 computed 和 watch 的应用:

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

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

这是一个简单的矩形面积计算组件。它声明了 widthheightareacount 四个数据属性,其中 area 是基于 widthheight 两个计算属性计算而来的,count 是一个整型变量,用于记录 widthheight 被改变的次数。组件还声明了一个 reset 方法,用于重置 widthheight 的值。

组件中,计算属性 area 会随着 widthheight 的变化而发生变化,而 count 属性则会在 watch 中重新计数。这两种不同的方式展示了 computed 和 watch 的不同之处。

总结

computed 和 watch 是 Vue.js 中两个常用的响应式数据处理方式,它们的作用是不同的,应用场景也不同。computed 适用于单纯的数据计算、格式化、过滤等场景,而 watch 适用于监听数据的变化,从而执行相应操作的场景。在实际使用中需要根据不同的场景选择合适的方式。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a4e78448841e9894152e03

纠错
反馈