技术干货首页投稿(暂停使用,暂停投稿)程序员

Vue.js——计算属性

2017-10-24  本文已影响0人  每木传情

计算属性

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

由上面的代码可以看出,双大括号里面的文本操作比较多,而且这样的形式可能会造成代码的冗余和繁复,所以vue提供了一个属性来操作这些复杂的逻辑。
我们先来看一个基本的例子:

<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('')
    }
  }
})

这里声明了一个计算属性reversedMessage,Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。

计算属性与方法的比较

methods: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}

你可以看出上面的方法结果与计算属性的结果一致,但是两者也有区别,计算属性是基于它们的依赖进行缓存的,就是说只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
而每当触发重新渲染时,调用方法将总会再次执行函数。

计算属性和watch(侦听属性)的比较

首先我们来看一个例子:

<div id="demo">{{ fullName }}</div>
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
    }
  }
})

其实我最先看到这个东西的时候真的不知道这个是个什么玩意儿,后来我尝试着用vm.firstName="444"改动了data里面的firstname,然后刷新页面发现了变化。本来fullNmae是'Foo Bar',我只是改动了firstName的值,所以watch的功能是监听数据的变化,当我改变firstName时,watch里面的firstNmae后面的函数执行。
但是上面的代码造成了很多重复,这时我们应该用计算属性。

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

setter和getter

计算属性可以有setter和getter

var vm = new Vue({
    el: '#demo',
    data: {
       firstName: 'Foo',
       lastName: 'Bar'
     },
     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='John ',vm.lastName='Doe'。

上一篇 下一篇

猜你喜欢

热点阅读