watch和computed的用法差异是什么样?

在模板中绑定表明式是足够方便的,不过它们其实只用于不难的操作。模板是为着描述视图的构造。在模板中放入太多的逻辑会让模板过重且难以保险。那就是怎么
Vue.js
将绑定表达式限制为3个表明式。要是必要多于八个表明式的逻辑,应当利用**总计属性**。

基本功例子

<div id="example">
  a={{ a }}, b={{ b }}
</div>

var vm = new
Vue({

  el: '#example',
  data: {
    a: 1
  },
  computed: {
    // 一个计算属性的 getter
    b: function () {
      // `this` 指向 vm 实例
      return this.a + 1
    }
  }
})

此地我们注明了3个测算属性 b。大家提供的函数将用作属性 vm.b
getter。

console.log(vm.b) // -> 2
vm.a = 2
console.log(vm.b) // -> 3
  • 1
  • 2
  • 3

  • 1
  • 2
  • 3

您能够打开浏览器的控制台,修改 vm。vm.bAngularJS, 的值始终取决于 vm.a 的值。

你可以像绑定普通属性一样在模板中绑定总计属性。Vue
知道 vm.b 依赖于 vm.a,因此当 vm.a 产生改变时,重视于 vm.b 的绑定也会更新。而且最妙的是大家是注明式地创造那种借助关系:总括属性的
getter
是根本无副作用的,因而也是简单测试和透亮的。

计量属性 vs. $watch

Vue.js 提供了3个形式 $watch,它用于观望Vue 实例上的数量变动。当1些数额须求依照别的数据变化时, $watch 很动人——
特别是只要您来自 AngularJS。可是,平日越来越好的诀借使应用总计属性而不是一个命令式的 $watch 回调。思考上面例子:

<div id="demo">{{fullName}}</div>
  • 1

  • 1

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  }
})

vm.$watch('firstName', function (val) {
  this.fullName = val + ' ' + this.lastName
})

vm.$watch('lastName', function (val) {
  this.fullName = this.firstName + ' ' + val
})

地点代码是命令式的重新的。跟总计属性相比:

var vm = new Vue({
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

那般更加好,不是吗?

计算 setter

总计属性暗中同意只是 getter,可是在急需时您也能够提供三个 setter:

// ...
computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}

当今在调用 vm.fullName = 'John Doe' 时,setter
会被调用,vm.firstName 和 vm.lastName 也会有相应更新。

有关总括属性背后的原理和技术细节详见算算属性的精深

相关文章