Vue中的侦听属性watch

watch属性与我们之前学习的方法(methods)、过滤器(filters)、计算属性(computed)同级。

watch的作用:负责监听数据源中的数据,当数据发生变化时触发其方法。就是起到一个监听器的作用,监视这个数据。

要侦听那个数据,就在watch内写方法,方法名必须与数据名相同,在方法内就写对应的处理程序;当数据发生变化时就触发;这一点与计算属性(computed)相似,只有数据发生变化时才触发,但是侦听器属性,比计算属性计算效率消耗大。

写法:

watch:{
    msg(a1,a2){
        //处理程序
    } 
}

 方法名msg就是监听的data内的msg属性,a1接收每次msg改变时的那个值,a2为未改变时msg的值。

代码展示一下用法:

 <div id="box">
        <div @click="change"> {{msg}}</div>
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{
                msg:666
            },
            methods: {
                change(){
                   this.msg=777 
                }
            },
            watch:{
                msg(){
                    console.log("msg发生了变化",this.msg);
                }
            }
        })
    </script>

当我们点击666时,msg被改变,watch侦听到其内的msg方法触发,打印:

 再次点击666这个标签时,msg的值还是被赋予777没有发生改变,即不会触发,控制台不再打印。

特殊:当data内的数据是个对象时,侦听这个对象但是修改的是对象内的值是否会触发侦听呢?

答案是不会。

修改了引用数据内部的属性值:如果页面中使用了这个属性,页面会重新渲染,但是侦听器属性不会触发;只有修改了引用数据的引用 才能触发侦听器属性。

解决方法:引入一个新词深度侦听,虽然可以实现触发,但是计算效率将会消耗更大,不推荐使用

在写法上也发生了改变,采用对象的写法:

watch:{
    obj:{
        deep:true,//判断是否深度侦听,true为侦听,false则不
        handler:()=>{}//处理函数
    }
}

同样演示一下:

<div id="box">
        <div @click="change"> {{obj.a}}</div>
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{
                obj:{
                    a:"a"
                }
            },
            methods: {
                change(){
                   this.obj.a="aa"
                }
            },
            watch:{
                obj:{
                    deep:true,
                    handler:()=>{
                        console.log("侦听到a的变化");
                    }
                }
            }
        })
    </script>

点击a时,控制台打印:

到这里我们已经基本掌握了watch的基本用法,那么我们动手写两个实际应用。

一、汇率转换

需求:当我们在一个框内输入金额时,另一个框内对应的显示对应货币的转换的金额

代码展示:

<div id="box">
      人民币: <input type="text" v-model="rmb" ><br>
       韩元: <input type="text" v-model="hy" >
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{
                rmb:0,
                hy:0
            },
            methods: {
                change(){
                   this.msg=777 
                }
            },
            watch:{
               rmb(newvalue,oldvalue){
                this.hy=newvalue*15
               },
               hy(newvalue,oldvalue){
                this.rmb=(newvalue/15).toFixed(2)*100/100
               }
            }
        })
    </script>

 二、余额提示

要求:当金额低于一定金额时提醒用户充值

<div id="box">
        {{money}}
       <button @click="change">购买一次花20元</button>
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{
                money:100
            },
            methods: {
                change(){
                     if (this.money>=20) {
                        this.money-=20
                    }
                }
            },
            watch:{
                money(newvalue,oldvalue){
                    if (oldvalue<=20) {
                        alert("余额不足了请充值")
                    }
                }
            }
        })
    </script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值