什么是watch属性
在 Vue 3 中,watch
仍然是一种用于监听数据变化并执行相应操作的方式,不过在组合式 API 中,watch
的使用方式与选项式 API 略有不同。以下是关于 Vue 3 中的 watch
的一些基本信息:
使用 watch
的基本语法:
在组合式 API 中,你可以使用 watch
函数来监听一个响应式数据的变化。
import { ref, watch } from 'vue'; const myValue = ref(0); watch(myValue, (newValue, oldValue) => { console.log(`myValue changed from ${oldValue} to ${newValue}`); });
在上面的例子中,watch
函数接受两个参数:要监听的响应式数据和回调函数。每当 myValue
的值变化时,回调函数就会被触发。
监听计算属性:
你也可以使用 watch
函数来监听计算属性的变化。
import { ref, computed, watch } from 'vue'; const myValue = ref(0); const squaredValue = computed(() => myValue.value ** 2); watch(squaredValue, (newValue, oldValue) => { console.log(`squaredValue changed from ${oldValue} to ${newValue}`); });
在这个例子中,watch
监听了 squaredValue
这个计算属性的变化。
停止监听:
watch
函数返回一个 stop
函数,用于停止监听。
import { ref, watch } from 'vue'; const myValue = ref(0); const stopWatch = watch(myValue, (newValue, oldValue) => { console.log(`myValue changed from ${oldValue} to ${newValue}`); }); // 停止监听 stopWatch();
即时调用
在 Vue 3 中,你可以通过将 immediate
设置为 true
来实现在 watch
中立即执行回调函数。当 immediate
为 true
时,watch
会在侦听器被创建的时候立即执行一次回调函数。
以下是一个使用 watch
的例子,演示了如何使用 immediate: true
实现即时回调:
import { ref, watch } from 'vue'; const myValue = ref(0); watch( myValue, (newValue, oldValue) => { console.log(`myValue changed from ${oldValue} to ${newValue}`); }, { immediate: true } ); // 在这里修改 myValue 的值 myValue.value = 42;
在上面的例子中,watch
的第三个参数是一个选项对象,通过 { immediate: true }
设置了立即执行回调。因此,当 myValue
的值发生变化时,watch
会立即执行回调函数。
深度监听:
你可以使用 watch
的第三个参数来进行深度监听。
import { ref, watch } from 'vue'; const myObject = ref({ prop: 1 }); watch(myObject, (newValue, oldValue) => { console.log('myObject changed', newValue); }, { deep: true });
在这个例子中,如果 myObject
内部的属性发生变化,也会触发监听器。
注意事项:
- 性能开销: 深度监听会对对象进行递归遍历,因此可能会带来一些性能开销。如果不需要深度监听,最好避免使用
{ deep: true }
。 - 对象引用: 深度监听只能监听对象的引用变化,而不能监听对象内部属性的变化。如果需要监听对象内部属性的变化,可以考虑使用
watchEffect
。
watchEffect
watchEffect
是 Vue 3 中提供的一个函数,用于创建即时执行的侦听器。它会立即执行一次传入的函数,同时会追踪函数内部使用到的响应式数据,当这些数据发生变化时,会再次执行该函数。
主要特点和作用如下:
- 即时执行:
watchEffect
会在创建时立即执行一次传入的函数,而且之后会在函数内使用到的响应式数据发生变化时再次执行。 - 自动追踪依赖: Vue 3 会自动追踪
watchEffect
内部使用到的响应式数据,并在这些数据变化时重新执行传入的函数。这样可以确保函数的执行与数据的变化保持同步。 - 无需指定侦听的具体数据: 不像
watch
需要明确指定要侦听的数据,watchEffect
会自动侦听函数内部使用到的所有响应式数据。
下面是一个简单的使用示例:
import { ref, watchEffect } from 'vue'; const myValue = ref(0); watchEffect(() => { console.log(`myValue changed to ${myValue.value}`); }); // 在这里修改 myValue 的值 myValue.value = 42;
在上面的例子中,watchEffect
会在初始化时执行一次传入的函数,并在 myValue
的值发生变化时再次执行。这种特性使得 watchEffect
在需要立即执行和无需手动指定侦听的场景下非常方便。
watch VS watchEffect
watchEffect
和 watch
是 Vue 3 中用于监听数据变化的两个主要 API。它们有一些关键的区别:
watchEffect
- 即时执行:
watchEffect
在创建时立即执行一次传入的函数,然后会在函数内使用到的响应式数据发生变化时再次执行。这使得watchEffect
适合于需要立即执行的场景。 - 自动追踪依赖:
watchEffect
会自动追踪函数内部使用到的响应式数据,无需手动指定侦听的具体数据。这使得代码更简洁,不需要额外的配置。 - 无需清理:
watchEffect
返回一个无需手动停止的函数,当组件卸载时,Vue 会自动停止对响应式数据的追踪。
import { ref, watchEffect } from 'vue'; const myValue = ref(0); watchEffect(() => { console.log(`myValue changed to ${myValue.value}`);
watch
- 需要明确指定侦听的数据:
watch
需要你明确指定要侦听的数据。你可以监听一个或多个数据,甚至可以监听计算属性或深度侦听对象。 - 更多配置选项:
watch
提供更多的配置选项,允许你指定immediate
参数以立即执行回调函数,使用deep
参数进行深度侦听,以及使用flush
参数控制回调函数的调用时机。 - 需要手动清理:
watch
返回一个停止监听的函数,你需要手动调用这个函数来停止对响应式数据的监听,特别是在组件卸载时。
import { ref, watch } from 'vue'; const myValue = ref(0); watch(myValue, (newValue, oldValue) => { console.log(`myValue changed from ${oldValue} to ${newValue}`); });
选择使用场景
- 使用
watchEffect
当你希望简化代码,即时执行回调,并且不需要手动停止监听。 - 使用
watch
当你需要更多的配置选项,例如需要指定immediate
、deep
或手动停止监听的情况下。
监听器 VS 计算属性
监听器(watch
)和计算属性(computed
)是 Vue 中两种不同的响应式数据处理方式,它们有一些关键的区别:
计算属性 (computed
)
- 用途: 计算属性用于根据依赖的响应式数据动态计算出一个新值。它通常用于对数据的派生,而不是直接存储数据。
- 特点: 计算属性是基于它的依赖进行缓存的。只有在依赖数据发生变化时,计算属性才会重新计算。这对于避免不必要的计算和提高性能非常有用。
- 语法: 计算属性使用
computed
函数来创建。计算属性的定义包括一个get
函数,用于计算属性的值,以及可选的set
函数,用于处理对计算属性的修改。
import { computed } from 'vue'; const fullName = computed({ get() { return `${this.firstName} ${this.lastName}`; }, set(value) { const [firstName, lastName] = value.split(' '); this.firstName = firstName; this.lastName = lastName; } });
监听器 (watch
)
- 用途: 监听器用于在某个数据变化时执行特定的操作,例如在数据变化时执行一些副作用或异步操作。
- 特点: 监听器可以监听一个或多个数据,当这些数据变化时执行回调函数。监听器更灵活,可以处理更复杂的逻辑。
- 语法: 监听器使用
watch
函数来创建。watch
接受要监听的数据和一个回调函数,回调函数会在数据变化时被触发。
import { ref, watch } from 'vue'; const myValue = ref(0); watch(myValue, (newValue, oldValue) => { console.log(`myValue changed from ${oldValue} to ${newValue}`); });
如何选择
- 使用计算属性当你需要根据一个或多个响应式数据派生出一个新的值,并希望充分利用 Vue 的缓存机制来提高性能。
- 使用监听器当你需要在数据变化时执行一些特定的操作,如副作用,或者当你需要监听多个数据的变化时。
虽然计算属性和监听器有不同的用途,但在实际开发中,你可能会根据具体的需求在不同场景中使用它们。