Vue3 setup中watch监听器的使用

作者: 温新

分类: 【Vue.js】

阅读: 7752

时间: 2021-08-22 12:08:14

作者:温新

时间:2021-08-22

hi,我是温新,一名PHPer

在setup中,使用监听器需要对其进行导入。watch监听器函数接收3个参数:

  • 1、一个想要侦听的响应式或getter函数;
  • 2、一个回调;
  • 3、可选的配置项

最基础的监听器的使用

<div id="app">
	<input type="text" v-model="webName">
	<p>{{ webName }}</p>
</div>

<script>
	const app = Vue.createApp({
		setup() {
			const {ref, watch} = Vue;
			let webName = ref('自如初');

			// 监听器监听webName的变化
			watch(webName, (newValue, oldValue)=>{
				console.log(newValue, '--', oldValue);
			})

			return {webName}
		}

	});
	const vm = app.mount('#app');
</script>

webName被改动时,监听器将触发并执行第二个参数(回调函数),它接收两个参数,分别是 newValue(新值)oldValue(旧值)

监听对象数据

<div id="app">
	<input type="text" v-model="webName">
	<p>{{ webName }}</p>
</div>

<script>
	const app = Vue.createApp({
		setup() {
			const {reactive, watch, toRefs} = Vue;
			let objData = reactive({webName:'自如初'});

			// 监听对象数据时,第一个参数需要是函数
			watch( () => objData.webName, (newValue, oldValue)=>{
				console.log(newValue, '--', oldValue);
			})

			// 数据解构
			let { webName } = toRefs(objData);

			return {webName}
		}
	});
	const vm = app.mount('#app');
</script>

监听多个数据

<div id="app">
	<input type="text" v-model="webName">
	<p>{{ webName }}</p>
	<input type="text" v-model="webUrl">
	<p>{{ webUrl }}</p>

</div>

<script>
	const app = Vue.createApp({
		setup() {
			const {reactive, watch, toRefs} = Vue;
			let objData = reactive({webName:'自如初', webUrl:'https://www.ziruchu.com'});

			// 监听多个数据时,参数为数组
			watch( [()=>objData.webName,()=>objData.webUrl], ([newValue, oldValue],[preNewVal, preOldVal])=>{
				console.log(newValue, '--', oldValue);
				console.log(preNewVal, '--', preOldVal);
			})

			// 数据解构
			let { webName, webUrl } = toRefs(objData);

			return {webName, webUrl}
		}
	});
	const vm = app.mount('#app');
</script>

watchEffect的使用

1、watchEffect会立即执行;

2、不需要手动传入所需要监听的数据;

3、接收的参数为一个回调函数;

4、只能获取新值,无法获取修改之前的值

<div id="app">
	<input type="text" v-model="webName">
	<p>{{ webName }}</p>
	<input type="text" v-model="webUrl">
	<p>{{ webUrl }}</p>

</div>

<script>
	const app = Vue.createApp({
		setup() {
			const {reactive, watch, watchEffect, toRefs} = Vue;
			let objData = reactive({webName:'自如初', webUrl:'https://www.ziruchu.com'});

			// 监听数据
			watchEffect(() => {
				console.log(objData.webName,'--',objData.webUrl)
			});

			// 数据解构
			let { webName, webUrl } = toRefs(objData);

			return {webName, webUrl}
		}
	});
	const vm = app.mount('#app');
</script>

停止监听

// 监听数据
let stop = watchEffect(() => {
	console.log(objData.webName,'--',objData.webUrl)
	setTimeout(()=>{
		stop();
	},3000);
});

我是温新

每天进步一点,就一点点

请登录后再评论