【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侦听器还有更多需要深入了解的地方,这里就不和大家深入展开了,在后面的章节中如果有需要深入了解的地方,会和大家一起深入学习的。这样也不会耽误大家的学习成本和时间。

相关文章
|
2天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
16 3
|
28天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
32 8
|
27天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
30 1
|
27天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
36 1
|
缓存 JavaScript
vue中computed和watch的区别
vue中computed和watch的区别
|
缓存 JavaScript
Vue 中 computed 和 watch 的区别
Vue 中 computed 和 watch 的区别
94 0
|
7月前
|
缓存 JavaScript
聊一聊Vue中的computed和watch区别
聊一聊Vue中的computed和watch区别
|
7月前
|
缓存 JavaScript
Vue 中的 computed 和 watch 的区别
Vue 中的 computed 和 watch 的区别
|
缓存 JavaScript 前端开发
Vue 中的 computed 和 watch 的区别
Vue 中的 computed 和 watch 的区别
222 0
|
缓存 JavaScript
Vue中computed和watch的区别
1、支持缓存,只有依赖数据发生改变,才会重新进行计算 2、不支持异步,当computed内有异步操作时无效,无法监听数据的变化
188 0
Vue中computed和watch的区别