vue3中使用watch注意事项

本文详细介绍了Vue中watch和watchEffect的功能及用法,包括如何监听ref和reactive变量的变化,deep监听的方式,以及watchEffect的特点和应用场景。

编写watch函数需要编写两个参数,第一个是要监听的值,然后是一个回调函数。在函数中你可以获得到新知和老值。
使用watch的时候同样需要先导入

  • 监听使用ref定义的变量的时候时候,第一个参数直接使用
import {... , watch} from "vue"
setup() {
    const selectGirl = ref("");
    const data = reactive({
      girls: ["a", "b", "c"],
    
      selectGirlFun: (index) => {
        
        selectGirl.value = data.girls[index];
      },
    });
   const refData = toRefs(data);

      watch(selectGirl,(newValue, old) => {
       console.log(1111,newValue,old)
     });
    return {
      ...refData,
      selectGirl
    };
  },
  • 使用reactive定义的变量需要没在监听的时候需要使用函数返回值的形式才能监听到
  setup() {
    
    const data = reactive({
      girls: ["a", "b", "c"],
      selectGirl: "",
      selectGirlFun: (index) => {
        
        data.selectGirl = data.girls[index];
      },
    });
  
   const refData = toRefs(data);
    onRenderTriggered((event) => {
      console.log("状态触发组件--------------->");
      console.log(event);
    });
      watch(()=> data.selectGirl,(newValue, old) => {
       console.log(1111,newValue,old)
     });
    

    return {
      ...refData,
    };
  },

如果想要deep监听,

vm.$watch('someObject', callback, {
  deep: true
})
vm.someObject.nestedValue = 123
// callback is fired

immediate

vm.$watch('a', callback, {
  immediate: true
})
// 立即以 `a` 的当前值触发 `callback`

注意,在带有 immediate 选项时,你不能在第一次回调时取消侦听给定的 property。

// 这会导致报错
const unwatch = vm.$watch(
  'value',
  function() {
    doSomething()
    unwatch()
  },
  { immediate: true }
)

监听多个变量

参数需要写成数组的形式,同事返回的参数也是数组

  setup() {
    
    const data = reactive({
      girls: ["a", "b", "c"],
      selectGirl: "",
      selectGirlFun: (index) => {
        
        data.selectGirl = data.girls[index];
      },
    });
  
   const refData = toRefs(data);
    onRenderTriggered((event) => {
      console.log("状态触发组件--------------->");
      console.log(event);
    });
      watch([()=> data.girls,()=> data.selectGirl],(newValue, old) => {
       console.log(1111,newValue[1],old[1])
     });
    

    return {
      ...refData,
    };
  },

其实与 watch 类似的 API 还有一个就是:watchEffect,立即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变更时重新运行该函数。

<template>
  <button @click="change">count is: {{ state.count }}</button>
</template>

<script>
import { reactive, watchEffect } from 'vue'
export default {
  setup () {
    let state = reactive({count: 0})
    let change = () => state.count++;
    watchEffect(() => {
      console.log(state.count, '改变')
    })
    return { state, change }
  }
}
</script>

区分两者的区别

1、watch 是需要传入侦听的数据源,而 watchEffect 是自动收集数据源作为依赖。

2、watch 可以访问侦听状态变化前后的值,而 watchEffect 没有。

3、watch 是属性改变的时候执行,而 watchEffect 是默认会执行一次,然后属性改变也会执行。

<think>首先,用户的问题是关于Vue 3中的watch函数用法和示例。我需要根据系统级指令来构建我的回答。指令包括:使用$...$格式表示行内数学表达式(但这里不涉及数学,所以可能不需要),独立公式用$$...$$,但Vue 3主题不太可能用到数学公式。确保LaTeX语法正确,但同样,主题是编程,所以可能不适用。使用中文回答。生成相关问题。在回答中引用的段落末尾添加引用标识。 用户提供了引用内容,这些引用是关于Vue 3watch函数的,所以我应该参考这些来构建回答。引用包括: - [^1]: Vue3 指南:掌握 watch 函数的正确使用方法。基本示例监听响应式引用。 - [^2]: 第41节: Vue3 watch函数。示例监听message变化。 - [^3]: Vue3学习(5)- watchwatchEffect的使用watch可以监视四种数据:ref, reactive, getter函数, 数组。 - [^4]: Vue学习-watch函数的用法。代码示例监听ref对象。 - [^5]: vue3watch 函数参数说明。子组件中监听props变化。 用户的问题是:"我了解如何在Vue 3使用watch函数 请问Vue 3 watch函数用法和示例"。所以,我需要解释watch函数的用法并提供示例。 回答结构需要清晰,帮助用户逐步解决问题。内容要真实可靠,基于提供的引用。 大纲回答: 1. **介绍watch函数**:解释watch函数在Vue 3中的作用,用于侦听响应式数据变化。 2. **基本用法**:描述如何使用watch函数,包括参数。 3. **示例**:提供代码示例,展示不同场景: - 监听ref数据 - 监听reactive数据 - 监听props(在组件中) - 其他类型如getter函数或数组 4. **注意事项**:提到watch函数的限制或特点,如只能监视特定类型数据。 5. **生成相关问题**:在回答末尾,添加相关问题部分。 引用标识:在引用内容末尾添加[^n],其中n是引用编号。例如,如果我从引用[1]中提取信息,就在那段末尾加[^1]。 确保回答是中文。 生成相关问题:指令说“生成相关问题”,并参考示例(如快速排序后的问题)。所以,在回答末尾,添加“§§相关问题§§”部分,列出几个相关问题。 相关问题示例: 1. watch函数和watchEffect的区别是什么? 2. 如何在Vue 3监听深层对象的变化? 3. watch函数的性能优化技巧? 4. 在组合式API中如何正确使用watch? 现在,构建回答内容。 **回答结构:** - 开头简要介绍watch函数。 - 逐步解释用法: - 导入watch函数 - 基本语法:watch(source, callback, options) - 示例1:监听ref(基于引用[4]) - 示例2:监听reactive对象(基于引用[3]) - 示例3监听props(基于引用[5]) - 提到其他类型如getter函数 - 添加注意事项,如immediate和deep选项。 - 结尾生成相关问题。 添加引用标识:例如,在描述用法时,如果信息来自引用[1],就加[^1]。 确保代码块格式正确:在Markdown中使用```来包裹代码。 最终,添加相关问题部分。</think>### Vue 3watch 函数的用法与示例 在 Vue 3 中,`watch` 函数是组合式 API 的核心工具之一,用于侦听响应式数据的变化。当数据更新时,它可以触发自定义回调函数,执行副作用操作(如日志记录、数据同步或 API 调用)。`watch` 支持侦听多种数据类型,包括 `ref`、`reactive`、getter 函数或数组。下面我将一步步解释其用法,并提供代码示例。所有示例均基于 Vue 3 的组合式 API(使用 `<script setup>` 语法),确保内容真实可靠。 #### 1. **基本用法与语法** `watch` 函数需要导入自 `vue` 包,其基本语法为: ```javascript watch(source, callback, options) ``` - **source**:要侦听的数据源,可以是 `ref` 对象、`reactive` 对象、getter 函数(返回一个值)或这些类型的数组。 - **callback**:数据变化时执行的回调函数,参数为 `(newValue, oldValue)`。 - **options**(可选):配置对象,支持 `immediate`(立即执行回调)和 `deep`(深度侦听嵌套对象)等选项[^1][^3]。 Vue 3 的 `watch` 只能监视四种类型的数据:`ref` 定义的响应式引用、`reactive` 定义的响应式对象、getter 函数返回的值,或包含上述内容的数组[^3]。如果数据源类型不匹配,`watch` 可能无效。 #### 2. **示例:监听 ref 数据** `ref` 用于基本类型(如数字、字符串)。侦听时直接传入 `ref` 对象,无需 `.value`。以下示例监听一个计数器 `count` 的变化,并在控制台输出新旧值。 ```vue <script setup> import { ref, watch } from &#39;vue&#39;; const count = ref(0); const addCount = () => { count.value++; }; watch(count, (newValue, oldValue) => { console.log(&#39;count 变化了&#39;, &#39;新值:&#39;, newValue, &#39;旧值:&#39;, oldValue); }); </script> <template> <div>{{ count }}</div> <button @click="addCount">增加</button> </template> ``` 当点击按钮时,`count` 增加,回调函数自动执行。此示例展示了 `watch` 在简单状态管理中的应用[^4]。 #### 3. **示例:监听 reactive 对象** `reactive` 用于对象或数组。侦听时需指定具体属性或使用 getter 函数,避免直接侦听整个对象(可能导致性能问题)。以下示例侦听 `user` 对象的 `name` 属性。 ```vue <script setup> import { reactive, watch } from &#39;vue&#39;; const user = reactive({ name: &#39;Alice&#39;, age: 25 }); const updateName = () => { user.name = &#39;Bob&#39;; }; // 使用 getter 函数指定侦听属性 watch( () => user.name, // source 为 getter 函数 (newVal, oldVal) => { console.log(`用户名从 ${oldVal} 变为 ${newVal}`); } ); </script> <template> <div>{{ user.name }}</div> <button @click="updateName">更新名字</button> </template> ``` 如果侦听整个 `reactive` 对象,需启用 `deep: true` 选项来深度追踪嵌套变化[^3]。 #### 4. **示例:监听 props(在组件中)** 在组件间通信时,`watch` 常用于侦听父组件传递的 `props`。以下子组件示例侦听 `parentValue` 的变化。 ```vue <!-- 子组件 Child.vue --> <script setup> import { defineProps, watch } from &#39;vue&#39;; const props = defineProps({ parentValue: { type: null, // 支持任意类型 default: null } }); watch( () => props.parentValue, // source 为 getter 函数 (newVal, oldVal) => { console.log(`父组件值从 ${oldVal} 变为 ${newVal}`); }, { immediate: true } // 选项:组件挂载时立即执行一次 ); </script> <template> <div>接收到的值: {{ parentValue }}</div> </template> ``` 此例中,`immediate: true` 确保初始化时触发回调,便于处理默认值[^5]。 #### 5. **高级用法与注意事项** - **侦听多个数据源**:传入数组作为 `source`,回调参数也变为数组形式。例如: ```javascript watch([ref1, () => reactiveObj.key], ([newRef, newReactive], [oldRef, oldReactive]) => { // 处理变化 }); ``` - **性能优化**:默认 `watch` 是浅层侦听。对于嵌套对象,使用 `deep: true` 选项,但需谨慎以避免性能开销[^3]。 - **与 watchEffect 的区别**:`watch` 需显式指定数据源,而 `watchEffect` 自动追踪依赖。`watch` 更适合精确控制侦听逻辑[^1][^3]。 - **清理副作用**:在回调中返回一个函数可清理资源(如定时器),类似于 Vue 2 的 `$watch`。 通过以上示例,您可以在项目中灵活应用 `watch` 函数来处理数据响应逻辑。如需更多细节,参考 Vue 官方文档。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值