Vue中的侦听器 --watch

一、侦听器

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

二、监视的两种写法

1.new vue时传入watch配置

2.通过vm.$watch监视

<div id="root">
        <h1>今天天气很{{info}}</h1>
        <button @click="changeWeather">点我切换天气</button>
 </div>
    <script>
        Vue.config.productionTip = false; //设置为 false 以阻止 vue 在启动时生成生产提示。

        const vm = new Vue({
            el: '#root',
            data:{
                isHot:true
            },
            computed:{
                info(){
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                changeWeather(){
                    this.isHot = !this.isHot
                }
            },
            /* watch:{
                isHot:{
                    immediate: true, //初始化时让handler调用一下
                    // handler 什么时候调用  isHot发生改变时
                    handler(newValue,oldValue){
                        console.log('isHot被修改了',newValue,oldValue);
                    }
                }
            } */
        })
        vm.$watch('isHot',{
            immediate: true, //初始化时让handler调用一下
             // handler 什么时候调用  isHot发生改变时
            handler(newValue,oldValue){
            console.log('isHot被修改了',newValue,oldValue);
                    }
        })
    </script>

三、深度监视

1.深度监视:

vue中的watch默认不检测对象内部值得改变(一层)

配置deep:true可以检测对象内部值改变(多层)

2.备注:

vue自身可以检测对象内部值得改变 但vue提供的watch默认不可以

使用watch时根据数据的具体结构 决定是否采用深度监视

<div id="root">
        <h1>今天天气很{{info}}</h1>
        <button @click="changeWeather">点我切换天气</button>
        <hr/>
        <h3>a的值是:{{number.a}}</h3>
        <button @click="number.a++">点我让a+1</button>
        <hr/>
        <h3>b的值是:{{number.b}}</h3>
        <button @click="number.b++">点我让b+1</button>
    </div>
    <script>
        Vue.config.productionTip = false; //设置为 false 以阻止 vue 在启动时生成生产提示。

        const vm = new Vue({
            el: '#root',
            data:{
                isHot:true,
                number:{
                    a:1,
                    b:1
                }
            },
            computed:{
                info(){
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                changeWeather(){
                    this.isHot = !this.isHot
                }
            },
            watch:{
                isHot:{
                    // immediate: true, //初始化时让handler调用一下
                    // handler 什么时候调用  isHot发生改变时
                    handler(newValue,oldValue){
                        console.log('isHot被修改了',newValue,oldValue);
                    }
                },
                // 监视多级结构中某个属性的变化
                'number.a':{
                    handler(){
                        console.log('a改变了');
                    }
                },
                // 监视多级结构中所有属性的变化
                number:{
                    deep:true,
                    handler(){
                        console.log('number改变了');
                    }
                }

            }
        })
    
    </script>

四、computed 和 watch 之间的区别

computed 和 watch 之间的区别:

1.computed能完成的功能,watch也能完成

2.watch能完成的功能,computed不一定能完成 例如 watch可以进行异步操作

原则:

1.所有被vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象

2.所有不被vue所管理的函数(定时器的回调函数、ajax的回调函数等)最好写成箭头函数

这样this的指向才是vm或组件实例函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值