侦听器watch 的用法

179 阅读2分钟

监听器的一般用法

export default {
    data(){
        return{
            list:{
                a:1,
                b:2
                c:''
                }
            }
        }
    },
    watch:{
        'list.c'(newval){
            console.log('list.c change' , newval)
        }
    }

当监听对象中的某个值的变化时 , 可以用字符串的形式监听 , 这样vue.js会一层一层的解析下去 , 直到遇到 c 才会设置监听函数 .

需要使用handler方发和 immediate 属性

export default {
    data(){
        return{
            list:{
                a:1,
                b:2
                c:''
                }
            }
        }
    },
    watch:{
        list:{
            handler(newval){
            console.log('list change' , newval)
            }
            deep:true  //设置深度监听 , 默认值为false
            immediate:true
         }
     }

这里绑定了一个handler方法,前一种写法是默认写了handler , vue.js会去处理这个逻辑 ,经过编译之后就是按照handler方法处理.

immediate:true代表着在watch里面声明 list 之后, 就会立即去执行handler方法 , 默认情况为false , 就像前一个一样 , 也可以不写 .

deep --- 深度监听 ; 当我们对哪个数据在未来的变化不清楚时 , 但又得知道哪个发生变化 , 可以对整个对象进行深度监听 , 此时需要用到的一个属性为 deep .

将 deep 设置为 true ,代表着会对 list 中的每一个元素进行监听 , 但是这样的对内存的占用会比较大 , 在一般情况下 , 推荐使用一般状态写法与字符串形式 , 可以定点监控减小浏览器的压力. 同理 , deep 在默认情况下位 false 可以省略 .

注销 watch

组件在使用过程中经常被销毁 , 比如从一个页面跳到另一个页面 , 原来的监听就没有用了 , 需要进行销毁 , 不然的话可能导致内存泄漏 , 所以建议将watch写在组件中 , 这样可以随着组件的销毁而销毁 .

export default {
    data(){
        return{
            list:{
                a:1
                }
            }
        }
    },
watch: {
        list(newVal) {
                 console.log(newval)
           }
        }

也可以手动注销 watch ,就是unWatch方法 ,只需要在监听器之后添加即可.

const uwatch = app.$watch: {
        list(newVal) {
                 console.log(newval)
           }
        },   //app.$watch会返回一个值 ,就是uwatch方法 , 在后面调用方法就可以了 .
        
   unWatch()   //手动注销