当前位置:首页 > VUE

vue实现computed

2026-01-08 00:11:51VUE

Vue 中 computed 的实现原理

computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式:

基本用法

在 Vue 组件中定义 computed 属性:

vue实现computed

export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  computed: {
    fullName() {
      return this.firstName + ' ' + this.lastName
    }
  }
}

实现机制

computed 属性通过以下方式工作:

  • 每个 computed 属性会被转换为一个 getter 函数
  • Vue 会为 computed 属性创建一个 watcher 实例
  • 当首次访问 computed 属性时,会执行计算并缓存结果
  • 只有当依赖的响应式数据变化时,才会重新计算

与 methods 的区别

computed 属性与方法的主要区别在于缓存机制:

vue实现computed

methods: {
  getFullName() {
    return this.firstName + ' ' + this.lastName
  }
}
  • computed 属性会缓存结果,只有依赖变化才重新计算
  • 方法每次调用都会执行函数体

计算属性 setter

computed 属性也可以定义 setter:

computed: {
  fullName: {
    get() {
      return this.firstName + ' ' + this.lastName
    },
    set(newValue) {
      const names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[1] || ''
    }
  }
}

在 Composition API 中使用

Vue 3 的 Composition API 提供了 computed 函数:

import { ref, computed } from 'vue'

const firstName = ref('John')
const lastName = ref('Doe')

const fullName = computed(() => {
  return firstName.value + ' ' + lastName.value
})

// 可写计算属性
const writableFullName = computed({
  get() {
    return firstName.value + ' ' + lastName.value
  },
  set(newValue) {
    [firstName.value, lastName.value] = newValue.split(' ')
  }
})

性能优化建议

  • 对于复杂计算,优先使用 computed 而非 methods
  • 避免在 computed 中执行副作用操作
  • 对于不依赖响应式数据的计算,使用普通函数更高效
  • 大型项目可考虑使用 memoization 技术进一步优化

标签: vuecomputed
分享给朋友:

相关文章

vue实现管道

vue实现管道

Vue 中实现管道(Pipe)功能 在 Vue 中可以通过过滤器(Filters)或计算属性(Computed Properties)实现类似管道的功能,将数据经过多个处理步骤后输出。 使用过滤器(…

vue 实现注册

vue 实现注册

Vue 实现注册功能 注册功能通常包括表单验证、数据提交和用户反馈。以下是实现注册功能的步骤: 1. 创建注册表单组件 在 Vue 项目中创建一个注册表单组件,包含用户名、邮箱、密码等输入字段。…

vue实现定时

vue实现定时

Vue 实现定时功能的方法 使用 setInterval 和 clearInterval 在 Vue 中可以通过 setInterval 和 clearInterval 实现定时功能。在组件的 mou…

vue toast实现

vue toast实现

Vue Toast 实现方法 使用第三方库(推荐) 安装 vue-toastification 库,这是一个功能丰富且轻量级的 Vue Toast 插件。 npm install vue-toas…

vue 分页 实现

vue 分页 实现

Vue 分页实现方法 使用第三方库(如 Element UI) Element UI 提供了现成的分页组件 el-pagination,适合快速集成。 安装 Element UI: npm ins…

vue实现伸缩

vue实现伸缩

Vue实现伸缩功能的方法 使用CSS过渡和Vue的v-if或v-show 通过CSS的transition属性结合Vue的条件渲染指令(v-if或v-show)可以实现元素的伸缩效果。定义一个CSS类…