【Vue3从零开始-第六章】6-7 compositionAPI中的watch和watchEffect的使用(下)

简介: 【Vue3从零开始-第六章】6-7 compositionAPI中的watch和watchEffect的使用(下)

]UWOD(KIB9LJS9~S[T{QHM9.png


前言


上一篇的文章中,我们一起学习了compositionAPI中的watch和watchEffect的使用(上),本篇文章中我们继续学习compositionAPI中的watch和watchEffect的使用(下)


watch中的immediate


上一章节中我们一起学习了compositionAPI中的watch侦听器的使用方法,知道了它具备一定的惰性,也就是页面加载时不会立即执行的侦听器,当然watch侦听器也可以去设置是否惰性执行的方法。


watch([() => nameObj.name, () => nameObj.job], ([curNameVal, curJobVal], [preNameVal, preJobVal]) => {
   console.log(curNameVal, preNameVal + '-----' + curJobVal, preJobVal)
}, { immediate: true })
复制代码


  • watch侦听器中还有第三个参数:immediate,将它设置为true之后,就会在页面加载完成之后立即执行watch侦听器方法


H9XDU1C[B6VZY(~[FSG)67I.png


除了watch侦听器之外,compositionAPI还提供了另外一个侦听器:watchEffect


watchEffect


watchEffect侦听器watch侦听器类似,都是用来侦听某个数据值发生改变的。

但是watchEffect侦听器默认就是immediate类型的,也就是刷新页面之后就会立即触发侦听器方法。


watchEffect(() => {
    console.log('abc')
})
复制代码


  • watchEffect侦听器的代码就比watch侦听器的代码要简洁得多。


  • 而且watchEffect侦听器里面只接收一个回调函数


1VX4XAEJ{]F[$9(BTBG5T$L.png


  • 通过刷新页面可以看出,浏览器控制台会在页面加载完成之后理解执行watchEffect侦听器函数


  • 当我们改变input标签中的值时,控制台是没有任何变化的。


❓ 只有一个回调函数的话如何监听我们需要的数据值呢 ❓


watchEffect(() => {
    console.log(nameObj.name)
})
复制代码


  • 我们把输出的内容改成我们之前定义的数据值,即可完成该数据值的侦听了。


DW_IKYW2P@W1)GM`O)MCXDC.png


  • watchEffect侦听器会自动检测回调函数中的代码,当它检测到内部的值有依赖的话,就会去侦听值的改变了。


  • 如果检测到里面的数据并没有对其他数据的依赖,那么watchEffect侦听器就不会做任何侦听行为。


因为目前watchEffect侦听器函数中只有对nameObj.name的依赖,所以当我们改变nameObj.job的值时,是不会有任何反应的。



watchEffect(() => {
    console.log(nameObj.name)
    console.log(nameObj.job)
})
复制代码


  • 此时我们把job的依赖关系也加到watchEffect侦听器函数中去。


4C}]8[VCT~EF)9{C4~7PW}F.png


  • 当我们把namejob都放到watchEffect侦听器函数中之后,两者的依赖关系都有了,在页面上改变数据值的时候,控制台都会输出改变之后的值。


  • 但是watchEffect侦听器只会输出最新的值,并不会和watch侦听器一样输出原始值。


watch和watchEffect对比


通过两个章节的内容,我们会发现这两个侦听器还是有许多不同点的。


  1. watchEffect侦听器是页面加载完之后立即执行的,而watch侦听器是有一定的惰性,如果需要立即执行,需要加上第三个参数:immediate


  1. watchEffect侦听器不需要传递你侦听的内容,会自动感知代码依赖;而watch侦听器会让你传递需要侦听的参数,包括但不限于基础类型、函数、数组等。


  1. watchEffect侦听器是不能获取到原始数据的值;而watch侦听器是可以获取到每一次改变的值和改变之前的值。


停止侦听


假如有个场景,我们需要侦听某个值的变化,而一段时间之后我们就不需要去侦听该值了,那应该怎么办呢?


const stop = watchEffect(() => {
    console.log(nameObj.name)
    console.log(nameObj.job)
    setTimeout(() => {
        stop()
    }, 2000)
})
复制代码


  • 我们可以给侦听器定义一个stop来接收这个侦听器函数。


  • 在侦听器函数中写一个定时器,两秒之后执行stop函数即可。


CQE(YD4J5AD2MG39JP}{VOR.png


  • 在浏览器控制台中就会发现,当我们在两秒钟之内改变数据值时,控制台还会打印出数据,但是两秒钟之后再去改变数据值时,控制台是没有任何反应的。


总结


结合上一篇文章,主要和大家一起学习了watch侦听器watchEffect侦听器的用法和区别,大家在实战过程中需要结合实际情况去使用这两个侦听器。


比如当我们使用Ajax请求的时候,可能用不到之前的值,这时候就可以使用watchEffect侦听器了。


其实watch侦听器和watchEffect侦听器还有更多需要深入了解的地方,这里就不和大家深入展开了,在后面的章节中如果有需要深入了解的地方,会和大家一起深入学习的。这样也不会耽误大家的学习成本和时间。

相关文章
|
3天前
|
JavaScript
vue3- antd design vue 引入iconfont
vue3- antd design vue 引入iconfont
|
11天前
|
缓存 监控 UED
升级 Vue3 时,如何减少打包体积的增加?
升级 Vue3 时,如何减少打包体积的增加?
105 59
|
11天前
|
JavaScript
在vue3中(vite)引入unocss,安装配置unocss
在vue3中(vite)引入unocss,安装配置unocss
|
2天前
|
JavaScript 数据格式
vue3 + Ant design vue formItem 无法使用嵌套的form表单校验
vue3 + Ant design vue formItem 无法使用嵌套的form表单校验
16 1
|
1天前
|
JavaScript 前端开发
vue尚品汇商城项目-day01【4.完成非路由组件Header与Footer业务】
vue尚品汇商城项目-day01【4.完成非路由组件Header与Footer业务】
9 2
|
1天前
|
JavaScript 前端开发
vue尚品汇商城项目-day01【3.项目路由的分析】
vue尚品汇商城项目-day01【3.项目路由的分析】
6 1
|
2天前
|
JavaScript
vue尚品汇商城项目-day03【23.把首页当中的轮播图拆分为一个共用的全局组件】
vue尚品汇商城项目-day03【23.把首页当中的轮播图拆分为一个共用的全局组件】
10 2
|
1天前
|
JavaScript 前端开发 数据安全/隐私保护
vue尚品汇商城项目-day01【5.路由组件的搭建】
vue尚品汇商城项目-day01【5.路由组件的搭建】
5 0
vue尚品汇商城项目-day01【5.路由组件的搭建】
|
2天前
|
JavaScript 索引
vue尚品汇商城项目-day04【25.面包屑处理关键字】
vue尚品汇商城项目-day04【25.面包屑处理关键字】
12 1
|
2天前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day04【28.详情页面Detail】
vue尚品汇商城项目-day04【28.详情页面Detail】
9 1