山东省城乡与建设厅网站成都电商网站
2026/2/16 18:47:33 网站建设 项目流程
山东省城乡与建设厅网站,成都电商网站,保健品网站制作,云南省工程建设信息网站一、watch 基本概念与用法1.1 核心概念watch 是 Vue 3 中用于监听特定数据源变化并执行副作用的 API。它默认是惰性的#xff0c;只有当监听的源发生变化时才会触发回调函数。这使得 watch 非常适合处理那些需要在特定状态变化时执行的异步操作或复杂逻辑。1.2 基本用法示例Op…一、watch 基本概念与用法1.1 核心概念watch 是 Vue 3 中用于监听特定数据源变化并执行副作用的 API。它默认是惰性的只有当监听的源发生变化时才会触发回调函数。这使得 watch 非常适合处理那些需要在特定状态变化时执行的异步操作或复杂逻辑。1.2 基本用法示例Options API 方式export default { data() { return { question: , answer: Questions usually contain a question mark. ;-), loading: false } }, watch: { // 当 question 变化时执行此函数 question(newQuestion, oldQuestion) { if (newQuestion.includes(?)) { this.getAnswer() } } }, methods: { async getAnswer() { this.loading true this.answer Thinking... try { const res await fetch(https://yesno.wtf/api) this.answer (await res.json()).answer } catch (error) { this.answer Error! Could not reach the API. error } finally { this.loading false } } } }Composition API 方式script setup import { ref, watch } from vue const question ref() const answer ref(Questions usually contain a question mark. ;-)) const loading ref(false) // 直接监听 ref watch(question, async (newQuestion, oldQuestion) { if (newQuestion.includes(?)) { loading.value true answer.value Thinking... try { const res await fetch(https://yesno.wtf/api) answer.value (await res.json()).answer } catch (error) { answer.value Error! Could not reach the API. error } finally { loading.value false } } }) /script template p Ask a yes/no question: input v-modelquestion :disabledloading / /p p{{ answer }}/p /template1.3 高级用法监听嵌套属性// Options API export default { watch: { some.nested.key(newValue) { // 当嵌套属性变化时触发 } } } // Composition API const obj reactive({ some: { nested: { key: 0 } } }) watch( () obj.some.nested.key, (newValue) { // 当嵌套属性变化时触发 } )深度监听// Options API export default { watch: { someObject: { handler(newValue, oldValue) { // 监听对象的所有嵌套属性变化 }, deep: true } } } // Composition API const obj reactive({ count: 0 }) // 直接监听 reactive 对象会自动创建深度监听 watch(obj, (newValue, oldValue) { // 当对象的任何嵌套属性变化时触发 })立即执行// Options API export default { watch: { question: { handler(newQuestion) { // 组件创建时立即执行一次 }, immediate: true } } } // Composition API watch( question, (newQuestion) { // 组件创建时立即执行一次 }, { immediate: true } )二、watchEffect 基本概念与用法2.1 核心概念watchEffect 是 Vue 3 中另一个强大的侦听器 API它会自动收集回调函数中的依赖并在依赖发生变化时重新执行回调。与 watch 不同watchEffect 会在组件创建时立即执行一次然后在依赖变化时再次执行。2.2 基本用法示例script setup import { ref, watchEffect } from vue const todoId ref(1) const data ref(null) // 自动收集 todoId.value 作为依赖 watchEffect(async () { const response await fetch( https://jsonplaceholder.typicode.com/todos/${todoId.value} ) data.value await response.json() }) /script2.3 高级用法副作用清理watchEffect((onCleanup) { const controller new AbortController() fetch(/api/${id.value}, { signal: controller.signal }) .then(response response.json()) .then(data { // 处理数据 }) // 当依赖变化时先执行清理函数 onCleanup(() { controller.abort() }) })调整执行时机// 默认在组件更新前执行 watchEffect(() {}) // 在组件更新后执行 watchEffect(() {}, { flush: post }) // 或使用别名 watchPostEffect(() {}) // 同步执行不进行批处理 watchEffect(() {}, { flush: sync }) // 或使用别名 watchSyncEffect(() {})三、watch 与 watchEffect 对比选型3.1 核心区别对比特性watchwatchEffect依赖追踪手动指定监听源自动收集回调中的依赖执行时机惰性执行仅在源变化时触发立即执行然后在依赖变化时触发参数获取可以获取新旧值无法直接获取新旧值使用场景监听特定数据源需要获取新旧值监听多个依赖不需要关心具体哪个依赖变化3.2 工作流程对比3.3 选型建议使用 watch 的场景需要监听特定的数据源变化需要获取变化前后的具体值需要执行惰性操作仅在源变化时执行需要深度监听或立即执行等高级配置使用 watchEffect 的场景需要监听多个依赖且不关心具体哪个依赖变化需要在组件创建时立即执行一次需要自动管理依赖减少代码维护成本处理异步操作时需要自动清理副作用四、性能优化技巧4.1 避免不必要的监听只监听实际需要的数据源避免监听整个大对象使用 getter 函数监听嵌套属性而不是使用 deep 选项对于不需要深度监听的对象避免使用 deep: true4.2 合理使用清理函数在处理异步操作时务必使用清理函数取消未完成的请求避免内存泄漏及时清理定时器、事件监听器等资源4.3 优化执行时机根据实际需求选择合适的 flush 选项对于不需要立即执行的操作使用默认的 pre 时机对于需要访问更新后 DOM 的操作使用 post 时机4.4 避免在侦听器中执行昂贵操作将复杂计算逻辑提取到计算属性中对于需要频繁执行的操作考虑使用防抖或节流五、课后 Quiz问题 1在 Vue 3 中watch 和 watchEffect 的主要区别是什么请至少列举 3 点。答案解析依赖追踪方式watch 需要手动指定监听源而 watchEffect 会自动收集回调中的依赖。执行时机watch 默认是惰性的只有当监听源变化时才会触发而 watchEffect 会在组件创建时立即执行一次然后在依赖变化时再次执行。问题 2如何在 watchEffect 中处理异步操作的副作用清理请给出代码示例。答案解析可以使用 watchEffect 回调函数的第一个参数 onCleanup 来注册清理函数watchEffect((onCleanup) { const controller new AbortController() fetch(/api/data, { signal: controller.signal }) .then(response response.json()) .then(data { // 处理数据 }) // 当依赖变化时先执行此清理函数 onCleanup(() { controller.abort() // 取消未完成的请求 }) })这个清理函数会在 watchEffect 重新执行前被调用确保之前的异步操作被正确取消避免不必要的资源消耗和潜在的错误。六、常见报错解决方案错误 1watch 监听 reactive 对象属性时无反应错误表现const obj reactive({ count: 0 }) // 此代码不会生效 watch(obj.count, (newValue) { console.log(count changed:, newValue) })原因分析watch 无法直接监听 reactive 对象的属性需要使用 getter 函数。解决办法watch( () obj.count, (newValue) { console.log(count changed:, newValue) } )错误 2watchEffect 无法正确追踪异步操作中的依赖错误表现watchEffect(async () { const data await fetchData() // 此处的依赖不会被正确追踪 console.log(user.value.name) })原因分析watchEffect 只在同步执行阶段收集依赖异步操作中的依赖不会被追踪。解决办法watchEffect(() { // 在同步阶段访问依赖 const userId user.value.id async function fetchData() { const data await fetch(/api/user/${userId}) // 处理数据 } fetchData() })错误 3内存泄漏问题错误表现在组件卸载后watch 或 watchEffect 仍然在执行导致内存泄漏。原因分析异步创建的侦听器不会自动与组件绑定需要手动停止。解决办法// 手动停止侦听器 const unwatch watchEffect(() { // 侦听逻辑 }) // 在组件卸载时停止 onUnmounted(() { unwatch() })

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询