目录

一、Vue2写法

1、watch使用的几种方法

2、watch中的immediate、handler和deep属性

1.immediate 和 handler

2.deep深度监听

3、总结

二、Vue3写法

1、侦听单个数据

2、侦听多个数据

3、immediate属性

4、deep(深度监听)


一、Vue2写法

1、watch使用的几种方法

1、通过 watch 监听 data 数据的变化,数据发生变化时,就会打印当前的值

 watch: {
     data(val, value) {
         console.log(val)
         console.log(value)
     }
 }

2、通过 watch 监听 list 数据的变化,数据发生变化时,this.number++(使用深度监听)

 data() {
     return {
         list: {
             'id': 1,
             'type': 0
         },
         number: 0
     }
 },
 watch: {
     list: {
         handler(newVal) {
             this.number++
         },
         deep: true
     }
 }

3、通过 watch 监听 data 数据的变化,数据发生变化时,执行 change 方法

 watch: {
     data: 'change' // 值可以为methods的方法名
 },
 methods: {
     change(curVal,oldVal){
    console.log(curVal,oldVal)
   }
 }

2、watch中的immediate、handler和deep属性

1.immediate 和 handler
  1. handler属性在watch中的作用是指定一个回调函数,在监视的数据发生变化时被调用
  2. 这样使用watch时有一个特点,就是当值第一次绑定时,不会执行监听函数,只有值发生改变时才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
 data() {
     return {
         list: {
             'id': 1,
             'type': 0
         },
         number: 0
     }
 },
 watch: {
     list: {
         handler(newVal) {
             this.number++
         },
         immediate: true
     }
 }
2.deep深度监听

        当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听

 data() {
     return {
         list: {
             'id': 1,
             'type': 0
         },
         number: 0
     }
 },
 watch: {
     list: {
         handler(newVal) {
             this.number++
         },
         deep: true
     }    
 }

        设置deep:true则可以监听到 list.id 的变化,此时会给 list 的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行 handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:

 data() {
     return {
         list: {
             'id': 1,
             'type': 0
         }
     }
 },
 watch: {
     'list.id': {
         handler(newVal, oldVal) {
              ......
         },
     deep: true
     }    
 }

这样只会给对象的某个特定的属性加监听器

3、总结

        数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听

二、Vue3写法

侦听一个或者多个数据的变化,数据变化时执行回调函数,俩个额外参数 immediate控制立刻执行,deep开启深度侦听

1、侦听单个数据

 <script setup>
   // 1. 导入watch
   import { ref, watch } from 'vue'
   const count = ref(0)
   // 2. 调用watch 侦听变化
   watch(count, (newValue, oldValue)=>{
     console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
   })
 </script>

2、侦听多个数据

侦听多个数据,第一个参数可以改写成数组的写法

 <script setup>
   // 1. 导入watch
   import { ref, watch } from 'vue'
   const count = ref(0)
   const name = ref('cp')
   // 2. 调用watch 侦听变化
   watch([count, name], ([newCount, newName],[oldCount,oldName])=>{
       console.log(`count或者name变化了,[newCount, newName],[oldCount,oldName])
   })
 </script>

3、immediate属性

在侦听器创建时立即出发回调,响应式数据变化之后继续执行回调

 <script setup>
   // 1. 导入watch
   import { ref, watch } from 'vue'
   const count = ref(0)
   // 2. 调用watch 侦听变化
   watch(count, (newValue, oldValue)=>{
          console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
   },{
        immediate: true
   })
 </script>

4、deep(深度监听)

通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep

 <script setup>
   // 1. 导入watch
   import { ref, watch } from 'vue'
   const state = ref({ count: 0 })
   // 2. 监听对象state
   watch(state, ()=>{
     console.log('数据变化了')
   })
   const changeStateByCount = ()=>{
     // 直接修改不会引发回调执行
     state.value.count++
   }
 </script>
 ​
 <script setup>
   // 1. 导入watch
   import { ref, watch } from 'vue'
   const state = ref({ count: 0 })
   // 2. 监听对象state 并开启deep
   watch(state, ()=>{
     console.log('数据变化了')
   },{deep:true})
   const changeStateByCount = ()=>{
     // 此时修改可以触发回调
     state.value.count++
   }
 </script>

5、监听对象内数据

监听 data对象的 phone 属性,那么只有当 data对象的phone 属性发生变更时,才会触发 watch 方法,其他属性变更不会触发 watch 方法。

 const data = ref({
         phone: "",
         password: ""
     })
     watch(() => data.value.phone, (newValue, oldValue) => {
         if (newValue.length == 11) {
             disabled.value = false
         } else {
             disabled.value = true
         }
         // console.log(`phone发生了变化,老值为${oldValue},新值为${newValue}`)
     })

6、监听对象的所有属性

 watch(() => demo, (newValue, oldValue) => {
     console.log('watch 已触发', newValue)
 }, { deep: true })

这个相当于监听整个对象(效果与上面的第一种相同)。但是实现方式与上面第一种是不一样的,这里我们可以看到,第一个参数是箭头函数,并且还多了第三个参数 { deep: true }。当加上了第三个参数 { deep: true },那么就不仅仅是监听对象的子属性了,它还会监听 孙属性,曾孙属性 ...

通常要实现监听对象的所有属性,我们都会采用上面第一种方法,原因无他,第一种编码简单,第一个参数直接传入 demo 即可。

GitHub 加速计划 / vu / vue
109
19
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
9e887079 [skip ci] 1 年前
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐