news 2026/4/22 17:29:31

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/23 12:14:13

百度ueditor能否直接粘贴PPT演示文稿?跨平台兼容性测试

咱就是说&#xff0c;最近在安徽当前端程序员的我&#xff0c;头发快被甲方爸爸的需求薅秃了——刚接了个CMS企业官网外包&#xff0c;结果客户又扔来个“王炸需求”&#xff1a;要在UEditor里加Word/Excel/PPT/PDF导入功能&#xff0c;还要支持一键粘贴Word、Latex转MathML、图…

作者头像 李华
网站建设 2026/4/23 8:49:54

软件测试文档 留言板系统软件测试文档,留言板系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

软件测试文档 留言板系统软件测试文档&#xff0c;留言板系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 留言板系统(黑盒测试、白盒测试、单元测试、集成测试&#xff0c;性能测试&#xff0c;功能测试)

作者头像 李华
网站建设 2026/4/23 12:55:05

乡村旅游|乡村旅游小程序|基于java+微信小程序的乡村旅游小程序设计与实现(源码+数据库+文档)

旅游管理系统|乡村旅游|乡村旅游小程序 目录 基于java微信小程序的乡村旅游小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 1微信端功能实现 2 服务端功能实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码…

作者头像 李华
网站建设 2026/4/23 12:52:51

校友会2026中国各区域大学排名,北京大学、浙江大学、武汉大学等第一

1月12日&#xff0c;全国第三方大学评价研究机构艾瑞深校友会网(Cuaa.net)撰写完成、科学出版社即将公开出版的《2026校友会中国大学排名&#xff1a;高考志愿填报指南》最新发布校友会2026中国各区域大学排名、2026中国各区域民办大学排名、2026中国各区域职业技术大学排名和2…

作者头像 李华
网站建设 2026/4/23 12:57:57

Python+django+vue3基于协同过滤推荐算法的零食商城食品推荐系统

目录基于协同过滤推荐算法的零食商城食品推荐系统开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于协同过滤推荐算法的零食商城食品推荐系统 该系统采用PythonDjangoVue3技术栈&#xff…

作者头像 李华
网站建设 2026/4/21 13:23:58

教育信息化如何通过百度富文本编辑器实现WORD公式在线协作?

企业网站后台管理系统富文本编辑器功能扩展开发记录 一、需求分析与技术选型 作为新疆某软件公司的前端工程师&#xff0c;最近接到客户需求&#xff1a;在企业网站后台管理系统的文章发布模块中增加Word粘贴、Word文档导入和微信公众号内容粘贴功能。经过详细分析&#xff0…

作者头像 李华