news 2026/9/24 2:10:04

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/9/20 7:32:47

偏远地区统计学学生就业难?靠远程工作,我找到了理想工作

作为一名就读于西部偏远城市高校的统计学学生&#xff0c;我曾深陷“毕业即失业”的焦虑。本地几乎没有对口的数据分析岗位&#xff0c;为数不多的统计相关工作集中在基层调查队&#xff0c;不仅年出差天数超200天&#xff0c;竞争还异常激烈&#xff0c;甚至有岗位因报名不足被…

作者头像 李华
网站建设 2026/9/23 16:41:01

国产信创环境下如何用百度编辑器导入PDF文件?

针对在 Vue2 UEditor .NET Core 环境中实现 Word/Excel/PPT/PDF 粘贴导入且图片自动上传 的需求&#xff0c;结合你的技术栈和云服务&#xff08;华为云 OBS&#xff09;&#xff0c;以下是可直接落地的开源解决方案&#xff1a; 一、核心方案&#xff1a;UEditor WordPast…

作者头像 李华
网站建设 2026/9/22 0:38:11

AI驱动的产业变革:短视频、设计与服务业的落地实践与技术解析

人工智能正从实验室快速渗透到产业毛细血管&#xff0c;在内容创作、视觉设计和服务交互等领域引发效率革命。本文通过12个真实落地案例&#xff0c;结合技术原理、代码实现与商业效果&#xff0c;系统剖析AI如何重塑短视频生产、设计流程与服务体验。从字节跳动的智能剪辑系统…

作者头像 李华
网站建设 2026/9/20 19:43:00

Python+django+vue3基于协同过滤推荐算法的家政服务系统

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

作者头像 李华
网站建设 2026/9/20 19:45:07

Python+django+vue3社区团购系统

目录PythonDjangoVue3社区团购系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;PythonDjangoVue3社区团购系统摘要 社区团购系统基于PythonDjango后端与Vue3前端构建&#xff0c;采用…

作者头像 李华
网站建设 2026/9/23 11:25:30

基于大数据爬虫+Hadoop的新闻媒体内容推荐与热点话题分析系统开发任务书

一、任务名称 基于大数据爬虫Hadoop的新闻媒体内容推荐与热点话题分析系统开发 二、任务目的 当前新闻媒体行业进入数字化转型深水区&#xff0c;信息过载与内容同质化问题突出&#xff0c;用户难以快速获取精准感兴趣的内容&#xff0c;媒体平台也缺乏对热点话题的实时捕捉、深…

作者头像 李华