位置: IT常识 - 正文

Vue —— watch和watchEffect的区别(vue watch和computed)

编辑:rootadmin
Vue —— watch和watchEffect的区别 目录前言watch和watchEffect的对比watchwatchEffect深度解析watch函数深度解析watchEffect函数watchEffect与computed前言

推荐整理分享Vue —— watch和watchEffect的区别(vue watch和computed),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue watch和computed,vue里watch与compute,vue watch和methods,vue里watch与compute,vue,watch,vue computer watch区别,vue watch和mounted,vue watch和computed,内容如对您有帮助,希望把文章链接给更多的朋友!

watch函数与watchEffect函数都是监听器,在写法和用法上有一定区别,是同一功能的两种不同形态,底层都是一样的。

watch和watchEffect的对比watchwatch显式指定依赖数据,依赖数据更新时执行回调函数具有一定的惰性lazy 第一次页面展示的时候不会执行,只有数据变化的时候才会执行(设置immediate: true时可以变为非惰性,页面首次加载就会执行)监视ref定义的响应式数据时可以获取到原值既要指明监视的属性,也要指明监视的回调watchEffect

watchEffect自动收集依赖数据,依赖数据更新时重新执行自身

立即执行,没有惰性,页面的首次加载就会执行

无法获取到原值,只能得到变化后的值

不用指明监视哪个属性,监视的回调中用到哪个属性就监视哪个属性

深度解析watch函数

watch函数有两个小坑:

Vue —— watch和watchEffect的区别(vue watch和computed)

监视reactive定义的响应式数据(该数据为一个对象,因为reactive只能定义数组或对象类型的响应式)时:oldValue无法正确获取,会强制开启深度监视,deep配置不生效。

监视reactive定义的响应式数据中的某个属性时,且该属性是一个对象,那么此时deep配置生效。

具体的watch函数的用法在下面代码中都有所体现,注释详细

<template> <div> <h2>当前求和为:{{sum}}</h2> <button @click="sum++">点我+1</button> <hr> <h2>当前的信息为:{{msg}} </h2> <!-- 点击button拼接! --> <button @click="msg+='!'">修改数据</button> <hr> <h2>姓名:{{person.name}}</h2> <h2>年龄:{{person.age}}</h2> <h2>薪资:{{person.job.j1.salary}}</h2> <button @click="person.name+='~'"> 修改姓名</button> <button @click="person.age++"> 增长年龄</button> <button @click="person.job.j1.salary++"> 增长薪资</button> </div></template><script>import {ref,reactive,watch,watchEffect} from 'vue'export default { name:'demo', setup(){ //数据 let sum = ref(0) let msg = ref('hello') let person = reactive({ name:'zhangsan', age:'18', job:{ j1:{ salary:20 } } }) //监视(三个参数,第一个是监视的对象,第二个是监视的回调函数,第三个是监视的配置) //情况一:监视ref所定义的一个响应式数据 watch(sum,(newValue,oldValue)=>{ console.log('sum的值变化了',newValue,oldValue) },{immediate:true,deep:true}) //immediate的值为true时表示非惰性的立即执行的(默认情况下是false) //deep深层次触发(此处设置deep无意义) //情况二:监视ref所定义的多个响应式数据,写成数组的形式 watch([sum,msg],(newValue,oldValue)=>{ console.log('sum或者msg变了',newValue,oldValue) }) //情况三:监视reactive所定义的响应式数据 //若监视的是reactive定义的响应式数据,则无法正确获得oldValue //若监视的是reactive定义的响应式数据,则watch会强制开启深度监视 //我们发现改变person的任意一个属性都会被监视到 watch(person,(newValue,oldValue)=>{ console.log('person改变了',newValue,oldValue) }) //我们尝试设置deep:false,关闭深度监听(目的:改变job的值不会被watch监听到) //但是我们发现deep:false并没有生效,原因是此时watch监视的是reactive定义的响应式对象,默认强制开启了深度监听 watch(person,(newValue,oldValue)=>{ console.log('person改变了',newValue,oldValue) },{deep:false}) //情况四:监视reactive所定义的响应式数据中的某个属性 watch(()=>person.name,(newValue,oldValue)=>{ console.log('person的job改变了',newValue,oldValue) }) watch(()=>person.age,(newValue,oldValue)=>{ console.log('person的job改变了',newValue,oldValue) }) watch(()=>person.job,(newValue,oldValue)=>{ console.log('person的job改变了',newValue,oldValue) }) //从上边我们发现改变name,age都会触发监听,但是改变job不会 //这是因为name和age属性的值只是一个简单的基本类型数据, //而job属性的值是一个对象,比较深,想要监视到,就要开启深度监视,程序如下: watch(()=>person.job,(newValue,oldValue)=>{ console.log('person的job改变了',newValue,oldValue) },{deep:true})//此时job改变,会被监视到,此处的deep配置生效 //需要和情况三进行区分,此处watch监视的是reactive所定义的对象中的某个属性,而情况三watch监视的是reactive所定义的对象 //情况五:监视reactive所定义的响应式数据中的某些属性,写成数组的形式 watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{ console.log('person的name或age改变了',newValue,oldValue) }) //返回一个对象(常用) return{ sum, msg, person } }}</script>

watch取消监听

const stop1 = watch( [() => nameObj.name, () => nameObj.name], ([curName, curEng], [prevName, curEng]) => { console.log(curName, curEng, "----", prevName, curEng); setTimeout(() => { stop(); }, 5000); });深度解析watchEffect函数

函数用法如下代码所示,注释详细:

<template> <div> <h2>当前求和为:{{sum}}</h2> <button @click="sum++">点我+1</button> <hr> <h2>当前的信息为:{{msg}} </h2> <!-- 点击button拼接! --> <button @click="msg+='!'">修改数据</button> <hr> <h2>姓名:{{person.name}}</h2> <h2>年龄:{{person.age}}</h2> <h2>薪资:{{person.job.j1.salary}}</h2> <button @click="person.name+='~'"> 修改姓名</button> <button @click="person.age++"> 增长年龄</button> <button @click="person.job.j1.salary++"> 增长薪资</button> </div></template><script>import {ref,reactive,watch,watchEffect} from 'vue'export default { name:'demo', setup(){ //数据 let sum = ref(0) let msg = ref('hello') let person = reactive({ name:'zhangsan', age:'18', job:{ j1:{ salary:20 } } })//watchEffect函数内部所指定的回调中用到的数据只要发生变化,就会重新执行回调//只有一个参数,就是回调 watchEffect(()=>{ const x1 = sum.value//因为sum是ref定义的响应式数据,需要使用.value调用 const x2 = person.age console.log('watchEffect配置的回调执行了') }) return{ sum, msg, person } }}</script>

watchEffect取消监听

const stop = watchEffect(() => { console.log(nameObj.name); setTimeout(() => { stop(); }, 5000);});watchEffect与computed

watchEffect与computed有点像:

但是computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值。

而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值。

computed若是值没有被使用时不会调用,但是watchEffect始终会调用一次

举例:

<template> <div> <h2>当前求和为:{{sum}}</h2> <button @click="sum++">点我+1</button> <hr> <h2>当前的信息为:{{msg}} </h2> <!-- 点击button拼接! --> <button @click="msg+='!'">修改数据</button> <hr> <h2>姓名:{{person.name}}</h2> <h2>年龄:{{person.age}}</h2> <h2>薪资:{{person.job.j1.salary}}</h2> <button @click="person.name+='~'"> 修改姓名</button> <button @click="person.age++"> 增长年龄</button> <button @click="person.job.j1.salary++"> 增长薪资</button> </div></template><script>import {ref,reactive,watch,watchEffect, computed} from 'vue'export default { name:'demo', setup(){ //数据 let sum = ref(0) let msg = ref('hello') let person = reactive({ name:'zhangsan', age:'18', job:{ j1:{ salary:20 } } }) let person1 = reactive({ firstName:'张', lastName:'三' }) //computed //计算属性——简写(没有考虑计算属性被修改的情况) person1.fullName = computed(()=>{ //必须含有返回值 return person1.firstName+'-'+person1.lastName }) //计算属性——完整写法(考虑读和写) person1.fullName = computed({ //必须含有返回值 get(){ return person1.firstName+'-'+person1.lastName }, set(value){ const nameArr = value.split('-') person1.firstName = nameArr[0] person1.lastName = nameArr[1] } }) //watchEffect //可以不写给返回值 watchEffect(()=>{ const x1 = sum.value//因为sum是ref定义的响应式数据,需要使用.value调用 const x2 = person.age console.log('watchEffect配置的回调执行了') }) return{ sum, msg, person, person1 } }}</script>
本文链接地址:https://www.jiuchutong.com/zhishi/300171.html 转载请保留说明!

上一篇:23年 车辆检测+车距检测+行人检测+车辆识别+车距预测(附yolo v5最新版源码)(2021年车辆检测)

下一篇:React Hook - useState函数的详细解析

  • vivox70pro电池容量多大(vivox70pro电池容量查询代码)

    vivox70pro电池容量多大(vivox70pro电池容量查询代码)

  • 苹果蓝牙耳机丢了能找回吗(苹果蓝牙耳机丢了怎么定位找到)

    苹果蓝牙耳机丢了能找回吗(苹果蓝牙耳机丢了怎么定位找到)

  • vivo x27微信分身怎么开(vivox27微信分身怎么加密)

    vivo x27微信分身怎么开(vivox27微信分身怎么加密)

  • 微信卸载后失去什么(微信卸载后资料找不到了怎么办)

    微信卸载后失去什么(微信卸载后资料找不到了怎么办)

  • qq怎样创群(qq如何创群?)

    qq怎样创群(qq如何创群?)

  • 1080*1920是多大尺寸(1080*1920是多大尺寸可以打印成一寸的吗)

    1080*1920是多大尺寸(1080*1920是多大尺寸可以打印成一寸的吗)

  • 小爱同学是啥玩意(小爱同学干啥的)

    小爱同学是啥玩意(小爱同学干啥的)

  • win7打印服务自动停止(windows7打印服务)

    win7打印服务自动停止(windows7打印服务)

  • 为什么mp3下载的歌曲不能播放(为什么mp3下载的视频不能播放)

    为什么mp3下载的歌曲不能播放(为什么mp3下载的视频不能播放)

  • 苹果手机突然不能投屏(苹果手机突然不开机)

    苹果手机突然不能投屏(苹果手机突然不开机)

  • 电池寿命86需要换吗(电池寿命86%是什么意思)

    电池寿命86需要换吗(电池寿命86%是什么意思)

  • 查找我的iphone抹掉后会怎样(查找我的iPhone抹掉)

    查找我的iphone抹掉后会怎样(查找我的iPhone抹掉)

  • reader是什么意思(usb reader是什么意思)

    reader是什么意思(usb reader是什么意思)

  • 为什么手机关屏后收不到微信提示(为什么手机关屏幕了别人打电话就不显示)

    为什么手机关屏后收不到微信提示(为什么手机关屏幕了别人打电话就不显示)

  • 多媒体数据压缩可分为(多媒体数据压缩技术是多媒体关键技术之一)

    多媒体数据压缩可分为(多媒体数据压缩技术是多媒体关键技术之一)

  • ps怎么改变图层颜色(ps怎么改变图层里的图片大小)

    ps怎么改变图层颜色(ps怎么改变图层里的图片大小)

  • 手机一直开机关机是怎么回事(手机一直开机关机循环怎么让他停止)

    手机一直开机关机是怎么回事(手机一直开机关机循环怎么让他停止)

  • 淘宝怎么取消开抢提醒(淘宝怎么取消开团提醒2022)

    淘宝怎么取消开抢提醒(淘宝怎么取消开团提醒2022)

  • 苹果小球在哪里设置(苹果小球在哪里关闭)

    苹果小球在哪里设置(苹果小球在哪里关闭)

  • macOS Big Sur如何升级 macOS11.0升级教程(苹果电脑macos big sur)

    macOS Big Sur如何升级 macOS11.0升级教程(苹果电脑macos big sur)

  • 最新解决方法:Win11搜索框不能使用怎么办(wifan)

    最新解决方法:Win11搜索框不能使用怎么办(wifan)

  • 解决办法‘npm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。(解决办法总比困难多)

    解决办法‘npm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。(解决办法总比困难多)

  • WordPress更换域名教程(wordpress换域名后主题乱了)

    WordPress更换域名教程(wordpress换域名后主题乱了)

  • 增值税滞纳金怎么做账
  • 工商年报资产状况纳税总额怎么计算?
  • 出口退税一般退什么税
  • 减资需要交个税吗
  • 什么是财务报表审计
  • 应交税费是没有增值税吗
  • 待摊费用可以转入固定资产吗
  • 经营租入的固定资产是资产吗
  • 红字冲回是负数吗
  • 查补的税款怎样做账
  • 公司股权买了有什么用
  • 承租人融资租赁设备长期应付款包括租赁资产担保余值
  • 质保期内质量问题
  • 税务社保扣取300干嘛的
  • 行政单位基建账统一核算
  • 国税定额发票有效期是多长时间
  • 金税三期如何报个税
  • 监控系统施工费用包括哪些内容
  • 所得税计税方法
  • 应收款计提
  • 物业营改增什么时候开始
  • 资金印花税
  • 所得税申报表中的营业成本包括费用吗
  • 股权代持分红免税吗
  • 会计分录如何试算出来的
  • 无法取得房地产原值怎么缴纳房产税?
  • 零售行业折扣如何做账?
  • 个体工商户起征点10万执行时间
  • win11任务管理器在哪里打开
  • 怎么给分区
  • 空调应该计入什么科目
  • 收到债劵利息会减少吗
  • 虚假财务报表的法律后果
  • 在杂志上发表文章算出版吗
  • php浮点数四舍五入
  • vue组件强制刷新
  • 微信小程序实训内容
  • php 编码
  • php中文字符串截取
  • vue+elementui
  • 委托加工代收代缴消费税分录
  • mongodb副本集群
  • 零售行业bi
  • 净营业周期为负数
  • 用友删除凭证后为什么还在
  • 增值税专用发票怎么开
  • 金蝶专业版仓库管理怎么结账
  • 税务局核定税种需要多久
  • 合同资产和合同履约成本的区别
  • 小规模纳税人涉嫌虚开发票
  • 公司破产账务处理
  • 帮别人加工需要什么手续
  • 存货换入无形资产账务处理
  • 汇算清缴前取得发票可以税前扣除吗
  • 国家也通过国有企业利用自己的财政资金
  • 如何办icp许可证
  • sql语句参数值
  • Linux下mysql的root密码修改方法
  • win7升级win8.1
  • mac电脑怎么安装ie浏览器
  • kvm虚拟化网络配置
  • 苹果电脑使用u盾怎么用
  • linux关闭进程kill
  • cnqmax.exe进程的详细注解 cnqmax进程是病毒吗 安全吗
  • ct.dll
  • win7系统如何修改锁屏密码
  • cocos2d官网
  • es6 变量的解构赋值
  • 游戏开发之二维码怎么弄
  • javascript运行在什么的脚本语言
  • shell脚本转码
  • cmd开机启动命令
  • cmd 字符集
  • 用javascript写表单代码
  • bootstraprow布局
  • jquery使用什么方法隐藏元素
  • javascript bug
  • 内蒙古国地税联合网厅
  • 交管123发票审核
  • 应缴增值税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设