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

  • 什么是消费税的计税销售额?价外费用是什么?
  • 企业所得税如何合理避税?
  • 用友t6会计科目在哪里找
  • 小规模差额征税全额开票和差额开票
  • 工程施工与工程结算在资产负债表里
  • 椅子坐垫有用吗
  • 契税和房产税的减免政策
  • 水果销售公司账务怎么做
  • 小规模所得税税负率怎么计算
  • 自行研发无形资产暂时性差异
  • 买房印花税怎么计算出来
  • 应收账款转让的会计处理
  • 应收票据怎么写
  • 委托加工模具的费用计入什么科目?
  • 购买财务软件账务处理规定
  • 企业自有公租房有房产证吗
  • 管理费用的明细科目怎么写
  • 销售时无法确认发票
  • 所得税网上申报表
  • 小规模免了增值税怎么办
  • 营改增后建安企业账务处理
  • 房产税计税依据房产原值怎么算
  • 工商年检社保缴费基数按什么标准填
  • 股权转让收益算利润吗
  • 软件企业所得税两免三减半
  • 公司注销时存货计税依据
  • 工资不用交税还用上报么
  • 英雄联盟符文推荐怎么不弹出来
  • linux命令-a
  • 销售折扣单独开票
  • 承兑找零怎么做凭证
  • macos big sur 怎么样
  • php运用于哪些领域
  • mac上读取ntfs
  • 高新技术企业在哪申报年报
  • 财政补贴增值税如何开票
  • video.js教程
  • JavaScript | 1000个判断条件难道要写了1000个 if ? 一文教你如何实现分支优化
  • 数据挖掘和数据分析的区别与联系
  • 会计中利得的定义
  • 换货和退货有什么区别
  • 个人所得税申报流程图
  • 企业应收账款的主要内容
  • php页面出不来
  • 完税证明可以做为证据使用吗
  • 生成100个[30-99]之内的随机数
  • 公司向个人借款合法吗
  • 住宿费收入会计分录
  • 会计账簿有哪些作用
  • 员工缴纳工伤保险怎么赔偿
  • 计量差错引起的原材料盘亏
  • 企业会计核算中,对账的内容主要包括
  • 劳务公司机械租赁费列入什么费用
  • 支付技术转让费所得税处理
  • 弃置费用预计负债的会计处理
  • 对外投资如何做帐
  • 收到的专票必须当月认证吗
  • 一次性购买多张火车票
  • 一分钟教你
  • mysql索引类型及原理
  • win7系统怎样
  • windows10预装
  • win10预览版好吗
  • mac上itunes
  • win10系统局域网共享打印机设置
  • win8如何更改用户名字?
  • win8自启动
  • 错误日志项数
  • 如何获取硬盘所有文件的列表
  • xcopy命令拷贝目录
  • jq 绑定事件
  • unity中assets文件夹的作用
  • bootstrap-treeview自定义双击事件实现方法
  • jquery实现图片横向移动
  • python的介绍
  • 现在哪个行业的税负很重了
  • 纳税申报指什么意思
  • 甲种本什么意思
  • 税务和海关哪个单位比较好
  • 税务绩效工作存在的问题
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设