Vue:计算属性

Vue:计算属性

    • 计算属性
    • get
    • set


在模板中,有时候填入的值要依赖于多个属性计算得出。

例如使用姓和名拼出全名:

在这里插入图片描述

以上效果可以通过以下代码实现:

<div id="root">
	姓:<input type="text" v-model="firstName"> <br/><br/>
	名:<input type="text" v-model="lastName"> <br/><br/>
	全名:<span>{{firstName}}-{{lastName}}</span> <br/><br/>
</div>

<script type="text/javascript">
new Vue({
	el:'#root',
	data:{
		firstName:'张',
		lastName:'三',
	}
})
</script>

把输入框与数据进行双向绑定,在<span>内部进行模板渲染。这样当然没有问题,但是如果需要更加复杂的字符串拼接,就会很复杂。

除此之外,也可以通过在methods内部创建方法,最后直接调用方法得到字符串:

new Vue({
	el:'#root',
	data:{
		firstName:'张',
		lastName:'三'
	},
	methods: {
		fullName(){
			return this.firstName + '-' + this.lastName
		}
	}
})

fullName方法中,完成字符串拼接并返回,最后直接在模板中调用方法:

全名:<span>{{fullName()}}</span>

使用函数,可以处理更加复杂的情况,但是这样效率很低。

当模板中任意一个变量更新,模板中所有表达式都会被重写计算,如果firstNamelastName以外的属性改变了,也会调用fullName方法,但是结果是不变的。

示例:

<div id="root">
	other:<input type="text" v-model="other"> <br/><br/>
	姓:<input type="text" v-model="firstName"> <br/><br/>
	名:<input type="text" v-model="lastName"> <br/><br/>
	全名:<span>{{fullName()}}</span>
</div>

<script type="text/javascript">
	new Vue({
		el:'#root',
		data:{
			other: '其它',
			firstName:'张',
			lastName:'三'
		},
		methods: {
			fullName(){
				const name = this.firstName + '-' + this.lastName
				console.log("fullName更新为 " + name)
				return name
			}
		}
	})
</script>

现在增加了一个额外的other属性以及一个输入框,与other进行双向绑定。

每次调用fullName,都会输出自己被调用了,以及更新后的名称。

多次修改other框内部的内容:

在这里插入图片描述

此时fullName调用了18次,但是每一次fullName的值都是一样的,这会导致效率降低。


计算属性

为了兼顾效率以及复杂数据的处理,Vue推出了计算属性。

语法:

new Vue({
	computed:{
		计算属性:{
			// 函数
		}
	}
})

computed属性内部,可以配置多个计算属性,这些计算属性有getset方法,方法内可以使用data的值,来进行字符串拼接,数值计算等复杂行为。最后返回一个值,作为属性使用。


get

比如对姓名的拼接:

new Vue({
	el:'#root',
	data:{
		firstName:'张',
		lastName:'三',
	},
	computed:{
		fullName:{
			get(){
				return this.firstName + '-' + this.lastName
			}
		}
	}
})

以上代码定义了一个fullName计算属性,它的get方法返回一个拼接字符串,此处的this就是Vue实例,在实例下查找firstNamelastName,并拼接成值返回。

那么这个fullName计算属性如何使用?

既然叫计算属性,那么这就是一个属性,可以在模板中直接使用:

姓:<input type="text" v-model="firstName"> <br/><br/>
名:<input type="text" v-model="lastName"> <br/><br/>
全名:<span>{{fullName}}</span> <br/><br/>

计算属性最后也会被挂载到Vue实例下,与data下的属性用起来没有区别。

这种计算属性在效率上有两个优势:

  1. 在一次模板更新中,只会计算一次计算属性
  2. 只有计算属性依赖的其他属性改变,计算属性才会更新

在模板中,使用多次fullName

姓:<input type="text" v-model="firstName"> <br/><br/>
名:<input type="text" v-model="lastName"> <br/><br/>
全名:<span>{{fullName}}</span> <br/><br/>
全名:<span>{{fullName}}</span> <br/><br/>
全名:<span>{{fullName}}</span> <br/><br/>
全名:<span>{{fullName}}</span> <br/><br/>

输出结果:

在这里插入图片描述

可以看到,每次修改firstNamelastName,只会调用一次fullName方法,如果是之前的methods的方式实现字符串拼接,那么每次更新都会调用四次方法。

这是因为每次更新时,会把计算属性放到缓存中,如果后续再次遇到使用计算属性的地方,直接去缓存取用。

和之前一样,加一个无关的输入选项:

other:<input type="text" v-model="other"> <br/><br/>
姓:<input type="text" v-model="firstName"> <br/><br/>
名:<input type="text" v-model="lastName"> <br/><br/>
全名:<span>{{fullName}}</span> <br/><br/>

在这里插入图片描述

首先更新姓名,正常调用fullName了,后续更新other的值,不再触发fullName方法了。

因为other属性不是fullName依赖的属性,这个属性更新时不会重新计算fullName,这带来了很大的效率提升。


set

除了可以使用data下已有的数据计算值,计算属性还可以实现双向数据绑定,这依赖于set方法。

示例:

new Vue({
	el:'#root',
	data:{
		firstName:'张',
		lastName:'三',
	},
	computed:{
		fullName:{
			get(){
				return this.firstName + '-' + this.lastName
			},
			set(value){
				console.log('set 被调用',value)
				const arr = value.split('-')
				this.firstName = arr[0]
				this.lastName = arr[1]
			}
		}
	}
})

以上代码给fullName定义了一个set方法,只要fullName被改变,就会反过来修改firstNamelastName的值。

由于规定输入值必须是firstName-lastName,此时使用-作为分隔符进行split,再设置到this.firstNamethis.lastName中。

修改一下HTML样式:

姓:<input type="text" v-model="firstName"> <br/><br/>
名:<input type="text" v-model="lastName"> <br/><br/>
全名:<input type="text" v-model="fullName"> <br/><br/>

fullName也进行了双向数据绑定,这样就可以修改fullName的值了。

输出结果:

在这里插入图片描述

在下面的框把张-三改为李-四,调用了两次set,并且上面的输入框的值也改变了,说明成功通过fullName反向影响了firstNamelastName的值。

总结一下:

  1. 计算属性可以基于现有的data内的属性,进行复杂的计算,返回一个值
  2. 计算属性也是一个属性,可以直接在模板访问
  3. 计算属性效率比mthods高,只有依赖的属性被修改,才会调用,一次模板更新,最多计算一次计算属性
  4. 计算属性可以设置set,反过来影响依赖的data下的属性

最后,计算属性还有简写形式,如果计算属性没有set方法:

new Vue({
	computed:{
		fullName:{
			get(){
				return this.firstName + '-' + this.lastName
			}
		}
	}
})

此时可以把get方法一起省略,计算属性本身作为一个方法:

new Vue({
	computed:{
		fullName(){
			return this.firstName + '-' + this.lastName
		}
	}
})

两者是等效的。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909193.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP不良事件上报系统源码,医院安全不良事件管理系统,基于 vue2+element+ laravel框架开发

不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…

PL端:LED闪烁

实验环境 vivado2024.1 实验任务 LED闪烁 引脚关系 硬件配置 新建一个vivado实验 创建 Verilog HDL 文件点亮 LED 点击 Project Manager 下的 Add Sources 图标&#xff08;或者使用快捷键 AltA&#xff09; 编辑led.v module led(input sys_clk,input rst_n,outp…

摘要、数字签名、对称加密、非对称加密综合应用示例以及技术原理说明

图&#xff1a;介绍了数字信封的安全传输过程 关键术语 散列&#xff1a;Hash&#xff08;哈希&#xff09;&#xff0c;一般翻译做散列、杂凑&#xff0c;是把任意长度的输入&#xff08;数据信息&#xff09;通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值…

美股集体收跌:汇盈策略股票交易特朗普、哈里斯概念股一同上涨

查查配分析随着美国大选进入最后倒计时,三大指数在多数投资者保持观望的状态下集体收跌。美债收益率集体回落,十年期美债收益率跌超8个基点至4.29%。 截至周一收盘,标普500指数跌0.28%,报5712.69点;纳斯达克指数跌0.33%,报18179.98点;道琼斯工业指数跌0.61%,报41794.6点。 汇…

力扣最热一百题——验证二叉搜索树

目录 题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 二叉搜索树的要求 解法一&#xff1a;采用中序遍历 中序遍历的定义 为什么二叉搜索树的中序遍历是严格递增的 二叉搜索树&#xff08;BST&#x…

golang 实现 bitcoin内核:编码实现椭圆曲线上的点

比特币在很大程度上依赖于一个称为椭圆曲线的数学对象&#xff0c;如果没有这个数学结构&#xff0c;比特币就像海滩上的城堡&#xff0c;随时可能崩溃。什么是椭圆曲线&#xff0c;它的方程是这样的&#xff1a;y^2 x^3 ax b&#xff0c;它的形状就像下面这样&#xff1a; …

[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的DjangoVue3在线考试系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的DjangoVue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 本论文提出并实现了一种基于Python…

API网关 - JWT认证 ; 原理概述与具体实践样例

API网关主要提供的能力&#xff0c;就是协议转换&#xff0c;安全&#xff0c;限流等能力。 本文主要是分享 如何基于API网关实现 JWT 认证 。 包含了JWT认证的流程&#xff0c;原理&#xff0c;与具体的配置样例 API网关认证的重要性 在现代Web应用和微服务架构中&#x…

【保姆级教程】实操 Linux 磁盘管理:硬盘选型 分区挂载

最近&#xff0c;Linux 服务器自带的固态硬盘&#xff0c;空间告警&#xff0c;急需加上一块新的硬盘来救急。 今日分享&#xff0c;系统梳理下 Linux 下挂载磁盘的详细步骤和注意事项&#xff0c;方便日后翻阅&#xff0c;也给有类似需求的小伙伴一点帮助。 1. SSD&#xff…

平衡二叉树(递归)

给定一个二叉树&#xff0c;判断它是否是 平衡二叉树.平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4…

雷池社区版新版本功能防绕过人机验证解析

前两天&#xff0c;2024.10.31&#xff0c;雷池社区版更新7.1版本&#xff0c;其中有一个功能&#xff0c;新增请求防重放 更新记录&#xff1a;hhttps://docs.waf-ce.chaitin.cn/zh/%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95 仔细研究了这个需求&#xff0c;…

黑龙江某涝区泵闸站自动化、信息化改造项目案例

项目背景 黑龙江某地区紧邻松花江&#xff0c;雨季时降雨量增大&#xff0c;排水渠水位上涨&#xff0c;如果出现排涝不及时&#xff0c;水位过高时会漫入周边农田&#xff0c;引发洪涝灾害&#xff0c;对作物生长造成重大损害。为应对这一问题&#xff0c;自今年起&#xff0c…

Java 多线程(八)—— 锁策略,synchronized 的优化,JVM 与编译器的锁优化,ReentrantLock,CAS

前言 本文为 Java 面试小八股&#xff0c;一句话&#xff0c;理解性记忆&#xff0c;不能理解就死背吧。 锁策略 悲观锁与乐观锁 悲观锁和乐观锁是锁的特性&#xff0c;并不是特指某个具体的锁。 我们知道在多线程中&#xff0c;锁是会被竞争的&#xff0c;悲观锁就是指锁…

【Spring IOC】实现一个简单的 Spring 容器

1. 理解知识 Spring 容器的作用 Spring 容器是Spring的核心&#xff0c;用来管理Bean对象的。容器将创建对象&#xff0c;把它们连接在一起&#xff0c;配置它们&#xff0c;并管理他们的整个生命周期从创建到销毁。 Bean 对象的管理 当一个 Bean 对象交给 Spring 容器管理…

非线性数据结构之图

一、有向图&#xff08;Directed Graph&#xff09; 1. 定义 有向图是一个由顶点&#xff08;节点&#xff09;和有方向的边&#xff08;弧&#xff09;组成的图。在有向图中&#xff0c;每条边都有一个起点和一个终点&#xff0c;表示从一个顶点到另一个顶点的关系。 2. 特…

【算法】——滑动窗口专题

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;长度最小的子数组 二&#xff1a;无重复字符的最长子串 三&#xff1a;最大连续1的个…

目前主流的人工智能学习框架有哪些?

随着人工智能&#xff08;AI&#xff09;技术的蓬勃发展&#xff0c;越来越多的AI学习框架相继推出&#xff0c;成为开发者、研究人员和企业构建机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09;模型的首选工具。AI学习框架不仅提供了丰富的工具库和函…

揭开自然语言处理(NLP)的神秘面纱

时间&#xff1a;2024年 11月 05日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术” &#xff0c;我是小蒋&#xff01;。小蒋最近在学习清华大模型课程&…

C#:强大而优雅的编程语言

在当今的软件开发领域&#xff0c;C#作为一种广泛应用的编程语言&#xff0c;以其强大的功能、优雅的语法和丰富的生态系统&#xff0c;受到了众多开发者的喜爱。本文将深入探讨 C#的各个方面&#xff0c;展示它的魅力和优势。 一、C#的历史与发展 C#是由微软公司开发的一种面…

SQL CASE表达式与窗口函数

CASE 表达式是一种通用的条件表达式&#xff0c;类似于其他编程语言中的if/else语句。 窗口函数类似于group by&#xff0c;但是不会改变记录行数&#xff0c;能扫描所有行&#xff0c;能对每一行执行聚合计算或其他复杂计算&#xff0c;并把结果填到每一行中。 1 CASE 表达式…