Vue计算属性Computed

简介: Computed属性是Vue中的一个计算属性,是一种基于其它属性值计算而来的属性值,具有缓存机制,在依赖的属性值发生变化时会重新计算。

30. Vue计算属性Computed

1. 定义

Computed属性是Vue中的一个计算属性,是一种基于其它属性值计算而来的属性值,具有缓存机制,在依赖的属性值发生变化时会重新计算。

使用computed属性可以避免在模板中书写过多的计算逻辑,提高代码可读性和维护性。

下面是一个计算属性的示例:

<template>
  <div>
    <h3>单价: ¥{
  
  { price }}</h3>
    <input type="text" v-model="count" placeholder="请输入数量"><h3>总价: ¥{
  
  { totalPrice }}</h3>
  </div>
</template>
<!-- vue2 -->
<script>
export default {
    
    
  data() {
    
    
    return {
    
    
      price: 12,
      count: null
    }
  },
  computed: {
    
    
    totalPrice() {
    
    
      return this.price * this.count
    }
  }
}
</script>
<!-- vue3 -->
<script setup>
import {
    
     ref, computed } from "vue"
const price = ref(12)
const count = ref(0)
const totalPrice = computed(() => {
    
    
  return price.value * count.value
})
</script>

2. computed和methods对比

计算属性是有缓存的, 当我们多次使用计算属性时, 计算属性中的运算只会执行一次。如下图:

<template>
  <div>
    <div>{
  
  { fullName }}</div>
    <div>{
  
  { fullName }}</div>
    <div>{
  
  { fullName }}</div>
    <div>{
  
  { fullName }}</div>
    <div>{
  
  { fullName }}</div>
    <div>{
  
  { fullName }}</div>

    <div>{
  
  { getFullName() }}</div>
    <div>{
  
  { getFullName() }}</div>
    <div>{
  
  { getFullName() }}</div>
    <div>{
  
  { getFullName() }}</div>
    <div>{
  
  { getFullName() }}</div>
  </div>
</template>
<!-- vue2 -->
<script>
export default {
    
    
  data() {
    
    
    return {
    
    
      firstName: "Jack",
      lastName: "Ma"
    }
  },
  computed: {
    
    
    fullName() {
    
    
      console.log("computed获取fullname");
      return this.firstName + this.lastName;
    }
  },
  methods:{
    
    
    getFullName() {
    
    
      console.log("methods获取fullname");
      return this.firstName * this.lastName;
    }
  }
}
</script>
<!-- vue3 -->
<script setup>
import {
    
     ref, computed } from "vue"

const firstName = ref("J.K.")
const lastName = ref("Rowling")

const fullName = computed(() => {
    
    
    console.log("computed获取full");
    return firstName.value + lastName.value
})

const getFullName = function() {
    
    
  console.log("methods获取full");
  return firstName.value + lastName.value
}
</script>

computed缓存

3. Getter和Setter

计算属性默认是只读的,也就是只用到getter。当你尝试修改一个计算属性时,你会收到一个运行时警告。只在某些特殊场景中你可能才需要用到“可写”的属性,你可以通过同时提供 gettersetter 来创建:

<!-- vue2 -->
<script>
export default {
    
    
  data() {
    
    
    return {
    
    
      firstName: "Jack",
      lastName: "Ma"
    }
  },
  computed: {
    
    
    fullName: {
    
    
      // getter
      get() {
    
    
        return this.firstName + this.lastName;
      },
      // setter
      set(newValue) {
    
    
        // 注意:我们这里使用的是解构赋值语法
        [this.firstName, this.lastName] = newValue.split(' ')
      }
    }
  },  
  methods:{
    
    
    setNewName(){
    
    
      //设置值触发setter
      this.fullName = "Tom Mao"
      console.log(this.firstName, this.lastName);
    }
  }
}
</script>
<!-- vue3 -->
<script setup>
import {
    
     ref, computed } from "vue"

const firstName = ref("J.K.")
const lastName = ref("Rowling")

const fullName = computed({
    
    
  get() {
    
    
    return firstName.value + lastName.value
  },
  set(newValue) {
    
    
    [firstName.value, lastName.value] = newValue.split(' ')
  }
})

const setNewName = function() {
    
    
  fullName.value = "John Doe"
}
</script>

4. Getter 不应有副作用

需要注意的是,computed属性必须返回一个值,不能有副作用,如修改数据或触发异步操作等。如果需要有副作用的计算,可以使用watch属性。

相关文章
|
5天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
5天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
4天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
4天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
19天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
5天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
5天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
6天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
6天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
11天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发