@

1. 计算属性

有时为了方便,可在目标内使用表达式,但当表达式的逻辑太多时。可能会使得模板过重难以维护,如下:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>
当逻辑比较复杂时,应该使用计算属性:
<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的值始终改变的都是message中的值。

2. 计算属性缓存vs方法

使用方法也可以达到同样的目的,不同之处在于,计算属性是基于响应式依赖进行缓存的,只要message没有发生改变,访问reversedMessage就会立即返回之前的结果,但是函数就要再次执行才能返回reversedMessage的结果。
这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:

computed: {
  now: function () {
    return Date.now()
  }
}

3. 侦听器

计算属性在大多数情况下适合,但有时也需要侦听器。通常在数据变化时执行异步或者开销较大的操作时,比较适用。
vm.$watch( expOrFn, callback, [options] )
用法:
观察 Vue 实例上的一个表达式或者一个函数计算结果的变化。回调函数的参数为新值和旧值(注意:在变更 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变更之前值的副本。)。表达式只接受简单的键路径。对于更复杂的表达式,用一个函数取代。for example:

// 键路径
vm.$watch('a.b.c', function (newVal, oldVal) {
  // 做点什么
})

// 函数
vm.$watch(
  function () {
    // 表达式 `this.a + this.b` 每次得出一个不同的结果时
    // 处理函数都会被调用。
    // 这就像监听一个未被定义的计算属性
    return this.a + this.b
  },
  function (newVal, oldVal) {
    // 做点什么
  }
)

vm.$watch 返回一个取消观察函数,用来停止触发回调:

var unwatch = vm.$watch('a', cb)
// 之后取消观察
unwatch()

在选项参数指定deep:true,可以发现对象内部值的变化。

vm.$watch('someObject', callback, {
  deep: true
})
vm.someObject.nestedValue = 123
// callback is fired

在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调:

vm.$watch('a', callback, {
  immediate: true
})

// 立即以 a 的当前值触发回调
注意在带有 immediate 选项时,你不能在第一次回调时取消侦听给定的 property。

4. 计算属性vs侦听器

侦听属性是一种更通用的用来观察和响应vue实例上的数据变动的属性。
当一些数据可能随着另外一些数据的改变而改变时,很容易滥用watch.

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})

上面代码是命令式且重复的。将它与计算属性的版本进行比较:

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})
 posted on 2020-09-07 22:43  en、  阅读(290)  评论(0)    收藏  举报