欢迎光临
我们一直在努力

计算属性与侦听属性

计算属性

当我们声明一个计算属性reverseMessage时,我们提供的函数将用作property vm.reversedMessage 的getter函数:

vm.message = 'Goodbye'
console.log(vm.reversedMessage) // => 'eybdooG'

计算属性可以让我们像绑定普通的data property一样在模板中绑定计算属性,vue知道该计算属性的依赖项,并在其依赖项发生改变时,自身的绑定也会立即更新。我们使用声明的方式建立了这种依赖关系,因此计算属性的getter函数是没有副作用的。

再来强调一下:vue中computed属性默认为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]
    }
  }
}

还需要注意的是,不是说我们更改了getter里使用的变量,就会触发computed的更新,前提是computed里的值必须要在模板里使用才行。

侦听属性

侦听属性是vue对象的实例方法,可以通过vm.$watch绑定,通过侦听属性可以观察vue实力上的一个表达式或者一个函数计算结果的变化。回调函数得到的参数为旧值和新值,表达式只接受简单的键路径,对于更复杂的表达式用一个函数取代。

注意:在变更 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变更之前值的副本。

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

// 函数
vm.$watch(
  function () {
    // 表达式 `this.a + this.b` 每次得出一个不同的结果时
    // 处理函数都会被调用。
    // 这就像监听一个未被定义的计算属性
    return this.a + this.b
  },
  function (newVal, oldVal) {
    // 做点什么
  }
)
  • 选项:deep为了发现对象内部值的变化,可以在选项参数中指定 deep: true。注意监听数组的变更不需要这么做。
vm.$watch('someObject', callback, {
  deep: true
})
vm.someObject.nestedValue = 123
// callback is fired

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

vm.$watch('a', callback, {
  immediate: true
})
// 立即以 `a` 的当前值触发回调

注意在带有 immediate 选项时,你不能在第一次回调时取消侦听给定的 property。

// 这会导致报错
var unwatch = vm.$watch(
  'value',
  function () {
    doSomething()
    unwatch()
  },
  { immediate: true }
)

如果你仍然希望在回调内部调用一个取消侦听的函数,你应该先检查其函数的可用性:

var unwatch = vm.$watch(
  'value',
  function () {
    doSomething()
    if (unwatch) {
      unwatch()
    }
  },
  { immediate: true }
)
赞(0) 打赏
未经允许不得转载:散人研 » 计算属性与侦听属性
分享到: 更多 (0)

如果文章有不解或描述错误的地方,欢迎在评论区提问或指正!

评论 抢沙发

9 + 6 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏