请问vue的计算属性“计算属性的 getter 函数是没有副作用 (side effect) 的...”这句话怎么理解?

心悦琴
  • 67

在模板中放入太多的逻辑会让模板过重且难以维护,因此对于任何复杂逻辑,都应当使用计算属性。

栗子🧨:

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})
结果:

Original message: "Hello"

Computed reversed message: "olleH"

这里我们声明了一个计算属性 reversedMessage。我们提供的函数将用作 property vm.reversedMessage 的 getter 函数:

console.log(vm.reversedMessage) // => 'olleH'
vm.message = 'Goodbye'
console.log(vm.reversedMessage) // => 'eybdooG'
你可以打开浏览器的控制台,自行修改例子中的 vm。vm.reversedMessage 的值始终取决于 vm.message 的值。

你可以像绑定普通 property 一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。而且最妙的是我们已经以声明的方式创建了这种依赖关系:????????计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。????????why?请赐教,不胜感激。

回复
阅读 432
2 个回答

这里的副作用指的是跟 Watch 比。

在 Watch 里通常你会修改某些数据、以实现数据联动的目的,这会使得数据变化产生难以追踪的问题 ———— “卧槽数据为啥变了、到底谁改的它”。

而 Computed Properties 里则不允许你修改数据(Lint 时会报错),由此带来的副作用自然也就没有了。一般来说可以认为它是个纯函数(Pure Function),所以说它容易测试和理解。

下面这个题主跟你有一样的困惑:
https://stackoverflow.com/que...

没有副作用,就是这个 getter 方法应该是一个纯函数,计算属性主要是用来 组合并返回既有的数据。这里副作用的意思应该是操作 dom ,更改外部的数据。但是是不是纯函数也取决于使用者。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏