news 2026/4/15 7:33:12

Vue 中的计算属性(computed)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 中的计算属性(computed)

Vue 中的计算属性(computed)

概述

计算属性是 Vue 中一个强大的特性,用于声明式地处理响应式数据的复杂逻辑。它基于 Vue 实例的响应式数据进行计算,并缓存计算结果,只有在依赖的响应式数据发生变化时才会重新计算。

基本用法

1. 定义计算属性

newVue({data(){return{firstName:'张',lastName:'三',quantity:2,price:100}},computed:{// 基本语法 - 计算属性的 getterfullName(){returnthis.firstName+' '+this.lastName},// 依赖多个数据源totalPrice(){returnthis.quantity*this.price}}})

2. 在模板中使用

<template><div><p>姓名:{{ fullName }}</p><p>总价:{{ totalPrice }}</p></div></template>

主要特性

1.缓存机制

计算属性会缓存计算结果,只有当依赖的响应式数据发生变化时才会重新计算。

computed:{// 这个计算属性会缓存结果now(){returnDate.now()// ❌ 错误示例:实际上不会更新,因为不依赖响应式数据},// 正确示例:依赖响应式数据reversedMessage(){returnthis.message.split('').reverse().join('')}}

2.Getter 和 Setter

计算属性默认只有 getter,但也可以提供 setter。

computed:{fullName:{// getterget(){returnthis.firstName+' '+this.lastName},// setterset(newValue){constnames=newValue.split(' ')this.firstName=names[0]this.lastName=names[names.length-1]}}}// 使用 setterthis.fullName='李 四'// 会自动更新 firstName 和 lastName

与方法的区别

计算属性 vs 方法

// 计算属性computed:{computedNow(){returnthis.message+' '+Date.now()// 只有当 message 变化时才会重新计算}}// 方法methods:{methodNow(){returnthis.message+' '+Date.now()// 每次调用都会重新计算}}

主要区别:

  • 计算属性有缓存,方法没有
  • 计算属性基于响应式依赖,方法不自动追踪依赖
  • 计算属性在模板中像属性一样使用,方法需要加括号调用

与侦听器(watch)的区别

适用场景对比

// 使用计算属性 - 适合同步计算computed:{fullName(){returnthis.firstName+' '+this.lastName}}// 使用侦听器 - 适合异步操作或副作用watch:{firstName(newVal,oldVal){// 执行异步操作或复杂逻辑this.fetchUserData(newVal)}}

实际应用示例

示例1:购物车计算

newVue({data(){return{cartItems:[{name:'商品A',price:100,quantity:2},{name:'商品B',price:200,quantity:1},{name:'商品C',price:50,quantity:3}]}},computed:{// 计算总价totalPrice(){returnthis.cartItems.reduce((sum,item)=>{returnsum+(item.price*item.quantity)},0)},// 计算商品总数totalItems(){returnthis.cartItems.reduce((sum,item)=>{returnsum+item.quantity},0)},// 是否有折扣资格(总价超过500)hasDiscount(){returnthis.totalPrice>500},// 折后价格finalPrice(){returnthis.hasDiscount?this.totalPrice*0.9:this.totalPrice}}})

示例2:列表过滤和排序

newVue({data(){return{products:[{name:'手机',price:2999,category:'电子产品'},{name:'衣服',price:299,category:'服装'},{name:'电脑',price:5999,category:'电子产品'},{name:'鞋子',price:399,category:'服装'}],selectedCategory:'',sortBy:'price',sortOrder:'asc'}},computed:{// 过滤产品filteredProducts(){if(!this.selectedCategory)returnthis.productsreturnthis.products.filter(product=>product.category===this.selectedCategory)},// 排序产品sortedProducts(){return[...this.filteredProducts].sort((a,b)=>{letresult=0if(a[this.sortBy]<b[this.sortBy])result=-1if(a[this.sortBy]>b[this.sortBy])result=1returnthis.sortOrder==='asc'?result:-result})},// 价格统计priceStats(){constprices=this.filteredProducts.map(p=>p.price)return{min:Math.min(...prices),max:Math.max(...prices),average:prices.reduce((a,b)=>a+b,0)/prices.length}}}})

最佳实践

1.保持纯函数

计算属性的 getter 应该是纯函数,不要有副作用。

// ✅ 正确computed:{validItems(){returnthis.items.filter(item=>item.isValid)}}// ❌ 避免computed:{processItems(){this.items.forEach(item=>{item.processed=true// 副作用!})returnthis.items}}

2.避免复杂计算

如果计算过于复杂,考虑拆分成多个计算属性或使用方法。

3.命名清晰

使用描述性的名称,反映计算属性的用途。

// ✅ 清晰computed:{isFormValid(){/* ... */},formattedDate(){/* ... */}}// ❌ 不清晰computed:{check(){/* ... */},format(){/* ... */}}

Vue 3 中的计算属性

在 Vue 3 的组合式 API 中:

import{ref,computed}from'vue'exportdefault{setup(){constfirstName=ref('张')constlastName=ref('三')// 只读计算属性constfullName=computed(()=>{returnfirstName.value+' '+lastName.value})// 可写计算属性constwritableFullName=computed({get:()=>firstName.value+' '+lastName.value,set:(newValue)=>{const[first,last]=newValue.split(' ')firstName.value=first lastName.value=last}})return{fullName,writableFullName}}}

常见注意事项

  1. 不要在计算属性中修改依赖的数据- 这可能导致无限循环
  2. 计算属性不能异步- 如果需要异步计算,考虑使用侦听器或方法
  3. 依赖追踪是自动的- 只追踪在 getter 中实际使用的响应式属性
  4. 避免在计算属性中执行高开销操作- 利用缓存特性优化性能

计算属性是 Vue 响应式系统的核心特性之一,合理使用可以大大简化代码逻辑,提高应用性能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 22:58:27

停车场管理|停车预约管理|基于Springboot+的停车场管理系统设计与实现(源码+数据库+文档)

停车场管理|停车场信息 目录 基于Springboot微信小程序的停车场管理小程序系统 一、前言 二、系统功能设计 三、系统实现 1 管理员功能实现 车辆停放管理 车辆驶出管理 停车费用管理 车位信息管理 2用户功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最…

作者头像 李华
网站建设 2026/4/10 20:45:15

AI行业应用全景解析:从短视频、设计到服务业的深度落地

引言&#xff1a;人工智能的“iPhone时刻”已至随着ChatGPT、Midjourney、Sora等生成式AI&#xff08;AIGC&#xff09;工具的爆发&#xff0c;人工智能不再仅仅是实验室里的算法模型&#xff0c;而是已经深入到了各行各业的生产流程中。从内容创作到工业设计&#xff0c;从客户…

作者头像 李华
网站建设 2026/4/14 15:09:55

学术化分析:The God Particle音频处理插件

CSDN&#xff1a;古方路杰出青年一.插件概述The God Particle 是一款专业级别的动态均衡&#xff08;Dynamic Equalizer&#xff09;与多频段压缩&#xff08;Multiband Compression&#xff09;复合式音频处理插件&#xff0c;旨在对立体声信号的频谱动态进行精细化调控。它融…

作者头像 李华
网站建设 2026/4/11 4:36:49

Python+django+vue3基于协同过滤推荐算法的影视热门电影推荐系统

目录开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;开发技术路线 开发语言&#xff1a;Python 框架&#xff1a;flask/django 开发软件&#xff1a;PyCharm/vscode 数据库&#xff1a;mysql…

作者头像 李华
网站建设 2026/4/11 20:16:09

强烈安利!本科生必用TOP9一键生成论文工具深度测评

强烈安利&#xff01;本科生必用TOP9一键生成论文工具深度测评 2026年学术写作工具测评&#xff1a;为何值得一看&#xff1f; 在当前高校教育日益注重学术规范与效率的背景下&#xff0c;本科生在撰写论文过程中常常面临选题困难、资料查找繁琐、格式不规范等问题。随着AI技术…

作者头像 李华
网站建设 2026/4/11 21:09:35

芯片设计企业如何通过百度富文本编辑器实现公式云端同步?

日期&#xff1a;2023年X月X日 角色&#xff1a;北京XX软件公司 全栈开发工程师 项目背景&#xff1a;客户要求在后台管理系统的文章发布模块新增三大功能&#xff1a; Word粘贴功能&#xff1a;支持从Word复制内容粘贴到UEditor&#xff0c;图片自动上传至内网单据存储服务器…

作者头像 李华