vue3 api watchEffect

watchEffect

传入一个副作用函数并执行,追踪函数内依赖的变量,当依赖的变量发生变化时再次执行副作用函数函数。

当副作用函数依赖一个变量

<template>
	<div>
	</div>
</template>

<script lang="ts" setup>
	import {ref, watchEffect} from "vue";

	let count = ref(0)
	watchEffect(() => {
		console.log('count:', count.value);
	})
	setInterval(() => {
		count.value++
	}, 1000)

</script>

控制台日志如下:
在这里插入图片描述

当副作用函数依赖多个变量

每个变量变化时都会触发副作用函数

<template>
	<div>
	</div>
</template>

<script lang="ts" setup>
	import {ref, watchEffect} from "vue";

	let count = ref(0)
	let count1 = ref(0)
	watchEffect(() => {
		console.log('count:', count.value);
		console.log('count1:', count1.value);
	})
	setInterval(() => {
		count.value++
	}, 1000)
	setInterval(() => {
		count1.value++
	}, 500)

</script>

在这里插入图片描述

停止侦听

watchEffect会返回一个停止侦听的函数,执行次函数就可以停止侦听依赖变量的变化

<template>
	<div>
	</div>
</template>

<script lang="ts" setup>
	import {ref, watchEffect} from "vue";

	let count = ref(0)
	const stop = watchEffect(() => {
		console.log('count:', count.value);
	})
	setInterval(() => {
		count.value++
	}, 1000)
	setTimeout(() => {
		stop()
	}, 5000)

</script>

在这里插入图片描述

清除副作用

副作用函数传入一个函数变量onInvalidate用于设置一个回调函数B,从第二次执行副作用函数以及组件卸载时会先执行回调函数B。
例如:依赖变量发生变化时请求接口数据,当第一次接口数据正在请求时,依赖的变量再次发生变化,此时可在回调函数B设置取消上一次的接口请求的操作

import {ref, watchEffect} from "vue";
import axios from "axios";
let count = ref(0)
watchEffect(async (onInvalidate) => { // 会马上执行此副作用函数,并在count.value发送变化时再次执行
	let a = count.value
	let source = axios.CancelToken.source() // 用于取消接口请求的token
	axios.get('', { // 使用当前页面作为测试接口
		cancelToken: source.token
	}).then(res => {
		console.log('success',a, res);// 请求成功
	}).catch(reason => {
		console.log('fail', a, reason);// 请求失败
	})

	onInvalidate(() => { // 当副作用函数多次执行或者组件被卸载时执行此回调函数
		console.log('onInvalidate')
		source.cancel() // 取消接口请求
	})
})
count.value++ // 触发第二次执行副作用函数
setTimeout(() => {
	count.value++ // 触发第三次执行副作用函数
}, 2000)

控制台输出日志
在这里插入图片描述

副作用函数的执行时机

通过watchEffect的第二个参数配置副作用函数的执行时机

watchEffect(() => {}, {
	flush: 'post'|'pre'|'sync'
})
  • post:组件渲染完成后执行副作用函数
  • pre: 组件渲染之前执行副作用函数
  • sync:立即执行副作用函数
<template>
	<div id="ss">
		{{count}}
	</div>
</template>

<script lang="ts" setup>
	import {ref, watchEffect} from "vue";
	let count = ref(0)
	watchEffect(() => {
		console.log('sync', count.value)
		let s = document.getElementById('ss')
		console.log(s&&s.innerHTML)
	}, {
		flush: 'sync'
	})
	watchEffect(() => {
		console.log('pre', count.value)
		let s = document.getElementById('ss')
		console.log(s&&s.innerHTML)
	}, {
		flush: 'pre'
	})
	watchEffect(() => {
		console.log('post', count.value)
		let s = document.getElementById('ss')
		console.log(s&&s.innerHTML)
	}, {
		flush: 'post'
	})
	setTimeout(() => {
		console.log('update count--------------------------')
		count.value++
		console.log('update count1++++++++++++++++++++++++')
	}, 2000)

</script>
<style scoped lang="scss">

</style>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue 3中引入了一个新的API,即`watchEffect`,用于监视响应式数据的变化并执行相应的副作用函数。下面是使用`watchEffect`的介绍: 1. `watchEffect`的基本用法: `watchEffect`接收一个函数作为参数,该函数中可以访问响应式数据,并在数据变化时执行相应的副作用操作。当响应式数据发生变化时,`watchEffect`会自动重新运行该函数。 ```javascript import { watchEffect } from 'vue'; watchEffect(() => { // 在这里执行副作用操作 }); ``` 2. 监视特定的响应式数据: 如果你只想监视特定的响应式数据,可以在`watchEffect`函数中直接访问它们。当这些数据发生变化时,副作用函数会被重新执行。 ```javascript import { reactive, watchEffect } from 'vue'; const state = reactive({ count: 0, message: 'Hello', }); watchEffect(() => { console.log(state.count); console.log(state.message); }); ``` 3. 停止监视: `watchEffect`返回一个停止监视的函数,可以在需要停止监视时调用。 ```javascript import { reactive, watchEffect } from 'vue'; const state = reactive({ count: 0, }); const stop = watchEffect(() => { console.log(state.count); }); // 停止监视 stop(); ``` 4. 监视多个响应式数据: 如果你想同时监视多个响应式数据,可以在副作用函数中访问它们,并将它们作为依赖项传递给`watchEffect`。 ```javascript import { reactive, watchEffect } from 'vue'; const state = reactive({ count: 0, message: 'Hello', }); watchEffect(() => { console.log(state.count); console.log(state.message); }, { flush: 'post', deep: true, }); ``` 在上面的示例中,`flush`选项设置为`post`,表示在DOM更新之后执行副作用函数。`deep`选项设置为`true`,表示深度监视响应式数据的变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bdawn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值