Vue.js 中 computed 和 watch 的深度优化

阅读时长 6 分钟读完

Vue.js 是一款十分流行的前端框架,其中 computed 和 watch 是非常重要的两个概念。computed 可以用来定义计算属性,watch 可以用来监听数据的变化。本文将深入探讨这两个概念的使用方法和优化技巧。

computed

computed 是一种用于计算和返回值的函数。它可以缓存结果,只要没有相关的依赖值发生变化,那么计算结果就会被缓存起来。这意味着可以避免重复计算。其中,依赖值包括 data 中的属性和其他 computed 属性。

下面是一个计算商品总价的例子:

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

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

这个例子中,computed 属性 total 的值是由 price 和 quantity 计算得到的,只要这两个值不发生变化,total 的值就不会被重新计算。

在使用 computed 属性时,我们需要遵守以下几个原则:

  • computed 函数应该是纯函数(即,在计算时不应该修改其他组件的数据)
  • computed 函数应该是轻量级的,避免影响页面性能

如果计算复杂度较高,可能会影响页面性能。接下来,我们将介绍一些提高性能的技巧。

缓存

在默认情况下,computed 属性是所有依赖值都发生改变时才会被重新计算的。但是在某些情况下,我们需要在某个特定的值改变时才重新计算 computed 属性。Vue.js 提供了一个特殊的写法,用于实现缓存:

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

在这个例子中,我们定义了一个 computed 属性 cachedTotal,并在 watch 选项中监听 price 和 quantity 的变化,一旦它们中的任何一个变化,那么 cachedTotal 就会被重新计算。

计算属性的延迟执行

在某些情况下,性能问题可能会导致 computed 属性值被频繁重新计算,这会浪费计算资源。Vue.js 提供了一个延迟执行的方法,用于对性能进行优化:

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

在这个例子中,watch 函数就会在页面渲染后才会被执行,因此在修改 data 中的属性时计算属性不会被频繁重新计算。

watch

watch 是一个用于监听变化的选项。它可以在一个数据对象中监听一个特定的属性,以便在该属性值改变时触发回调函数。

下面是一个 watch 的例子:

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

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

在这个例子中,我们监听了 data 中的 items 属性,一旦它发生变化,watch 函数就会被触发,从而修改 result 属性的值。

当使用 watch 选项时,我们需要注意以下几点:

  • watch 函数可能会被频繁调用,因此需要避免对性能产生负面影响
  • watch 函数应该是纯函数,不应该改变其他组件的属性

防抖和节流

在某些情况下,watch 函数可能会被频繁调用,从而降低页面性能。Vue.js 提供了两种优化策略,即防抖和节流。

防抖是指在连续触发事件时,只会在间隔一定时间后执行函数。这意味着,如果在这段时间内事件再次触发,计时器就会重新开始。防抖的代码如下:

在这个例子中,我们定义了一个 debounce 函数,它会在 items 属性变化时被触发。如果在 500 毫秒内 items 属性再次变化,就会重新开始计时。

节流是指在一段时间内只执行一次函数。这意味着,如果在这段时间内函数被多次调用,只会触发一次。节流的代码如下:

在这个例子中,我们定义了一个 throttle 函数,它会在 items 属性变化时被触发。如果在 500 毫秒内 items 属性被多次触发,只会执行一次。

总结

computed 和 watch 是我们在 Vue.js 中经常使用的选项。在使用这些选项时,我们需要注意性能问题,遵循一些最佳实践:

  • computed 函数应该是纯函数,避免对其他组件产生负面影响
  • computed 函数应该是轻量级的,避免影响页面性能
  • watch 函数应该是纯函数,避免对其他组件产生负面影响
  • watch 函数应该避免被频繁调用,可以使用防抖或节流处理

如果我们能够遵守上述原则,那么 computed 和 watch 就能够为我们提供高效、优雅、可维护的代码。

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

纠错
反馈