vue---十分钟搞懂vue计算属性

article/2025/6/16 1:52:53

计算属性

前言

在这里插入图片描述
这篇文章介绍vue组件基础中的计算属性,文章持续输出中!
废话不多说,直接上刺刀!!

1. 什么是计算属性

计算属性本质上就是一个 function 函数,它可以实时监听 data 中数据的变化,并 return 一个计算后的新值,

供组件渲染 DOM 时使用。

2. 如何声明计算属性

计算属性需要以 function 函数的形式声明到组件的 computed 选项中,示例代码如下:

<!-- 直接以属性的方式使用 -->
<template>{{ count }}
</template><script>
export default {computed:{<!-- 以函数的方式定义 -->count(n) {return n+2}})return i},}
}
</script>

注意:计算属性侧重于得到一个计算的结果,因此计算属性中必须有 return 返回值!

3. 计算属性的使用注意点

① 计算属性必须定义在 computed 节点中

② 计算属性必须是一个 function 函数

③ 计算属性必须有返回值

④ 计算属性必须当做普通属性使用

4. 计算属性 vs 方法

相对于方法来说,计算属性会缓存计算的结果,只有计算属性的依赖项发生变化时,才会重新进行运算。因此

计算属性的性能更好。使用方法,在模板中使用多次会计算多次,而计算属性只计算一次,后面调用缓存。

5. 计算属性案例

案例需求,使用计算属性动态计算:

① 已勾选的商品总个数

② 已勾选的商品总价

③ 结算按钮的禁用状态

在这里插入图片描述

结算区域代码:

<!-- 结算区域 --><div class="settle-box"><!-- TODO: 1. 动态计算已勾选的商品的总数量 --><span>总数量:{{ count }}</span><!-- TODO: 2. 动态计算已勾选的商品的总价 --><span>总价:{{ price }}元</span><!-- TODO: 3. 动态计算按钮的禁用状态 --><button type="button" style="background-color: #f40;   border: 1px #f40 solid;" class="btn btn-		primary" :disabled="isdisabled">结算</button></div>

计算属性相关代码:

<script>
export default {computed:{// 已勾选商品的总数量count(x) {let i = 0this.fruitlist.forEach(x=>{if(x.state === true){i += x.count}})return i},// 已勾选商品的总价格price(x) {let p = 0this.fruitlist.forEach(x=>{if(x.state === true){p += x.price*x.count}})return p},// 结算按钮是否禁用isdisabled(){return this.price === 0}},
}

完整代码-FruitList.vue:

<template><div class="fruit-list-container"><!-- 水果列表 --><div class="fruit-list"><!-- 水果的 item 项 --><div class="fruit-item" v-for="item in fruitlist" :key="item.id"><div class="left"><div class="custom-control custom-checkbox"><input type="checkbox" class="custom-control-input" :id="item.id" v-model="item.state" /><label class="custom-control-label" :for="item.id"><!-- 水果图片 --><img :src="item.pic" alt="" class="thumb" /></label></div></div><div class="right"><!-- 水果名称 --><div class="top">{{ item.fruit }}</div><div class="bottom"><!-- 水果单价 --><span class="price">¥{{ item.price }}</span><div class="btns"><!-- 水果数量 --><button type="button" class="btn btn-light" @click="onSubClick(item.id)">-</button><span class="count">{{ item.count }}</span><button type="button" class="btn btn-light" @click="onAddClick(item.id)">+</button></div></div></div></div></div><!-- 结算区域 --><div class="settle-box"><!-- TODO: 1. 动态计算已勾选的商品的总数量 --><span>总数量:{{ count }}</span><!-- TODO: 2. 动态计算已勾选的商品的总价 --><span>总价:{{ price }}元</span><!-- TODO: 3. 动态计算按钮的禁用状态 --><button type="button" style="background-color: #f40;   border: 1px #f40 solid;" class="btn btn-primary" :disabled="isdisabled">结算</button></div></div>
</template><script>
export default {name: 'FruitList',data() {return {fruitlist: [{ id: 1, fruit: '香橼', pic: '/src/assets/images/1.jpg', price: 5, count: 1, state: true },{ id: 2, fruit: '柚子', pic: '/src/assets/images/2.jpg', price: 4.5, count: 1, state: false },{ id: 3, fruit: '橘子', pic: '/src/assets/images/3.jpg', price: 3, count: 1, state: false },{ id: 4, fruit: '橙子', pic: '/src/assets/images/4.jpg', price: 6, count: 1, state: false },{ id: 5, fruit: '粑粑柑', pic: '/src/assets/images/5.jpg', price: 6.5, count: 1, state: false },{ id: 6, fruit: '柠檬', pic: '/src/assets/images/6.jpg', price: 4, count: 1, state: false },{ id: 7, fruit: '青柠', pic: '/src/assets/images/7.jpg', price: 5.2, count: 1, state: false },],}},computed:{// 已勾选商品的总数量count(x) {let i = 0this.fruitlist.forEach(x=>{if(x.state === true){i += x.count}})return i},// 已勾选商品的总价格price(x) {let p = 0this.fruitlist.forEach(x=>{if(x.state === true){p += x.price*x.count}})return p},// 结算按钮是否禁用isdisabled(){return this.price === 0}},methods: {// 点击了数量 -1 按钮onSubClick(id) {const findResult = this.fruitlist.find(x => x.id === id)if (findResult && findResult.count > 1) {findResult.count--}},// 点击了数量 +1 按钮onAddClick(id) {const findResult = this.fruitlist.find(x => x.id === id)if (findResult) {findResult.count++}},},
}
</script><style lang="less" scoped>
.fruit-list-container {padding-bottom: 50px;
}
.fruit-item {display: flex;padding: 10px;& + .fruit-item {border-top: 1px solid #efefef;}.left {margin-right: 10px;.thumb {width: 100px;height: 100px;}}.right {display: flex;flex: 1;flex-direction: column;justify-content: space-between;.top {font-weight: bold;font-size: 13px;}.bottom {display: flex;justify-content: space-between;align-items: center;.price {font-size: 13px;font-weight: bold;color: red;}.btns {display: flex;align-items: center;.count {display: inline-block;width: 28px;text-align: center;}}}}
}.custom-control-label::before,
.custom-control-label::after {top: 47px;border-radius: 10px !important;
}.settle-box {height: 50px;position: fixed;bottom: 0;left: 0;width: 100%;background-color: #fff;border-top: 1px solid #efefef;display: flex;align-items: center;justify-content: space-between;padding: 0 10px;
}
</style>

完整代码-MyHeader.vue

<template><div class="header-container" :style="{ backgroundColor: bgcolor, color: color }">{{title || 'Header 组件'}}</div>
</template><script>
export default {name: 'MyHeader',props: ['title', 'bgcolor', 'color']
}
</script><style lang="less" scoped>
.header-container {height: 45px;background-color: pink;text-align: center;line-height: 45px;position: fixed;top: 0;left: 0;width: 100%;z-index: 999;
}
</style>

完整代码-App.vue

<template><div class="app-container"><my-header title="水果列表" color="white" bgcolor="#f40"></my-header><fruit-list></fruit-list></div>
</template><script>
import MyHeader from './components/my-header/MyHeader.vue'
import FruitList from './components/fruit-list/FruitList.vue'export default {name: 'MyApp',components: {MyHeader,FruitList,},
}
</script><style lang="less" scoped>
.app-container {padding-top: 45px;
}
</style>

完整打包源代码下载:

https://gitee.com/xingyueqianduan/vuecomputedfruit

写在最后

✨个人笔记博客✨

星月前端博客

http://blog.yhxweb.top/

 ✨原创不易,还希望各位大佬支持一下👍 点赞,你的认可是我创作的动力!⭐️ 收藏,你的青睐是我努力的方向!✏️评论,你的意见是我进步的财富!

http://chatgpt.dhexx.cn/article/OrgC3CGA.shtml

相关文章

四、Vue计算属性

01-计算属性的基本使用 1.1 计算属性 1、在模板中可以直接通过插值语语法显示一些data中的数据 2、但是在某些情况下&#xff0c;我们可能需要对数据进行一些转化后在显示&#xff0c;或者需要将多个数据结合起来进行显示 比如我们有firstName和lastName两个变量&#xff0c…

vue计算属性传参

最近很多小伙伴问到&#xff0c;计算属性怎么做到像普通函数一样传参呢&#xff1f; 针对这个问题&#xff0c;我们来看下下面的示例&#xff1a; <template><p>{{ getCallerName }}</p></template><script> export default {props: {callRecor…

08、VUE计算属性

1、计算属性简介 在原生的JavaScript中我们需要一个来自不同数的和的变量&#xff0c; 我们会使用let numab:这种写法&#xff0c;但是当a和b发生改变的 时候&#xff0c;num并不会自动修改&#xff0c;在vue中我们提供了计算属性 可以很好的解决这个问题。2、计算属性的语法 …

Vue-Vue的计算属性(computed)

1.理解 计算属性: 1.定义:要用的属性不存在&#xff0c;要通过已有属性计算得来 2.原理:底层接住了Object.defineproperty方法提供的getter和setter 3.get函数什么时候执行&#xff1f; 初次读取会执行一次 当以来的数据发生变化时会被再次调用 . 4.优势:与methods相比&…

Vue:计算属性

一&#xff0c;计算属性 通过前面的学习&#xff0c;我们可以在模板中双向绑定一些数据或表达式了。但是表达式如果过长&#xff0c;或逻辑更为复杂时&#xff0c;就会变得雕肿甚至难以阅读和维护。例如&#xff1a; <div id"example">{{ message.split().re…

Vue - 计算属性

1.vue计算属性-computed 一个数据, 依赖另外一些数据计算而来的结果 场景: 一个变量的值, 需要用另外变量计算而得来 语法: computed: {"计算属性名" () {return "值"} }注意1: 计算属性和data属性都是变量-不能重名. 用法和data相同 注意2: 函数内变量变…

汉罗塔(河内塔)问题的数学模型

问题引入&#xff1a; 给定A、B、C三个木桩子&#xff0c;给定由n个圆盘组成的塔&#xff08;n个圆盘满足从上到小大小递减的顺序套在A桩上&#xff09;&#xff0c;我们要做的是要将A桩子上的所有圆盘移动到B桩子上&#xff0c;要求每次只能移动一个圆盘&#xff0c;并且移动…

汉罗塔小游戏(自创)

汉诺塔是这样一种小游戏&#xff1a; 有三根柱子。一开始&#xff0c;若干张圆盘按照上小下大的顺序串在第一根柱子上。而游戏的目标为将所有圆盘全部移动到第三根柱子上去&#xff0c;并且仍要保持上小下大的顺序。而且要求&#xff1a; ①每次只能移动一张圆盘。 ②较大的圆盘…

C语言实现递归解决汉罗塔问题

1.问题&#xff1a; 汉诺塔(Tower of Hanoi&#xff09;&#xff0c;又称河内塔。是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新…

汉罗塔Python递归实现

count0 def fn(n,begin,end,middle):global count #global更新并以字典形式返回当前全部局部变量(如果不是全局变量在每次调用时初值会被清零)if n1:print("{}:{}-->{}".format(1,begin,end))count1else :fn(n-1,begin,middle,end)print("{}:{}-->{}&qu…

汉罗塔与青蛙跳台阶的递归实现(及扩展青蛙跳台阶)C语言从入门到入土(入门篇)(算法篇p2)

目录 题目&#xff1a;汉罗塔递归实现 思路 实现 题目&#xff1a;青蛙跳台阶递归实现 思路 实现 青蛙跳台阶问题的延伸 谁都不能阻挡你成为更优秀的人。 题目&#xff1a;汉罗塔递归实现 汉罗塔&#xff0c;用递归实现&#xff0c;有三个柱子n个盘子在a&#xff0c;要怎…

【递归】小学生都看得懂的汉罗塔问题

文章目录 前言最简模型规律分析分析总结结论解读 篇尾 前言 大梵天创造世界的时候做了三个金刚石柱子&#xff0c;在一根柱子上从上到下按照大小顺序摞着64骗黄金盘子&#xff0c;大梵天命令婆罗门把圆盘开始按大小顺序重新摆放在另外一个柱子上。在小圆盘上不能放大圆盘&…

汉罗塔问题(递归)

数据结构–汉罗塔 题目描述 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: 1.一…

多柱汉罗塔(python解法,带注释,注释为个人理解)

一、参考链接&#xff1a; 1、普通汉罗塔链接&#xff08;这边也是我的博文&#xff09;&#xff1a; (166条消息) 递归经典算法案例题&#xff08;汉罗塔、阶乘、斐波那契代码&#xff09;_南风~古草的博客-CSDN博客_汉罗塔 2、大佬的多柱汉罗塔博文&#xff08;有数学推…

累加—递归汉罗塔问题 (C语言)

一、累加—递归 一、代码 二、测试结果 二、汉罗塔问题 一、分析 二、代码 三、测试结果 三、总结 一、累加—递归 一、代码 //累加的递归实现 #include <stdio.h>int addTo(int n) {if(n < 0)return 0;else{return addTo(n-1)n;} } void addToTest() {int n…

【C语言】汉罗塔

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f300;大家可以叫我**小何或者小侠&#x1f300;** &#x1f534;我是一名普通的博客写作者&#x1f534; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助…

[C语言]C语言解决汉罗塔问题(初学者版)

目录 1、汉罗塔问题解决思路&#xff1a; 2、代码实现&#xff1a; 函数部分&#xff1a; 全部代码&#xff1a; 运行结果&#xff1a; 3、结语&#xff1a; 1、汉罗塔问题解决思路&#xff1a; 以三个为例&#xff0c;步骤为&#xff1a; 1.首先我们需要将其分成两个整体…

汉诺塔问题的详细讲解(python版)

2022.3.17 2022.11.15 增加次数计算一&#xff0e;抽象为数学问题&#xff1a; 从左到右有A、B、C三根柱子&#xff0c;其中A柱子上面有从小叠到大的n个圆盘&#xff0c;现要求将A柱子上的圆盘移到C柱子上去&#xff0c;期间只有一个原则&#xff1a;一次只能移到一个盘子且大…

Golang 汉罗塔问题

先用一般方法实现汉罗塔方法: 先确定三个"石柱" A B C 。n代表A柱起始圆盘数量 主函数: 结合栈来实现汉罗塔。 因为栈先进后出的特点 很适合汉罗塔。其实和上述方法本质一样,只不过添加了 栈的特性 这里定的栈最大容量为7,可以根据实际情况更改 栈的构造&#xff…

汉罗塔(递归分治)

Java代码如下 public class Hanoi {//操作步骤数private static int steps 1;public static void main(String[] args) {//盘子数目int diskNumber 4;doTowers(diskNumber, A, B, C);}private static void doTowers(int diskNum, char from , char via, char to){if (diskNum…