Vue2 + Vue3学习笔记(七)计算属性和侦听属性

15 篇文章 0 订阅
13 篇文章 0 订阅

本节内容:

  1. 计算属性
  2. 侦听属性
  3. 二者的对比

计算属性和侦听属性都是Vue中常用的,本文会根据两个简单的例子来进行讲解。

1. 计算属性

第一个例子想要实现的是一个可以将输入的姓和名拼接到一起的页面,并且实现双向绑定。
在这里插入图片描述
实现的方法有三种:

  1. 插值语句
  2. methods
  3. 计算属性

方法一:

<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<!-- 因为要实现双向绑定,所以这里使用的是v-model -->
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{firstName}}-{{lastName}}</span>
		</div>
	</body>

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

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

方法二:

	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{fullName()}}</span>
		</div>
	</body>

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

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

方法三:

<body>
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{fullName}}</span> <br/><br/>
		</div>
	</body>

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

		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三',
			},
			methods: {
				demo(){
					
				}
			},
			computed:{
				fullName:{
					//get有什么作用?当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
					//get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
					get(){
						console.log('get被调用了')
						return this.firstName + '-' + this.lastName
					},
					//set什么时候调用? 当fullName被修改时。
					set(value){
						console.log('set',value)
						const arr = value.split('-')
						this.firstName = arr[0]
						this.lastName = arr[1]
					}
				}
			}
		})
	</script>

从第三个实现方法中,我们可以得知什么时候需要用到计算属性:要用的属性不存在,要通过已有属性计算得来。 例子中的全名就是通过已有属性姓和名计算得来的。

计算属性实现的原理底层借助了Objcet.defineproperty方法提供的getter和setter。

有同学可能会疑问,为什么要用计算属性,不直接用methods,与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。因为get函数会在初次读取时会执行一次,当依赖的数据发生改变时会被再次调用,如果不发生改变就不会执行get函数。

如果计算属性不需要进行修改,只需要get属性的话,可以对计算属性进行简写。

//简写
				fullName(){
					console.log('get被调用了')
					return this.firstName + '-' + this.lastName
				}

2. 侦听属性

想要实现的功能是指,点击按钮之后,天气会进行改变。

在这里插入图片描述
点击之后
在这里插入图片描述

<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h2>今天天气很{{info}}</h2>
			<!-- 绑定事件的时候:@xxx="yyy" yyy可以写一些简单的语句,但太长的不推荐这么写 -->
			<!-- <button @click="isHot = !isHot">切换天气</button> -->
			<button @click="changeWeather">切换天气</button>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		
		const vm = new Vue({
			el:'#root',
			data:{
				isHot:true,
			},
			computed:{
				info(){
					return this.isHot ? '炎热' : '凉爽'
				}
			},
			methods: {
				changeWeather(){
					this.isHot = !this.isHot
				}
			},
			watch:{
				isHot:{
					immediate:true, //初始化时让handler调用一下
					//handler什么时候调用?当isHot发生改变时。
					handler(newValue,oldValue){
						console.log('isHot被修改了',newValue,oldValue)
					}
				}
			},
		})
		//watch的第二种写法
		vm.$watch('isHot',{
			immediate:true, //初始化时让handler调用一下
			//handler什么时候调用?当isHot发生改变时。
			handler(newValue,oldValue){
				console.log('isHot被修改了',newValue,oldValue)
			}
		})
	</script>

当被侦听的属性变化时, 回调函数自动调用, 进行相关操作。不光可以对data进行侦听,函数也可以进行侦听。

如果想要监视多层的是对象内部值,需要注意到深度监视
Vue中的watch默认不监测对象内部值的改变(一层),配置deep:true可以监测对象内部值改变(多层)。

3. 二者的对比

在学习完计算属性和侦听属性之后,我们可能会疑问,这两种属性可以实现相同的功能,这两者之间到底用哪一种好,之间有什么区别吗?
首先我们先将第一个姓名的例子再用侦听属性实现一下。

<body>
		<!-- 准备好一个容器-->
		<div id="root">
			姓:<input type="text" v-model="firstName"> <br/><br/>
			名:<input type="text" v-model="lastName"> <br/><br/>
			全名:<span>{{fullName}}</span> <br/><br/>
		</div>
	</body>

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

		const vm = new Vue({
			el:'#root',
			data:{
				firstName:'张',
				lastName:'三',
				fullName:'张-三'
			},
			watch:{
				firstName(val){
				//这里多实现了一个功能,                                                                    
					setTimeout(()=>{
						console.log(this)
						this.fullName = val + '-' + this.lastName
					},1000);
				},
				lastName(val){
					this.fullName = this.firstName + '-' + val
				}
			}
		})
	</script>

上面代码是命令式且重复的。将它与计算属性的版本进行比较,计算属性的代码更简洁。

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

computed和watch之间的区别:

  • computed能完成的功能,watch都可以完成。
  • watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。

两个重要的小原则:
1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 2 中使用 TypeScript(TS)编写计算属性(computed)与使用 JavaScript(JS)是类似的。下面是一个示例: ```typescript // 导入Vue和Component装饰器 import Vue from 'vue'; import Component from 'vue-class-component'; // 使用@Component装饰器定义组件 @Component export default class MyComponent extends Vue { // data属性 message: string = 'Hello World'; // 计算属性 get reversedMessage(): string { return this.message.split('').reverse().join(''); } // 监听计算属性的变化 @Watch('reversedMessage') onReversedMessageChange(value: string, oldValue: string) { console.log(`reversedMessage changed from ${oldValue} to ${value}`); } } ``` 在上面的示例中,我们使用`@Component`装饰器将类声明为一个 Vue 组件。然后,我们定义了一个名为`message`的数据属性和一个名为`reversedMessage`的计算属性。`reversedMessage`计算属性会根据`message`的值计算出一个新的值。 我们还可以使用`@Watch`装饰器来监听计算属性的变化。在上面的示例中,我们定义了一个名为`onReversedMessageChange`的方法,并用`@Watch('reversedMessage')`装饰器将其与`reversedMessage`计算属性关联起来。当`reversedMessage`发生变化时,该方法会被调用。 需要注意的是,为了让 TypeScript 正确地推断类型,我们需要将`vue-class-component`库安装为项目的依赖。你可以使用以下命令进行安装: ``` npm install vue-class-component ``` 这样,你就可以在 Vue 2 中使用 TypeScript 编写计算属性了。希望能对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值