Vue核心 计算属性 侦听属性

news2024/9/21 12:41:27

1.9.计算属性

1.插值语法实现

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>姓名案例_插值语法实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
		姓:<input type="text" v-model="firstName"> <br/>
		名:<input type="text" v-model="lastName"> <br/>
		全名:<span>{{ firstName }}-{{ lastName }}</span>
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false
		
		new Vue({ 
			el: '#root',  	  
			data:{ 
				firstName:'张', 
				lastName:'三'
			}
		});
    </script>
</body>
</html>

在这里插入图片描述

2.method实现

数据发生变化,模板就会被重新解析

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>姓名案例_methods实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
		姓:<input type="text" v-model="firstName"> <br/>
		名:<input type="text" v-model="lastName"> <br/>
		全名:<span>{{ fullName() }}</span>
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false
		
		new Vue({ 
			el: '#root',  	  
			data:{ 
				firstName:'张', 
				lastName:'三'
			},
			methods: {
				fullName() {
					return this.firstName + '-' + this.lastName;
				}
			}
		});
    </script>
</body>
</html>

3.computed计算属性

  1. 定义: 要用的属性不存在,需要通过已有属性计算得来
  2. 原理: 底层借助了Objcet.defineproperty()方法提供的gettersetter
  3. get函数什么时候执行?
    1. .初次读取时会执行一次
    2. 当依赖的数据发生改变时会被再次调用
  4. 优势: 与methods实现相比,内部有缓存机制(复用),效率更高,调试方便
  5. 备注
    1. 计算属性最终会出现在vm上,直接读取使用即可
    2. 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
    3. 如果计算属性确定不考虑修改,可以使用计算属性的简写形式
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>姓名案例_计算属性实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
	<!-- 
	计算属性:
		1.定义: 要用的属性不存在,需要通过已有属性计算得来
		2.原理: 底层借助了Objcet.defineproperty()方法提供的getter和setter
		3.get函数什么时候执行?
			a.初次读取时会执行一次
			b.当依赖的数据发生改变时会被再次调用
		4.优势: 与methods实现相比,内部有缓存机制(复用),效率更高,调试方便
		5.备注
			a.计算属性最终会出现在vm上,直接读取使用即可
			b.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
			c.如果计算属性确定不考虑修改,可以使用计算属性的简写形式
	 -->
	 
    <!-- 准备好一个容器 -->
    <div id="root">
		姓:<input type="text" v-model="firstName"> <br/>
		名:<input type="text" v-model="lastName"> <br/>
		测试:<input type="text" v-model="x"> <br/>	<!-- 这里修改不会调 fullName的get方法-->
		全名:<span>{{fullName}}</span>
		<!-- 全名:<span>{{fullName}}</span> <br/> -->
		<!-- 全名:<span>{{fullName}}</span> <br/> -->
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false
		
		new Vue({ 
			el: '#root',  	  
			data:{ 
				firstName:'张', 
				lastName:'三',
				x:'你好'
			},
			computed: {
				// 完整写法
				fullName: { 
					// get有什么作用? 当有人读取fulIName时,get就会被调用,且返回值就作为fullName的值
					// get什么时候调用? 1.初次读取fulName时。2.所依赖的数据发生变化时。
					get() { 
						console.log('get被调用了');
						console.log(this);	// 此处的this是vm
						return this.firstName + '-' + this.lastName;
					}, 
						
					// get什么时候调用? 当fullName被修改时
					set(value) { 
						console.log('set', value);
						const arr = value.split('-');
						this.firstName = arr[0];
						this.lastName = arr[1];
					} 
				}
			}
		});
    </script>
</body>
</html>

计算属性简写

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>姓名案例_计算属性实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
		姓:<input type="text" v-model="firstName"> <br/>
		名:<input type="text" v-model="lastName"> <br/>
		全名:<span>{{fullName}}</span>
    </div>

    <script type="text/javascript">
        // 阻止vue在启动时生成生产提示
        Vue.config.productionTip = false
		
		new Vue({ 
			el: '#root',  	  
			data:{ 
				firstName:'张', 
				lastName:'三'
			},
			computed: {
				// 完整写法
				// fullName: { 
				// 	get() { 
				// 		console.log('get被调用了');
				// 		console.log(this);	// 此处的this是vm
				// 		return this.firstName + '-' + this.lastName;
				// 		}, 
						
				// 	// get什么时候调用? 当fullName被修改时
				// 	set(value) { 
				// 		console.log('set', value);
				// 		const arr = value.split('-');
				// 		this.firstName = arr[0];
				// 		this.lastName = arr[1];
				// 	} 
				// }
				
				// 简写
				fullName(){
					console.log('get被调用了');
					console.log(this);	// 此处的this是vm
					return this.firstName + '-' + this.lastName;
				}
			}
		});
    </script>
</body>
</html>

1.10.侦听属性

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>天气案例</title>
	<!-- 引入Vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
	<!-- 准备好一个容器 -->
	<div id="root">
		<h2>今天天气很{{info}}</h2>
		<!-- 绑定事件的时候: @xxx="yyy" yyy可以写一些简单的语句 -->
		<!-- <button @click="isHot = !isHot ">切换天气</button> -->
		<button @click="changeWeather">切换天气</button>
	</div>

	<script type="text/javascript">
		// 阻止vue在启动时生成生产提示
		Vue.config.productionTip = false;

		new Vue({
			el: '#root',
			data: {
				isHot: true
			},
			methods: { 
				changeWeather() { 
					this.isHot = !this.isHot 
				} 
			},
			computed: { 
				info() { 
					return this.isHot ? '炎热' : '凉爽' 
				} 
			}
		});
	</script>
</body>
</html>

在这里插入图片描述

1.10.1. 侦听属性基本用法

watch监视属性

  1. 当被监视的属性变化时,回调函数自动调用,进行相关操作
  2. 监视的属性必须存在,才能进行监视,既可以监视data,也可以监视计算属性
  3. 配置项属性immediate:false改为 true,则初始化时调用一次** handler(newValue,oldValue)**
  4. 监视有两种写法
    1. 创建Vue时传入**watch: {}**配置
    2. 通过**vm.$watch()**监视
<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>天气案例_监视属性</title>
	<!-- 引入Vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
	<!-- 
		监视属性watch:
			1.当被监视的属性变化时,回调函数自动调用,进行相关操作
			2.监视的属性必须存在,才能进行监视!!
			3.监视的两种写法:
				(1).new Vue时传入watch配置
				(2).通过vm.$watch监视
	 -->
	 
	<!-- 准备好一个容器 -->
	<div id="root">
		<h2>今天天气很{{info}}</h2>
		<button @click="changeWeather">切换天气</button>
	</div>

	<script type="text/javascript">
		// 阻止vue在启动时生成生产提示
		Vue.config.productionTip = false;

		const vm = new Vue({
			el: '#root',
			data: {
				isHot: true
			},
			methods: { 
				changeWeather() { 
					this.isHot = !this.isHot 
				} 
			},
			computed: { 
				info() { 
					return this.isHot ? '炎热' : '凉爽' 
				} 
			},
			
			// 监视方式创建方式一
			// watch:{
			// 	isHot:{
			// 		immediate:true,	// 初始化时让handler调用一下
			// 		// handler什么时候调用? 当isHot发生改变时
			// 		handler(newValue,oldValue){
			// 			console.log('isHot被修改了',newValue,oldValue);
			// 		}
			// 	}
			// }
		});
		
		// 监视方式创建方式二
		vm.$watch('isHot', {
			immediate:true,	// 初始化时让handler调用一下
			// handler什么时候调用? 当isHot发生改变时
			handler(newValue,oldValue){
				console.log('isHot被修改了',newValue,oldValue);
			}
		})
	</script>
</body>
</html>

1.10.2. 深度侦听

  1. Vue中的watch默认不监测对象内部值的改变(一层)
  2. watch中配置deep:true可以监测对象内部值的改变(多层)

注意

  1. Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以
  2. 使用watch时根据监视数据的具体结构,决定是否采用深度监视
<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>天气案例_深度监视</title>
	<!-- 引入Vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
	<!-- 
		深度监视:
			(1).Vue中的watch默认不监测对象内部值的改变 (一层)
			(2).配置deep:true可以监测对象内部值改变(多层)
		备注:
			(1).Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以
			(2).使用watch时根据数据的具体结构,决定是否采用深度监视。
	 -->
	
	<!-- 准备好一个容器 -->
	<div id="root">
		<h2>今天天气很{{info}}</h2>
		<button @click="changeWeather">切换天气</button>
		
		<hr/>
		
		<h3>a的值是:{{ numbers.a }}</h3>
		<button @click="numbers.a++">点我让a+1</button>
		<h3>b的值是:{{ numbers.b }}</h3>
		<button @click="numbers.b++">点我让b+1</button>
		<button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
		{{numbers.c.d.e}}
	</div>

	<script type="text/javascript">
		// 阻止vue在启动时生成生产提示
		Vue.config.productionTip = false;

		const vm = new Vue({
			el: '#root',
			data: {
				isHot: true,
				numbers: {
					a: 1, 
					b: 1, 
					c: {
						d: {
							e: 100
						}
					}
				}
			},
			methods: { 
				changeWeather() { 
					this.isHot = !this.isHot 
				} 
			},
			computed: { 
				info() { 
					return this.isHot ? '炎热' : '凉爽' 
				} 
			},
			
			// 监视方式创建方式一
			watch:{
				isHot:{
					// handler什么时候调用? 当isHot发生改变时
					handler(newValue,oldValue){
						console.log('isHot被修改了',newValue,oldValue);
					}
				},
				
				// 监视多级结构中某个属性的变化
				// 'numbers.a':{
				// 	handler(){
				// 		console.log('a被改变了');
				// 	}
				// }
				
				// 监视多级结构中所有属性的变化
				numbers: { 
					deep: true, 
					handler() { 
						console.log('numbers改变了') 
					} 
				}
			}
		});
	</script>
</body>
</html>

在这里插入图片描述

1.10.3. 侦听属性简写

如果监视属性除了handler没有其他配置项的话,可以进行简写

<!DOCTYPE html>
<head>
	<meta charset="UTF-8">
	<title>天气案例_监视属性_简写</title>
	<!-- 引入Vue -->
	<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
	<!-- 准备好一个容器 -->
	<div id="root">
		<h2>今天天气很{{info}}</h2>
		<button @click="changeWeather">切换天气</button>
	</div>

	<script type="text/javascript">
		// 阻止vue在启动时生成生产提示
		Vue.config.productionTip = false;

		const vm = new Vue({
			el: '#root',
			data: {
				isHot: true
			},
			methods: { 
				changeWeather() { 
					this.isHot = !this.isHot 
				} 
			},
			computed: { 
				info() { 
					return this.isHot ? '炎热' : '凉爽' 
				} 
			},
			
			watch:{
				// 正常写法
				// isHot:{
				// 	// immediate:true, //初始化时让handler调用一下
				// 	handler(newValue,oldValue){
				// 		console.log('isHot被修改了',newValue,oldValue);
				// 	}
				// }
				
				// 简写
				isHot(newValue, oldValue) { 
					console.log('isHot被修改了', newValue, oldValue, this) 
				}
			}
		});
		
		// 正常写法
		// vm.$watch('isHot', {
		// 	immediate:true,	// 初始化时让handler调用一下
		// 	// handler什么时候调用? 当isHot发生改变时
		// 	handler(newValue,oldValue){
		// 		console.log('isHot被修改了',newValue,oldValue);
		// 	}
		// })
		
		// 简写 
		// vm.$watch('isHot', (newValue, oldValue){ 
		// 	console.log('isHot被修改了', newValue, oldValue, this);
		// })
	</script>
</body>
</html>

1.10.4. 计算属性 VS 侦听属性

computedwatch之间的区别

  • computed能完成的功能,watch都可以完成
  • watch能完成的功能,computed不一定能完成,例如watch可以进行异步操作两个重要的小原则

两个重要的小原则

  • 所有被Vue管理的函数,最好写成普通函数,这样 this 的指向才是vm或组件实例对象
  • 所有不被Vue所管理的函数(定时器的回调函数、**ajax **的回调函数等、Promise 的回调函数),最好写成箭头函数,这样 this 的指向才是vm或组件实例对象

在这里插入图片描述

使用计算属性

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

使用监听属性

new Vue({ 
	el: '#root',  	  
	data:{ 
		firstName:'张', 
		lastName:'三',
		fullName:'张-三'
	},
	watch: {
		firstName(val) {
			// setTimeout(()=>{
			// 	this.fullName = val + '-' + this.lastName;
			// }, 1000);
			this.fullName = val + '-' + this.lastName;
		},
		lastName(val) {
			// setTimeout(()=>{
			// 	this.fullName = this.firstName + '-' + val;
			// }, 1000);
			this.fullName = this.firstName + '-' + val;
		}
	}
});

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

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

相关文章

linux部署jdk\redis\nginx\fastdfs

一、jdk安装及配置修改 1、本地下载jdk包 jdk-8u131-linux-x64.tar.gz&#xff0c;上传到服务器&#xff08;也可通过命令直接下载&#xff09; 2、将压缩包放服务器/usr/local路径下&#xff0c;后解压&#xff1a;tar -zxvf jdk-8u131-linux-x64.tar.gz 如之前已安装&…

OSCP-XPosedAPI(本地文件包含、查看源码、os.system、命令盲注)

目录 扫描 Web API枚举 命令盲注 提权 扫描 发现了两个开放的端口:端口22上的SSH和端口13337上的未知服务。 用netcat手动探测端口13337,但是运行几个常见的TCP/UDP服务初始化命令没有输出。 尝试了一个完整的脚本和版本nmap扫描的开放端口࿰

Vue3:基础入门

Vue3&#xff1a;基础入门 Date: April 10, 2023 Sum: vue简介、vue的基本使用、vue的指令与过滤器、品牌列表案例 目标&#xff1a; 能够知道 vue 的基本使用步骤 掌握插值表达式和 v-bind 指令的用法 能够掌握如何使用 v-on 指令绑定事件 能够使用 v-model 指令实现数据…

Science | 华盛顿大学Baker团队提出AI新范式设计全新蛋白复合物

蛋白质的结构形态和生物学功能是由氨基酸序列决定的。 人工蛋白质设计的目标就是创造可以折叠成特定结构以实现特定功能的新型氨基酸序列。 当然&#xff0c;这并不是一个简单的问题&#xff0c;因为它需要了解蛋白质如何在细胞中折叠&#xff0c;而这一过程在很大程度上仍不为…

【微服务】- 分布式系统的流量防卫兵 - sentinel

Sentinel流量防卫兵 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 一个有梦有戏的人 怒放吧德德 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0…

代码优化- 中间表示上的优化

中间表示上的代码优化依赖于具体所使用的中间表示&#xff1a;控制流图&#xff08;CFG&#xff09;、控制依赖图&#xff08;CDG&#xff09;、静态单赋值形式&#xff08;SSA&#xff09;、后续传递风格&#xff08;CPS&#xff09;等 共同的特点是需要进行程序分析&#xf…

7 ADC(一)

7 ADC ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 12位&#xff08;0-2^(12-1)&#xff09;逐次逼近型ADC&#xff0c;1us转换时间…

HTTP连接要考虑超时,重试和并发之原因

一、原因&#xff08;why) 连接超时配置得特别长&#xff0c;比如 60 秒。一般来说&#xff0c;TCP 三次握手建立连接需要的时间非常短&#xff0c;通常在毫秒级最多到秒级&#xff0c;不可能需要十几秒甚至几十秒。如果很久都无法建连&#xff0c;很可能是网络或防火墙配置的…

光纤网卡传输速率和它的应用领域有哪些呢?通常用会到有哪些型号网络变压器呢?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;常有客户问起光纤网卡该如何选用到合适的产品&#xff0c;选用时要注意到哪些事项&#xff0c;这节将结合配合到的网络变压器和大家一起探讨&#xff0c;希望对大家有些帮助。 1&#xff0e;光纤网卡传输速率与网络…

AlgoC++第三课:C++世界观

目录 C世界观前言1. 程序逻辑2. 内存的逻辑3. 调度的逻辑4. 编译的逻辑5. 作用域的逻辑6. 命名空间的逻辑7. 生命周期的逻辑8. C类的逻辑9. 编译时和运行时的逻辑总结 C世界观 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c…

如何查看CPU的L2、L3缓存的容量

可以用CPU-Z&#xff0c;不过需要下载。 可以用命令&#xff1a; wmic cpu get L2CacheSize,L3CacheSize结果&#xff1a;

Golang微服务一把嗦 用户微服务集成主流最新go技术栈

声明&#xff1a;此文章为博主个人学习记录&#xff0c;仅供学习和交流&#xff0c;如有侵权请联系博主。 前言 前段时间&#xff0c;因为本地k8s环境一直出问题&#xff0c;线上云环境也用不起&#xff0c;&#xff08;后面搞定了再慢慢学习&#xff09;所以就暂时搁置了k8s学…

SQL Server基础 第二章 表结构管理

目录 一、数据类型 1&#xff0c;字符类数据类型 2&#xff0c;数值型数据类型 3&#xff0c;日期/时间型数据类型 二、主键&#xff08;Primary key&#xff09; 三、默认值 四、唯一键&#xff08;Unique&#xff09; 五、自增标识 六、约束 七、外键 一、数据类型 …

node+vue+mysql+java健身房网站管理系统

通过大数据管理的方法对健身房管理系统进行了详细的设计说明以及介绍&#xff0c;对健身房管理系统进行了开发和实践。作为一个健身房网站&#xff0c;它为用户提供了一个良好的求知平台。让用户能更好地了解健身带来的好处。前端技术&#xff1a;nodejsvueelementui,视图层其实…

3D智能四向穿梭车在电商物流中的应用|HEGERLS箱式四向穿梭车系统在服装制造仓的创新应用

四向穿梭车技术是物流仓储系统中的革命性技术&#xff0c;也由于四向穿梭车对于场地的适应性非常强的特性&#xff0c;可实现前后、左右、上下六维运行&#xff0c;结合提升机的布置和输送系统的布局&#xff0c;灵活调整四向车的空间布局&#xff0c;使某些不规则场地和闲置空…

NXP公司LPC21xx+热敏电阻实现温度检测

LPC2131/32/34/36/38微控制器基于16位/32位Arm7TDMI-S™CPU&#xff0c;支持实时仿真和嵌入式跟踪&#xff0c;具有尺寸小&#xff0c;功耗低&#xff0c;多个32位定时器、单/双10位8通道ADC、10位DAC、PWM通道、47个GPIO线&#xff08;它们拥有多达9个边沿或电平触发的外部中断…

SpringCloud 项目如何方便 maven 打包以及本地开发

一、背景 springcloud-alibaba &#xff0c;使用 nacos 做配置中心&#xff0c;maven 作为构建工具。为了防止 test 、prod 环境配置文件覆盖问题&#xff0c;使用 mvn -P 命令。 二、项目 pom 文件 1. 利用 resources 标签来指定目录&#xff0c;build > resources 标签&a…

【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

110.【十万字带你深入学习23种设计模式】

Java 23种设计模式 (一)、设计模式相关内容介绍1.软件设计模式概述(1).软件设计模式的产生背景(2).软件设计模式的概念(3).学习设计模式的重要性(4).设计模式分类 2.UML图(1).类图概述(2).类图的作用(3).类图表示法 3.软件设计原则(1).开闭原则 (重写不修改)(2).里氏代换原则 (…

Node内置模块 【https模块】

文章目录 &#x1f31f;前言&#x1f31f;https模块&#x1f31f;https原理&#x1f31f;SSL&#x1f31f;使用https&#x1f31f;搭建HTTPS服务器&#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;新的专栏 Node 已开启&#xff1b;这个专栏里边会收录一些N…