位置: 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函数的详细解析

  • 中小企业网络推广,如今中小企业老板们一片茫然(中小企业网络推广如何做)

    中小企业网络推广,如今中小企业老板们一片茫然(中小企业网络推广如何做)

  • 简单邮件传送协议smtp使用的端口号为(简单邮件传送协议SMTP使用的端口号为( ))

    简单邮件传送协议smtp使用的端口号为(简单邮件传送协议SMTP使用的端口号为( ))

  • 跳转到原网页什么意思(网页跳转到其他网页代码)

    跳转到原网页什么意思(网页跳转到其他网页代码)

  • 苹果手机闹钟稍后提醒间隔要怎么设置(苹果手机闹钟稍后提醒怎么关闭)

    苹果手机闹钟稍后提醒间隔要怎么设置(苹果手机闹钟稍后提醒怎么关闭)

  • 云闪付的账单如何才能删除?(云闪付账单如何删除明细记录)

    云闪付的账单如何才能删除?(云闪付账单如何删除明细记录)

  • iphone11为什么厚(iphone11为什么这么厚)

    iphone11为什么厚(iphone11为什么这么厚)

  • 极速退款能连续用几次(极速退款能连续退吗)

    极速退款能连续用几次(极速退款能连续退吗)

  • stop:0x00000074蓝屏代码是什么意思

    stop:0x00000074蓝屏代码是什么意思

  • 连接到计算机网络上的计算机都是(连接到计算机网络中的计算机)

    连接到计算机网络上的计算机都是(连接到计算机网络中的计算机)

  • 网络开小差了是啥意思(网络开小差是怎么办)

    网络开小差了是啥意思(网络开小差是怎么办)

  • 苹果7p是什么时候上市的(苹果7p是什么时候上市的手机)

    苹果7p是什么时候上市的(苹果7p是什么时候上市的手机)

  • 红米k20pro摄像头弹不出来(红米k20pro摄像头红灯闪烁)

    红米k20pro摄像头弹不出来(红米k20pro摄像头红灯闪烁)

  • AirPodsPro入耳检测在哪(airpodspro入耳检测不灵敏)

    AirPodsPro入耳检测在哪(airpodspro入耳检测不灵敏)

  • 快手号被限流了怎么办(快手号被限流了怎么解除)

    快手号被限流了怎么办(快手号被限流了怎么解除)

  • 微信会被永久封号吗(微信会被永久封号了怎么办)

    微信会被永久封号吗(微信会被永久封号了怎么办)

  • 怎么看qq会员是谁充的(怎么看qq会员是不是自动续费)

    怎么看qq会员是谁充的(怎么看qq会员是不是自动续费)

  • 电脑xp系统怎么升级(新电脑怎么安装系统)

    电脑xp系统怎么升级(新电脑怎么安装系统)

  • oppo单手模式怎么启动(OPPO单手模式怎么操作)

    oppo单手模式怎么启动(OPPO单手模式怎么操作)

  • 小米9se有没有红外(小米九se有红外吗)

    小米9se有没有红外(小米九se有红外吗)

  • 如何去除手机新闻资讯(如何去除手机新闻广播)

    如何去除手机新闻资讯(如何去除手机新闻广播)

  • 抖音小助手有什么用(抖音小助手什么时候开始有)

    抖音小助手有什么用(抖音小助手什么时候开始有)

  • 怎么让港版x支持电信(港版怎么用支付宝支付)

    怎么让港版x支持电信(港版怎么用支付宝支付)

  • 进项留抵转出会计分录
  • 印花税的分录如何做
  • 在计算应纳税所得额时下列
  • 企业纳税申报表包括哪些表
  • 不征税收入有哪些类型
  • 个税返还手续费奖励员工需要交个税吗
  • 设置会计科目的步骤
  • 进口设备贴息政策2019
  • 劳动局仲裁支付的补偿怎么做账?
  • 什么费用需要进行摊销
  • 银行发行理财产品的条件
  • 减免税款怎么入账
  • 劳务公司开票是开劳务费还是工程服务
  • 电子发票开错了怎么解决?
  • 技术服务费属于无形资产吗
  • 服务费发票怎么做分录
  • 房产增值税是怎么交的呢
  • 普通硅酸盐水泥和矿渣硅酸盐水泥的区别
  • 租赁农民土地应该开发票吗
  • 减税降费在中国 应形成制度性
  • 企业所得税应纳税所得额不得扣除
  • 抄报是不是在申报之后才能成功?
  • 内帐应收应付款坏账年末怎么处理?
  • 返利是冲减收入吗
  • 华为mate50pro怎么读
  • php递归算法经典实例
  • 出租商品计入其他业务收入吗
  • navapp.exe - navapp是什么进程文件 作用是什么
  • 行政事业单位预算由收入预算、支出预算组成
  • 购买不动产会计分录
  • win10磁盘碎片整理打不开
  • php_fileinfo作用
  • 计算机网络的基本概念
  • php获取字符串中的指定字符
  • 财务费用的核算属于什么业务
  • 编译和链接的区别是什么
  • 图像边缘检测的基本原理
  • 参加《2022 中国开发者影响力盛典》我的 4 重收获!
  • semeion手写数据集
  • thinkphp如何连接数据库
  • 房地产企业建筑成本
  • 诉讼费发票丢失可以补开吗
  • 工会会费收取
  • 未分配利润为负数严重吗
  • 发放股票股利的账务处理
  • python字典按要求
  • 如何用python给excel每一行添加序号
  • python中if语句的用法
  • 新增四大行业营收排名
  • 合同权益如何进行转让
  • 安装SQL2005的实训体会
  • mysql导入sql文件命令
  • 盈利能力还有什么能力
  • 外贸出口企业的收入交增值税吗
  • 国税代开专票缴纳城建税分录?
  • 小微企业营业外收入二级科目怎么
  • 企业接收到政府信息
  • 材料核销的依据
  • 打印银行电子流水发到别人邮箱,能看到我的账户余额吗
  • 现金支付中的现金是什么
  • 一般纳税人抵扣进项税流程
  • 提供劳务的收入计入什么科目
  • mysql中的rand函数
  • centos 安装chia
  • win8系统盘瘦身
  • powershow是什么意思
  • linux关闭系统
  • windows10分辨率太高
  • Win10 Mobile 10586.312提前体验
  • OSG 砖块 shader 例子 GLSL
  • js判断函数
  • js日期格式化方法
  • Chrome调试技巧
  • 置顶什么意思啊
  • android开发—01开发环境的搭建
  • js实现的倒计时怎么用
  • javascript用法
  • 外资企业怎样
  • 公共卫生委员会领导小组
  • 国家发票真伪查验
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设