vue2知识点:计算属性与监听属性

导读:本篇文章讲解 vue2知识点:计算属性与监听属性,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在这里插入图片描述

一、计算属性computed

在这里插入图片描述
注意点1:只要data任意值发生改变,vue肯定会重新解析模板。比如{{fullName()}},插值表达式使用fullName()函数,那么当vue重新解析模板时,就会重新执行一遍fullName()函数,因为data任意值改变了,vue也不知道fullName()函数中是否引用了data中改变的属性,所以会选择直接重新执行一遍fullName()函数。

注意点2:

问题:默认提供了缓存机制,实际上计算属性就是调用了fullName的get()方法,get什么时候调用?

答案:
1.初次读取fullName时
2.所依赖的数据发生变化时。

注意点3:

问题:既然fullName是个对象,那我插值表达式可以使用{{fullName.get()}}?

答案:不能这样使用,只有data配置和methods配置可以调用,计算配置不能这么调用,会报错fullName中get()方法不存在。

注意点4:methods定义的方法,在插值表达式使用要加(),{{fullName()}},如果是计算属性中监听的属性,则写成{{fullName}}

举例:计算“全名”标签,由“姓-名”构成

举例:计算“全名”标签,由“姓-名”构成

在这里插入图片描述
思路:

方式1

方式1:用插值表达式拼,(缺点:万一对字符串进行分割、转换大小写、截取长度等等操作显得表达式太长,不易解读)

全名:<span>{{firstName}}-{{lastName}}</span>

方式2

方式2:定义函数写在methods配置中(缺点:不提供缓存,有几个fullName()调用就会执行几次)

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

方式3

方式3:定义计算属性(推荐使用,有缓存)

全名:<span>{{fullName}}</span> <br/><br/>

computed:{
	fullName:{
		//get有什么作用?当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
		//get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
		get(){
			console.log('get被调用了')
			// console.log(this) //此处的this是vm
			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]
		}
	}
}

二、(简写)计算属性

注意点1:计算属性只有在没有set方法时才能使用简写

注意点2:

问题:插值表达式中使用data配置、methods配置和计算配置时,区分何时带()?何时不能带()?

答案:
针对data配置都不带()
针对methods配置有形参带(),没有形参()可省略
针对计算配置也不带(),带()会报错

全名:<span>{{fullName}}</span> <br/><br/>

computed:{
	//完整写法
	 fullName:{
		get(){
			console.log('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(){
		console.log('get被调用了')
		return this.firstName + '-' + this.lastName
	}
}

三、计算属性-天气案例

该案例为了讲述1个坑,1个技巧

案例说明:今天天气很【炎热/凉爽】,点击按钮进行切换

案例说明:今天天气很【炎热/凉爽】,点击按钮进行切换

源代码如下:
在这里插入图片描述
在这里插入图片描述

<div id="root">
	<h2>今天天气很{{info}}</h2>
	<!-- 绑定事件的时候:@xxx="yyy" yyy可以写一些简单的语句 -->
	<!-- <button @click="isHot = !isHot">切换天气</button> -->
	<button @click="changeWeather">切换天气</button>
</div>

const vm = new Vue({
	el:'#root',
	data:{
		isHot:true,
	},
	computed:{
		info(){
			return this.isHot ? '炎热' : '凉爽'
		}
	},
	methods: {
		changeWeather(){
			this.isHot = !this.isHot
		}
	},
})

注意点1:(1个坑指的是),假设页面显示的是“今天天气很好”,也就是页面压根没用到info属性,而代码中却定义了计算属性及方法,那么会发生的坑是,点击按钮后Vue插件显示结果没变动,但是实际控制台info结果已经改变了,也就是说因为页面没用到属性所以插件就不更新值了,但是实际info值已经改变了。

注意点2:(1个技巧指的是),假设定义方法逻辑很简单,可以直接这样写@click=“isHot = !isHot”,也是生效的。
在这里插入图片描述
在这里插入图片描述

四、监听属性watch

配置watch关键字和handler()方法实现监听
在这里插入图片描述

写法1:.new Vue是配置

const vm = new Vue({
watch:{
	isHot:{
			immediate:true, //初始化时让handler调用一下
			//handler什么时候调用?当isHot发生改变时。
			handler(newValue,oldValue){
				console.log('isHot被修改了',newValue,oldValue)
			}
	}
}

写法2:首先保证vue实例已经创建完了,在vue实例下面,通过vm.$watch配置

vm.$watch('isHot',{
	immediate:true, //初始化时让handler调用一下
	//handler什么时候调用?当isHot发生改变时。
	handler(newValue,oldValue){
		console.log('isHot被修改了',newValue,oldValue)
	}
})

注意点1:什么场景下使用写法1 和写法2呢?
答案:创建vue实例时已经明确知道监听什么属性时就使用写法1,而如果创建vue实例时不知道监视谁,而是后续根据用户业务行为才知道要监视谁就使用写法2

注意点2:vm.$watch(参数1,参数2)有两个参数,参数2为{}配置对象,参数1表示你要监视的属性名,注意名字要加引号“引号”标识,如果直接写vm.$watch(isHot,参数2)这是错误的,会报如下错误,原因在于写法1中的isHot不会触发“读取变量”,而写法2会触发“读取变量”,所以写法2中属性名必须加“引号”。
在这里插入图片描述

五、监听属性watch-深度监听

在这里插入图片描述

举例:data配置numbers对象,其中有属性a和b,我想监听numbers,只要numbers中任意属性值改变了,我就打印一条语句。

举例:data配置numbers对象,其中有属性a和b,我想监听numbers,只要numbers中任意属性值改变了,我就打印一条语句。

<h3>a的值是:{{numbers.a}}</h3>
<button @click="numbers.a++">点我让a+1</button>
<h3>b的值是:{{numbers.b}}</h3>
<button @click="numbers.b++">点我让b+1</button>

const vm = new Vue({
	el:'#root',
	data:{
		numbers:{
			a:1,
			b:1
		}
	},
	watch:{
		numbers:{
				deep:true, //开启深度监视,监视多级结构中所有属性的变化
				handler(){
				  console.log('numbers改变了')
			   }
		}
	}
})

注意点1:默认deep为false,不进行深度监视,这样效率快

注意点2:如果如图1这么写,不配置deep=true的话,那么watch配置会让vue实例监视的是整个numbers的地址,而不是咱们想实现的监视numbers对象内部任意属性值a或者b的变化,因为如图2,watch配置会让vue实例默认监视的是“粉色框”的地址值是否改变,而不是监视“绿色框”中属性a和b的值是否改变,哪怕属性a或者b值改变了,但是numbers对象整体地址没改变,那么被watch配置的vue实例就会觉得监视值未改变,所以如果想实现深度结构监控,请设置deep=true
记住:配置watch是为了作用于vue实例怎么怎么怎么地。
在这里插入图片描述
在这里插入图片描述

六、监听属性watch-(简写)深度监听

watch和 vm.$watch都有2种写法:

问题:什么情况下使用简写方式?

答案:当监听属性中只用到handler()方法,而没有其他配置(比如immediate或者deep)时,就可以使用简写方式。

watch:{
	//正常写法
	isHot:{
		// immediate:true, //初始化时让handler调用一下
		// deep:true,//深度监视
		handler(newValue,oldValue){
			console.log('isHot被修改了',newValue,oldValue)
		}
	}, 
	//简写
	isHot(newValue,oldValue){
		console.log('isHot被修改了',newValue,oldValue,this)
	} 
}
//正常写法
vm.$watch('isHot',{
	immediate:true, //初始化时让handler调用一下
	deep:true,//深度监视
	handler(newValue,oldValue){
		console.log('isHot被修改了',newValue,oldValue)
	}
}) 

//简写
vm.$watch('isHot',function(newValue,oldValue){
	console.log('isHot被修改了',newValue,oldValue,this)
}) 

七、计算属性和监视属性区别

在这里插入图片描述

举例说明:天气案例

举例说明:天气案例

使用:计算属性

使用:计算属性

data:{
	firstName:'张',
		lastName:'三'
	},
	computed:{
		info(){
			return this.firstName +-+ this.lastName
		}
	},

使用:监视属性

使用:监视属性

data:{
	firstName:'张',
		lastName:'三',
		fullName:'张-三'
	},
	watch:{
		firstName(val){
				this.fullName = val + '-' + this.lastName
		},
		lastName(val){
			this.fullName = this.firstName + '-' + val
		}
	}

区别:
注意点1:如果计算属性computed和监视属性watch都可以实现,推荐使用计算属性,因为代码最少

注意点2:计算属性computed不能使用异步操作,比如睡一秒再执行操作等,而监视属性watch可以进行异步操作

注意点3:为了使用this指代vue对象,那么使用计算属性computed的同步操作,必须写普通函数(因为计算属性computed被vue管理),如果使用监视属性watch的异步操作等(不被vue所管理的函数)那么请使用箭头函数,
(即:计算属性使用同步操作的普通函数,this => vue,
同步操作的箭头函数,this => window
监视属性的同步操作的普通函数,this => vue,
同步操作的箭头函数,this => window,
异步操作的普通函数,this => window,
异步操作的箭头函数,this => vue,具体原因看下面图)。

在这里插入图片描述

本人其他相关文章链接

1. 《基础篇第1章:vue2简介》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

2. 《基础篇第2章:vue2基础》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

3. 《进阶篇第3章:vue进阶-组件》包含组件、自定义事件、插槽、路由等等扩展知识点

4. 《基础篇第4章》:使用vue脚手架创建项目

5. vue2知识点:数据代理

6. vue2知识点:事件处理

7. vue2知识点:列表渲染(包含:v-for、key、取值范围、列表过滤、列表排序、vue监视对象或数组的数据改变原理、总结vue数据监测)

8. vue2知识点:计算属性与监听属性

9. vue2知识点:生命周期(包含:生命周期介绍、生命周期钩子、整体流程图详解)

10. vue2知识点:非单文件组件和单文件组件

11. vue2知识点:组件is属性

12. vue2知识点:组件模板定义

13. vue2知识点:组件的props属性、非props属性、props属性校验

14. vue2知识点:组件自定义事件

15. vue2知识点:组件插槽分发

16. vue2知识点:动态组件

17. vue2知识点:混入

18. vue2知识点:浏览器本地缓存

19. vue2知识点:全局事件总线(GlobalEventBus)

20. vue2知识点:消息订阅与发布

21. vue2知识点:nextTick语法

22. vue2知识点:Vue封装的过度与动画

23. vue2知识点:路由

24. vue2知识点:vm调用待$命令介绍

25. vue组件通信案例练习(包含:父子组件通信及平行组件通信)

26. vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解

27. vue2基础组件通信案例练习:待办事项Todo-list案例练习

28. vue2基础组件通信案例练习:把案例Todo-list改写成本地缓存

29. vue2基础组件通信案例练习:把案例Todo-list改成使用自定义事件

30. vue2基础组件通信案例练习:把案例Todo-list改成使用全局事件总线

31. vue2基础组件通信案例练习:把案例Todo-list改成使用消息订阅与发布

32. vue2基础组件通信案例练习:把案例Todo-list新增编辑按钮

33. vue2基础组件通信案例练习:把案例Todo-list改成使用动画与过度

34. 学习vue2遇到过的问题及个人总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/106195.html

(0)
小半的头像小半
0 0

相关推荐

  • Fiddler抓包:下载、安装及使用 技术随笔

    Fiddler抓包:下载、安装及使用

    0 0124
    小半的头像 小半
    2023年2月8日
  • springboot项目中遇到的打包方式的坑。 技术随笔

    springboot项目中遇到的打包方式的坑。

    0 0102
    小半的头像 小半
    2023年1月20日
  • 32. JAVA高级技术-对象克隆1(假克隆) 技术随笔

    32. JAVA高级技术-对象克隆1(假克隆)

    0 0159
    飞熊的头像 飞熊
    2023年5月5日
  • Java之使用递归查询多级树形结构数据 技术随笔

    Java之使用递归查询多级树形结构数据

    0 0453
    小半的头像 小半
    2023年2月11日
  • 突然报错找不到加载类如何处理,一招简单解决 技术随笔

    突然报错找不到加载类如何处理,一招简单解决

    0 090
    小半的头像 小半
    2023年2月15日
  • 系统调度(一) 技术随笔

    系统调度(一)

    0 097
    小半的头像 小半
    2023年1月16日
  • MySQL必备知识(快速上手,直接掌握数据库操作) 技术随笔

    MySQL必备知识(快速上手,直接掌握数据库操作)

    0 0104
    seven_的头像 seven_
    2023年2月22日
  • MYSQL 技术随笔

    MYSQL

    0 060
    小半的头像 小半
    2023年2月10日
  • MySQL必知必会:汇总、分组、 嵌套查询 技术随笔

    MySQL必知必会:汇总、分组、 嵌套查询

    0 0126
    小半的头像 小半
    2023年2月11日
  • CentOS 6.5安装erlang 技术随笔

    CentOS 6.5安装erlang

    0 087
    小半的头像 小半
    2023年2月12日
  • maven几种打包插件介绍,及个人心得总结 技术随笔

    maven几种打包插件介绍,及个人心得总结

    0 0129
    小半的头像 小半
    2023年2月16日
  • Vue学习——【第一弹】 技术随笔

    Vue学习——【第一弹】

    0 0116
    飞熊的头像 飞熊
    2023年4月4日

站长精选

  • 给Hexon升了个级

    给Hexon升了个级

    2022年11月21日

  • 程序员为保饭碗,纷纷开始“防御性编程”.....

    程序员为保饭碗,纷纷开始“防御性编程”…..

    2023年12月17日

  • DDD死党:查询模型的本质

    DDD死党:查询模型的本质

    2023年11月15日

  • 让同事血压飙升的八个 Bug 操作....

    让同事血压飙升的八个 Bug 操作….

    2023年12月3日

  • 这样Debug,排查问题效率大大提升...

    这样Debug,排查问题效率大大提升…

    2023年3月7日

  • 图解 Spring Bean 生成流程,非常详尽

    图解 Spring Bean 生成流程,非常详尽

    2023年10月20日

  • Nacos 2.2 发布,正式支持其他数据库

    Nacos 2.2 发布,正式支持其他数据库

    2022年12月19日

  • HashMap 为什么不能一边遍历一边删除?

    HashMap 为什么不能一边遍历一边删除?

    2023年2月4日

  • 快速定位,基于 Ko-time 的 SpringBoot 单体化调用链追踪实践

    快速定位,基于 Ko-time 的 SpringBoot 单体化调用链追踪实践

    2023年10月20日

  • 从实现到原理,我总结了11种延迟任务的实现方式

    从实现到原理,我总结了11种延迟任务的实现方式

    2023年3月1日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

深圳SEO优化公司临沧模板网站建设报价漯河外贸网站制作价格株洲外贸网站建设多少钱张北网站搭建多少钱黔西南SEO按效果付费公司阳泉百度竞价包年推广报价梅州SEO按天收费报价汉中网站推广工具多少钱石岩设计公司网站多少钱中卫营销型网站建设朔州seo网站推广多少钱扬州建网站多少钱株洲网络推广哪家好黔西南seo网站优化价格重庆百度竞价包年推广价格渭南关键词按天扣费价格木棉湾网站优化推广多少钱滨州百度标王哪家好泉州网站关键词优化多少钱滁州百度网站优化哪家好德宏网站制作设计报价揭阳网站改版价格烟台网站优化多少钱阳泉网站优化按天收费报价泉州关键词按天计费多少钱萍乡推广网站宿州营销网站哪家好邯郸高端网站设计多少钱渭南网站优化推广哪家好沧州网站推广系统报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化