第4集丨Vue 江湖 —— 计算属性

news2024/9/24 21:07:56

目录

  • 一、基本使用
    • 1.1 在computed中定义
      • 1.1.1 案例
      • 1.1.2 控制台调用getter
      • 1.1.3 控制台中的data和computed
    • 1.2 缓存效果
    • 1.3 完整写法
      • 1.3.1 案例
      • 1.3.2 效果图
    • 1.4 简写形式
  • 二、案例的其他实现
    • 2.1 methods实现
    • 2.2 插值语法实现
  • 三、体会计算属性的好处
    • 3.1 复杂任务时
    • 3.2 使用计算属性
    • 3.3 computed vs methods
  • 四、计算属性汇总

计算属性关键词: computed。计算属性在处理一些复杂逻辑时是很有用的。

一、基本使用

1.1 在computed中定义

下面案例,在computed中定义了一个计算属性,名为:fullName,其所依赖的属性为:firstNamelastName

并且定义了getter,如果getter被调用,会打印出:get被调用了!

1.1.1 案例

<div id="root">
   	<div class="row">姓:<input type="text" v-model="firstName"></div>
    <div class="row">名:<input type="text" v-model="lastName"></div>
</div>
<script>
	const vm = new Vue({
	    el:'#root',
	    data:{
	        firstName: '小',
	        lastName: '三'
	    },
	    computed:{
	        fullName:{
	            get() {
	                console.log('get被调用了!');
	                // console.log(this);
	                return this.firstName+'-'+this.lastName
	            }
	        }
	    }
	    
	});
	</script>

1.1.2 控制台调用getter

打开控制台,输入vm 回车,会发现计算属性fullName已经在vm实例上了。并且会发现此时该属性的值,看不到,有三个点...,点击才能看到,也就是getter被调用了。

在这里插入图片描述

1.1.3 控制台中的data和computed

打开控制台,我们可以很方便的看到datacomputed的属性

在这里插入图片描述

1.2 缓存效果

下面案例中,get只会被调用一次,其余的会从缓存中读取。控制台只会打印出一次get被调用了!

<div id="root">
   	<div class="row">姓:<input type="text" v-model="firstName"></div>
    <div class="row">名:<input type="text" v-model="lastName"></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
</div>
<script>
	const vm = new Vue({
	    el:'#root',
	    data:{
	        firstName: '小',
	        lastName: '三'
	    },
	    computed:{
	        fullName:{
	            get() {
	                console.log('get被调用了!');
	                // console.log(this);
	                return this.firstName+'-'+this.lastName
	            }
	        }
	    }
	    
	});
	</script>

1.3 完整写法

  • 增加了setter的定义
  • 通过控制台修改计算属性fullName此时会看到setter被调用了,并修改了所依赖的属性firstNamelastName 。对于Vue来讲,data中的任何一个数据发生变化的时候,Vue的模板都会重新解析一遍。因此,由于这两个属性发生了变化,其对应getter就会被调用。

1.3.1 案例

<div id="root">
   	<div class="row">姓:<input type="text" v-model="firstName"></div>
    <div class="row">名:<input type="text" v-model="lastName"></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
    <div class="row">全名:<span>{{fullName}}</span></div>
</div>
<script>
	const vm = new Vue({
		el:'#root',
		data:{
			firstName: '小',
			lastName: '三'
		},
		computed:{
			fullName:{
				get() {
					console.log('get被调用了!');
					// console.log(this);
					return this.firstName+'-'+this.lastName
				},
				set(value) {
					console.log('set',value);
					const arr = value.split("-");
					this.firstName = arr[0];
					this.lastName = arr[1];
				}
			}
		}
		
	});
</script>

1.3.2 效果图

我们在控制台中,输入vm.fullName='李-四' 回车,就会看到如下效果。

在这里插入图片描述

1.4 简写形式

计算属性 一般不做修改。如果只读不改,计算属性就可以写成简写的形式。这时不再是一个对象了,而是用函数代替且就为get函数。

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

<script>
	const vm = new Vue({
		el:'#root',
		data:{
			firstName: '小',
			lastName: '三'
		},
		computed:{
			fullName() {
				console.log('get被调用了!');
				return this.firstName+'-'+this.lastName
			}
		}
		
	});
</script>

二、案例的其他实现

2.1 methods实现

methods中定义了fullName函数来实现

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

<script>
	const vm = new Vue({
		el:'#root',
		data() {
			// data中的任何一个数据发生变化的时候,Vue的模板都会重新解析一遍
			return {
				firstName: '小',
				lastName: '三'
			};
		},
		methods:{
			fullName(){
				// this就是vm实例
				// console.log(this);
				console.log("fullName函数被调用了!");
				return this.firstName+"-"+this.lastName;
			}
		}
	});
</script>

2.2 插值语法实现

通过直接在Vue模板里拼接来实现

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

<script>
	const vm = new Vue({
		el:'#root',
		data() {
			return {
				firstName: '小',
				lastName: '三'
			};
		},
	});
</script>

三、体会计算属性的好处

3.1 复杂任务时

如下代码是反转字符串的例子,这个时候,模板变的很复杂,不容易看懂和理解。

<div id="app">
  {{ message.split('').reverse().join('') }}
</div>

3.2 使用计算属性

对于上述问题,我们使用计算属性来解决。

<div id="app">
  <p>原始字符串: {{ message }}</p>
  <p>计算后反转字符串: {{ reversedMessage }}</p>
</div>
 
<script>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})
</script>

3.3 computed vs methods

我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。

可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

methods: {
  reversedMessage2: function () {
    return this.message.split('').reverse().join('')
  }
}

四、计算属性汇总

  1. 概念:所谓计算属性,就是要用的属性不存在,要通过已有的属性加工、计算生成一个全新的属性。对于Vue来说,data中配置的就是属性。计算属性data中定义的属性分开。
  2. 原理:底层借助了Object.defineProperty()方法提供的gettersetter
  3. get函数的作用
    a. 当有程序读取计算属性时,get就会被调用,且返回值就作为计算属性的值。即计算属性是实时计算的属性。
    b. Vue做了缓存,当所依赖的数据没有发生变化,读取的时候会从缓存中取值。不会调用get
    c. Vue已经将get中this维护好了,就是vm实例
  4. get函数什么时候执行?
    a. 初次读取时会执行一次
    b. 当依赖的数据发生变化时,会被再次调用
  5. set函数什么时候调用?
    a. 当计算属性被修改时被调用
  6. 优势:与methods实现相比,内部有缓存机制,效率更高,调试方便。
  7. 注意点
    a. 计算属性最终会出现在vm上,直接读取使用即可。
    b. 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
    c. 计算属性一般不做修改。这个时候,只读不改可以有简写的形式,不再是一个对象了,而是用函数代替且就为get函数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO模型-信号驱动IO

linux内核中存在一个信号SIGIO&#xff0c;这个信号就是用于实现信号驱动IO的。当应用程序中想要以信号驱动IO的模型读写硬件数据时&#xff0c;首先注册一个SIGIO信号的信号处理函数,当硬件数据就绪&#xff0c;硬件会发起一个中断&#xff0c;在硬件的中断处理函数中向当前进…

求解n阶勒让德多项式的值

描述 用递归方法求n阶勒让德多项式的值&#xff0c;递归公式为&#xff1a; 在主函数中输入一个整数n和一个实数x&#xff0c;调用函数 legendre(n,x)&#xff0c;并输出其返回值。 输入 第一行输入一个整数n&#xff0c;表示阶数&#xff1b;第二行输入一个实数x。 输出 …

增强型Web安全网关在银行的应用

销售&#xff0c;绝不是降低身份去取悦客户&#xff0c;而是像朋友一样给予合理的建议。你刚好需要&#xff0c;我刚好专业&#xff01;仅此而已&#xff01; 乔.吉拉德 健康的安全体系&#xff0c;还可以更完善 浙江某商业银行股份有限公司是一家成立多年的商业银行&#xf…

分布式异步任务处理组件(七)

分布式异步任务处理组件底层网络通信模型的设计--如图&#xff1a; 使用Java原生NIO来实现TCP通信模型普通节点维护一个网络IO线程&#xff0c;负责和主节点的网络数据通信连接--这里的网络数据是指组件通信协议之下的直接面对字节流的数据读写&#xff0c;上层会有另一个线程负…

装饰器模式(C++)

定义 动态(组合)地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。 一《设计模式》 GoF 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xf…

视频安防监控EasyCVR平台海康大华设备国标GB28181告警布防的报文说明

TSINGSEE青犀视频监控综合管理平台EasyCVR基于云边端协同&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台既具备传统安防视频监控的能力&#xff0c;比如&#xff1a;视频监控直播、云端录像、云存储、录像检索与回看、告警上报、平台级联、云台控制、语音对讲等&…

第一课-前提-Stable Diffusion 教程

学习 SD 的前提是电脑配置! SD 参考配置: 建议选择台式机 i5 CPU, 内存16GB,N卡 RTX3060, 8G显存以上的配置(最低配) 在此基础上的配置越高越好。 比如,cpu i7 更好,显卡能有 RTX4090 更好,32显存要能有最好,嘿嘿嘿。 如何查看自己的显卡配置? Win+R 输入 “dxdiag…

vue2-v-if和v-for的优先级是什么?

1、v-if和v-for的区别 作用&#xff1a; v-if指令用于条件性地渲染一块内容&#xff0c;这块内容只会在指令的表达式返回true值的时候被渲染。 v-for指令基于一个数组来渲染一个列表&#xff0c;v-for指令需要使用item in items 形式的特殊语法&#xff0c;其中&#xff0c;it…

自学(黑客)技术,从入门到精通!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

Vue3 模板语法简单应用

去官网学习-》 模板语法 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 模板语法</h1><h2>{{ msg }}</h2><h2>{{ textHtml }}</h2><h2 v-html"text…

【单运放RC振荡器1负反馈方波2正反馈正弦波方波】2021-12-9

缘由multisim运放芯片给一个连上电源另一个引脚打叉不能仿真-测试-CSDN问答 正反馈电阻影响转化阀值,负反馈电阻影响频率 固定负反馈为2时无法起震荡,电位器调节到2%可振荡且波形失真,电位器调节到0%且固定负反馈为2时才能正弦波输出

Spring Boot 集成Seata

Seata的集成方式有&#xff1a; 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-Spring-Boot-Starter演示&#xff1a; 第一步&#xff1a;下载Seata 第二步&#xff1a;为了更好看到效果&#xff0c;我们将Seata的数据存储改…

MyBatis 查询数据库之二(增、删、改、查操作)

目录 1. 配置打印 MyBatis 执行的SQL 2. 查询操作 2.1 通过用户 ID 查询用户信息、查询所有用户信息 (1) Mapper 接口 (2)UserMapper.xml 查询所有用户的具体实现 SQL (3)进行单元测试 3. 增加操作 3.1 在 mapper&#xff08;interface&#xff09;里面添加增加方法的声…

git仓库与本地暂存区的同步问题

向下同步 对于远程仓库的项目&#xff0c;初始化一个配置文件&#xff0c;配置远程仓库及相关信息&#xff0c;赋值远程仓库的地址&#xff0c;使用git pull命令即可拉取仓库代码。 git pull [remote_addr] 该部分完成向下同步 向上同步 向上同步时会遇到很多的问题&#xf…

viewerjs 如何新增下载图片功能(npm包补丁)

文章目录 先实现正常的效果实现下载图片改变viewerjs的build函数源码改变之后&#xff0c;执行npm i 之后node_modules源码又变回了原样 1、viwerjs所有功能都很完善&#xff0c;但唯独缺少了图片的下载 2、需求&#xff1a;在用viwerjs旋转图片后&#xff0c;可以直接下载旋转…

计算机视觉与图形学-神经渲染专题-Seal-3D(基于NeRF的像素级交互式编辑)

摘要 随着隐式神经表示或神经辐射场 (NeRF) 的流行&#xff0c;迫切需要与隐式 3D 模型交互的编辑方法&#xff0c;以完成后处理重建场景和 3D 内容创建等任务。虽然之前的作品从不同角度探索了 NeRF 编辑&#xff0c;但它们在编辑灵活性、质量和速度方面受到限制&#xff0c;无…

【CI/CD】图解六种分支管理模型

图解六种分支管理模型 任何一家公司乃至于一个小组织&#xff0c;只要有写代码的地方&#xff0c;就有代码版本管理的主场&#xff0c;初入职场&#xff0c;总会遇到第一个拦路虎 git 管理流程&#xff0c;但是每一个企业似乎都有自己的 git 管理流程&#xff0c;倘若我们能掌握…

深度学习之双线性插值

1、单线性插值 单线性插值是一种用于估计两个已知数据点之间未知点的方法。它基于线性关系&#xff0c;通过计算目标位置的值&#xff0c;使用已知点之间的线性函数进行插值。这在图像处理中常用于放缩、旋转等操作&#xff0c;计算简单&#xff0c;产生平滑结果&#xff0c;但…

zookeeper集群和kafka的相关概念就部署

目录 一、Zookeeper概述 1、Zookeeper 定义 2、Zookeeper 工作机制 3、Zookeeper 特点 4、Zookeeper 数据结构 5、Zookeeper 应用场景 &#xff08;1&#xff09;统一命名服务 &#xff08;2&#xff09;统一配置管理 &#xff08;3&#xff09;统一集群管理 &#xff08;4&a…