计算属性

木木木大约 4 分钟Vue前端语法

计算属性

Vue.js是一款强大的JavaScript框架,提供了许多功能,其中包括计算属性。

什么是计算属性?

计算属性是Vue中一种便捷的属性,它能够根据已有的数据计算出新的数据。计算属性可以像普通属性一样在模板中使用,并且具有缓存功能,只有在依赖的数据发生变化时才会重新计算。

new Vue({
  data: {
    message: 'Hello'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 Vue 实例
      return this.message.split('').reverse().join('')
    }
  }
})

定义了一个计算属性reversedMessage,它的值是message反转后的字符串。

计算属性的用法

在Vue中定义一个计算属性很简单,只需要在Vue实例中添加一个computed对象即可。computed对象中包含了所有的计算属性。

Copy code
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!',
    firstName: 'Wade',
    lastName: 'Stago'
  },
  computed: {
    fullName: function() {
      return this.firstName + ' ' + this.lastName;
    }
  }
})

在模板中使用计算属性时,只需要像使用普通属性一样绑定即可。

<div id="app">
  <p>{{ message }}</p>
  <p>{{ fullName }}</p>
</div>

语法

计算属性有一个 getter 和一个可选的 setter。在计算属性的 getter 中,可以根据其他数据计算出值,并返回这个值。在 setter 中,可以监听计算属性的变化,并更新依赖的数据。

new Vue({
  data: {
    firstName: 'John',
    lastName: 'Doe'
  },
  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]
      }
    }
  }
})

定义了一个计算属性 fullName,它的 getter 返回 firstName 和 lastName 的拼接字符串,setter 则将传入的值按照空格分隔后更新 firstName 和 lastName。

使用场景

计算属性可以用于计算基于其他数据的值,例如:

  • 对数据进行过滤、排序、分组等操作
  • 格式化数据的显示方式
  • 根据用户输入进行实时搜索 另外,计算属性还可以与 v-model 指令结合使用,可以轻松地在表单中双向绑定计算属性。
<div id="app">
  <input v-model="fullName">
  <p>{{ fullName }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    firstName: 'John',
    lastName: 'Doe'
  },
  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]
      }
    }
  }
})
</script>

通过 v-model 指令将计算属性 fullName 与文本框双向绑定,当用户在文本框中输入值时,计算属性的 setter 将被触发,更新 firstName 和 lastName 的值,并重新计算 fullName 的值,最终将新的值显示在页面上。

实践要点

以下是一些在Vue中使用计算属性的最佳实践:

将复杂的逻辑放入计算属性

当某个数据需要复杂的逻辑才能计算出来时,可以将这个逻辑放入计算属性中。这样可以让模板保持简洁,同时也可以避免将复杂的逻辑写在模板中。

var vm = new Vue({
  el: '#app',
  data: {
    items: [1, 2, 3, 4, 5]
  },
  computed: {
    evenItems: function() {
      return this.items.filter(function(item) {
        return item % 2 === 0;
      });
    }
  }
})
<div id="app">
  <ul>
    <li v-for="item in evenItems">{{ item }}</li>
  </ul>
</div>

避免在计算属性中修改数据

计算属性是根据已有的数据计算出新的数据,不应该修改已有的数据。如果需要修改数据,应该使用方法或者触发事件。

计算属性要具有可读性

计算属性是用于计算新的数据的,应该具有可读性,不应该包含复杂的逻辑或者处理多个数据。如果需要处理多个数据或者包含复杂的逻辑,应该使用方法。

计算属性 vs 方法

计算属性和方法非常相似,它们都可以动态计算值并返回结果。但是,计算属性有一个重要的优势:缓存。

计算属性的值会被缓存,只有在它的依赖项发生变化时才会重新计算。这意味着如果多次访问计算属性,只有在它的依赖项发生变化时,才会重新计算。而方法每次都会被调用。

new Vue({
  data: {
    message: 'Hello'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 Vue 实例
      console.log('computed')
      return this.message.split('').reverse().join('')
    }
  },
  methods: {
    // 方法
    reverseMessage: function () {
      console.log('method')
      return this.message.split('').reverse().join('')
    }
  }
})

定义了一个计算属性reversedMessage和一个方法reverseMessage。如果多次调用计算属性或方法,可以看到计算属性只会打印一次日志,而方法会在每次调用时都打印一次日志。

总结

计算属性是 Vue 中非常有用的一个特性,它可以根据其他数据动态计算值,并且具有缓存的特性。我们可以将计算属性用于各种场景,如数据过滤、格式化、搜索等。另外,计算属性还可以与 v-model 指令结合使用,让我们可以轻松地在表单中双向绑定计算属性。

上次编辑于:
贡献者: perhapsdone