JavaScript 语言 如何使用Vue 3 watch vs watchEffect

JavaScript阿木 发布于 20 天前 4 次阅读


摘要:

在 Vue 3 中,响应式系统得到了极大的改进,其中 `watch` 和 `watchEffect` 是两个常用的响应式工具。本文将深入探讨这两个工具的使用方法、区别以及适用场景,帮助开发者更好地理解和运用它们。

一、

Vue 3 的响应式系统是基于 Proxy 实现的,相较于 Vue 2 的 Object.defineProperty,Vue 3 的响应式系统更加高效和强大。在 Vue 3 中,`watch` 和 `watchEffect` 是两个常用的响应式工具,它们可以帮助开发者追踪依赖和执行副作用。本文将围绕这两个工具展开讨论。

二、watch 的使用方法

`watch` 是 Vue 3 中用于观察和响应 Vue 实例上的数据变化的工具。它接受一个可观察的表达式或函数,当表达式或函数的依赖发生变化时,会执行回调函数。

javascript

import { ref, watch } from 'vue';

const count = ref(0);

// 监听 count 的变化


watch(count, (newValue, oldValue) => {


console.log(`count changed from ${oldValue} to ${newValue}`);


});

// 也可以监听一个返回函数的表达式


watch(() => count.value, (newValue, oldValue) => {


console.log(`count changed from ${oldValue} to ${newValue}`);


});


三、watchEffect 的使用方法

`watchEffect` 是 Vue 3 中用于自动收集依赖并执行副作用的工具。它接受一个回调函数,当回调函数中的响应式状态发生变化时,会重新执行。

javascript

import { ref, watchEffect } from 'vue';

const count = ref(0);

// 监听 count 的变化,并执行副作用


watchEffect(() => {


console.log(`count is: ${count.value}`);


// 这里可以执行任何依赖于 count 的副作用


});


四、watch 与 watchEffect 的区别

1. 使用场景

- `watch`:适用于需要手动指定依赖项和执行时机的情况,例如需要处理异步数据或执行复杂的副作用。

- `watchEffect`:适用于自动收集依赖并执行副作用的情况,简化了代码,减少了手动操作。

2. 依赖收集

- `watch`:需要显式指定依赖项,通过回调函数的参数获取旧值和新值。

- `watchEffect`:自动收集依赖项,无需手动指定,回调函数内部访问的响应式状态都会被收集。

3. 副作用执行时机

- `watch`:在依赖项变化时执行回调函数。

- `watchEffect`:在回调函数执行时自动收集依赖项,并在依赖项变化时重新执行。

五、适用场景分析

1. 当需要处理异步数据时,使用 `watch` 更为合适,因为它允许你手动控制依赖项的更新时机。

javascript

import { ref, watch } from 'vue';

const count = ref(0);


const fetchData = async () => {


const data = await fetch('/api/data');


count.value = data;


};

watch(count, (newValue) => {


console.log(`Data fetched: ${newValue}`);


});

fetchData();


2. 当需要执行复杂的副作用时,使用 `watch` 可以更好地控制副作用的生命周期。

javascript

import { ref, watch } from 'vue';

const count = ref(0);


const fetchData = async () => {


const data = await fetch('/api/data');


count.value = data;


};

watch(count, (newValue) => {


// 执行复杂的副作用


console.log(`Complex side effect with data: ${newValue}`);


});

fetchData();


3. 当需要自动收集依赖并执行副作用时,使用 `watchEffect` 可以简化代码。

javascript

import { ref, watchEffect } from 'vue';

const count = ref(0);

watchEffect(() => {


console.log(`count is: ${count.value}`);


// 自动收集依赖并执行副作用


});


六、总结

在 Vue 3 中,`watch` 和 `watchEffect` 是两个强大的响应式工具,它们在处理数据变化和副作用方面提供了极大的便利。开发者应根据具体的使用场景选择合适的工具,以达到最佳的开发体验和性能表现。本文通过对这两个工具的对比分析,希望能帮助开发者更好地理解和运用它们。