【Vue3】watch监听使用【超详细】

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638


  1. #watch使用结构
  2. watch(被监视的数据,监视的回调,配置对象(deep,immediate等...))
  3. let xxx = ref("1111") 或者 reactive({a:1,b:2})
  4. watch(xxx,(newVal,oldVal)=>{
  5. },{
  6. deep:true,immediate:true
  7. })
复制代码
  vue3中watch只能监听的以下四种数据:
  

  • 一个getter函数(一个能返回值的函数)
  • ref定义的值
  • reactive定义的值
  • 包罗以上内容的数组`
  情况一:监听ref定义的基本范例数据

watch监听ref简单的基本范例数据
代码展示
  1. <template>
  2.     <div class="itemStyle">
  3.           <div>
  4.               姓名: <input type="text" v-model="name">
  5.           </div>
  6.           <div>
  7.             <button @click="handleChangeName">修改名称</button>
  8.         </div>
  9.     </div>
  10. </template>
  11. <script setup lang="ts" name="item">
  12.     import {ref,reactive,toRefs,toRef,watch} from "vue"
  13.     let name = ref("小张")
  14.         const handleChangeName = ()=>{
  15.         name.value="泰罗奥特曼"
  16.     }
  17.     watch(name,(newVal,oldVal)=>{
  18.         console.log("新值:",newVal);
  19.         console.log("旧值:",oldVal);
  20.     })
  21. </script>
复制代码
解除监听案例
  1. <template>
  2.     <div class="itemStyle">
  3.           <div>
  4.             当前数量: <span>{{num}}</span>
  5.         </div>
  6.         <div>
  7.             <button @click="handleAdd">添加数量</button>
  8.         </div>
  9.     </div>
  10. </template>
  11. <script setup lang="ts" name="item">
  12.     import {ref,reactive,toRefs,toRef,watch} from "vue"
  13.     let num = ref(1)
  14.     const handleAdd = ()=>{
  15.         num.value++
  16.     }
  17.     let stopWatch = watch(num,(newVal,oldVal)=>{
  18.         console.log("我监听了");
  19.         if(newVal>5){
  20.             stopWatch()
  21.         }
  22.     })
  23. </script>
复制代码
情况二:监听ref定义的对象范例数据

watch监听ref简单的对象范例数据,若想监视对象内下属性的厘革,必要手动开启深度监视
代码展示
  1. <template>
  2.     <div class="itemStyle">
  3.           <div>
  4.               姓名: <input type="text" v-model="data.name">
  5.           </div>
  6.           <div>
  7.               年龄: <input type="text" v-model="data.age">
  8.           </div>
  9.           <div>
  10.               爱好: <input type="text" v-model="data.hobby">
  11.           </div>
  12.         <div>
  13.             <button type="button" @click="handleChangeData">修改数据</button>
  14.         </div>
  15.     </div>
  16. </template>
  17. <script setup lang="ts" name="item">
  18.     import {ref,reactive,toRefs,toRef,watch} from "vue"
  19.     let data = ref({
  20.         name:"小张",
  21.         age:18,
  22.         hobby:"打篮球"
  23.     })
  24.     const handleChangeData = ()=>{
  25.         data.value = {
  26.             name:"小红",
  27.             age:20,
  28.             hobby:"打乒乓球"
  29.         }
  30.     }
  31.     watch(data,(newVal,oldVal)=>{
  32.         console.log("新值:",newVal);
  33.         console.log("旧值:",oldVal);
  34.     },{
  35.         deep:true,//开启深度监听
  36.     })
  37. </script>
复制代码
情况三:监听reactive定义的对象范例数据

特别注意:如果监听reactive对象中的地址值,默认开启深度监听的,不能关闭
代码展示
  1. <template>
  2.     <div class="itemStyle">
  3.           <div>
  4.               姓名: <input type="text" v-model="data.name">
  5.           </div>
  6.           <div>
  7.               年龄: <input type="text" v-model="data.age">
  8.           </div>
  9.           <div>
  10.               爱好: <input type="text" v-model="data.hobby">
  11.           </div>
  12.           <div>
  13.               其他: <input type="text" v-model="data.other.c.d">
  14.           </div>
  15.         <div>
  16.             <button type="button" @click="handleChangeData">修改数据</button>
  17.         </div>
  18.     </div>
  19. </template>
  20. <script setup lang="ts" name="item">
  21.     import {ref,reactive,toRefs,toRef,watch} from "vue"
  22.     let data = reactive({
  23.         name:"小张",
  24.         age:18,
  25.         hobby:"打篮球",
  26.         other:{
  27.             a:"1111",
  28.             b:"2222",
  29.             c:{
  30.                 d:"1111",
  31.                 e:"2222",
  32.             }
  33.         }
  34.     })
  35.     const handleChangeData = ()=>{
  36.         Object.assign(data,{
  37.             name:"小红",
  38.             age:20,
  39.             hobby:"打乒乓球"
  40.         })
  41.     }
  42.         //此时是有问题的:oldVal会和newVal数据保持一致,当data里面的任意值改变,都会触发该监听,强制开启深度监听
  43.     //watch(data,(newVal,oldVal)=>{
  44.      //   console.log("新值:",newVal);
  45.     //    console.log("旧值:",oldVal);
  46.     //})
  47.    
  48.     //使用()=>箭头函数监听data对象中name属性
  49.     watch(()=>data.name,(newVal,oldVal)=>{
  50.         console.log("新值:",newVal);
  51.        console.log("旧值:",oldVal);
  52.     })
  53. </script>
复制代码
情况四:监听ref或reactive定义的对象范例数据中某个属性

特别注意:

  • 若该属性值不是【对象范例】,必要写成函数形式
  • 若该属性值是依然是【对象范例】,可直接写,也可以写成函数,建议写成函数
结论:监视的要是对象里的属性,那么最好写函数式。
注意点:如果对象监视的是地址值,必要关注对象内部,必要手动开启深度监视。
代码展示
  1. <template>
  2.     <div class="itemStyle">
  3.           <div>
  4.               姓名: <input type="text" v-model="data.name">
  5.           </div>
  6.           <div>
  7.               年龄: <input type="text" v-model="data.age">
  8.           </div>
  9.           <div>
  10.               爱好: <input type="text" v-model="data.hobby">
  11.           </div>
  12.           <div>
  13.               其他: <input type="text" v-model="data.other.c.d">
  14.           </div>
  15.         <div>
  16.             <button type="button" @click="handleChangeOtherData">修改其他</button>
  17.         </div>
  18.     </div>
  19. </template>
  20. <script setup lang="ts" name="item">
  21.     import {ref,reactive,toRefs,toRef,watch} from "vue"
  22.     let data = reactive({
  23.         name:"小张",
  24.         age:18,
  25.         hobby:"打篮球",
  26.         other:{
  27.             a:"1111",
  28.             b:"2222",
  29.             c:{
  30.                 d:"1111",
  31.                 e:"2222",
  32.             }
  33.         }
  34.     })
  35.     const handleChangeOtherData = ()=>{
  36.        data.other.c={
  37.                 d:"wwwww",
  38.                 e:"qqqqq",
  39.             }
  40.     }
  41.         //监视响应式对象中的某个属性,且该属性是基本类型的,要写成函数
  42.         watch(()=>data.name,(newVal,oldVal)=>{
  43.         console.log("新值:",newVal);
  44.         console.log("旧值:",oldVal);
  45.     })
  46.        
  47.         //监视响应式对象中的某个属性,且该属性是对象类型的,可以直接写,也能写函数,更推荐写函数
  48.     watch(()=>data.other.c,(newVal,oldVal)=>{
  49.         console.log("新值:",newVal);
  50.         console.log("旧值:",oldVal);
  51.     })
  52. </script>
复制代码
情况五:监听上述多个数据

代码展示
  1. <template>
  2.     <div class="itemStyle">
  3.           <div>
  4.               姓名: <input type="text" v-model="data.name">
  5.           </div>
  6.           <div>
  7.               年龄: <input type="text" v-model="data.age">
  8.           </div>
  9.           <div>
  10.               爱好: <input type="text" v-model="data.hobby">
  11.           </div>
  12.           <div>
  13.               其他: <input type="text" v-model="data.other.c.d">
  14.           </div>
  15.         <div>
  16.             <button type="button" @click="handleChangeOtherData">修改其他</button>
  17.         </div>
  18.     </div>
  19. </template>
  20. <script setup lang="ts" name="item">
  21.     import {ref,reactive,toRefs,toRef,watch} from "vue"
  22.     let data = reactive({
  23.         name:"小张",
  24.         age:18,
  25.         hobby:"打篮球",
  26.         other:{
  27.             a:"1111",
  28.             b:"2222",
  29.             c:{
  30.                 d:"1111",
  31.                 e:"2222",
  32.             }
  33.         }
  34.     })
  35.     const handleChangeOtherData = ()=>{
  36.         data.other.c={
  37.                 d:"wwwww",
  38.                 e:"qqqqq",
  39.             }
  40.     }
  41.         //监视,情况五:监视上述的多个数据
  42.     watch([data.other.c,()=>data.name,()=>data.age,()=>data.hobby],(newVal,oldVal)=>{
  43.         console.log("新值:",newVal);
  44.         console.log("旧值:",oldVal);
  45.     },{deep:true})
  46. </script>
复制代码
  ✨                                                   踩坑不易,还希望各位大佬支持一下                                            \textcolor{gray}{踩坑不易,还希望各位大佬支持一下}                     踩坑不易,还希望各位大佬支持一下

回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表