vue教程-侦听属性(监听属性)、侦听器(监听器)(watch)

说明

vue可以通过 侦听器(watch),侦听属性,当属性值变化时,自动调用函数

注意:监听属性必须存在,才能进行侦听

侦听属性(官网叫法)有时也成为 监听属性、侦听器、监听器

应用场景

  • 与 计算属性 功能类似,计算属性能实现的功能,侦听属性也都能实现,但一般较麻烦

  • 表单值变化实时校验、提示错误。如:年龄、价格不能是负数,也不能超过最大值;密码复杂度不符合要求;两次密码不一致;

  • 在数据变化时,发送 ajax请求,如:百度的输入框的提示;输入验证码,自动向服务器发请求校验是否正确;

案例

与 计算属性 的案例类似

如下图,当输入分数后,就能自动显示 优、良、中、差、不及格,该如何实现呢?

关键:没有按钮,当输入框的分数改变后,评价自动随之改变

代码

html:

<div id="app">
    分数: <input type="text" v-model="score" />
    <br>
    评价: {{ping}}
    <br>
    评价: {{ping}}
    <br>
    评价: {{ping}}
    <br>
    评价: {{ping}}
</div>

js:

<script type="text/javascript">
    var vm = new Vue({
        el:'#app',
        data:{
            score:90,
            ping:'',
        },

        // 侦听器
        watch:{
            // 侦听 score 属性,当值改变时,就调用  handler 函数
            score:{
                handler:function(newValue,oldValue){
                    console.log("newValue:",newValue)
                    console.log("oldValue:",oldValue)

                    var ret = ""
                    if(this.score >= 90){
                        ret = "优"
                    }else if(this.score >= 80){
                        ret = "良"
                    }else if(this.score >= 70){
                        ret = "中"
                    }else if(this.score >= 60){
                        ret = "差"
                    }else if(this.score == ""){ // 当输入框的内容为空时,评价显示为空字符串
                        ret = ""
                    }
                    else{
                        ret = "不及格"
                    }
                    this.ping = ret

                }
            },

        },
   });
</script>

注意:监听属性必须存在,才能进行侦听

特点

  • 当属性 score 的值 改变时,才会触发执行 score 侦听器的 handler() 函数
  • 函数名必须是 handler()
  • 函数有两个形参,第一个形参是 新值,第二个形参是 原值

自动执行(immediate)

上例的bug

上面例子有bug,当 score 有默认值时,不能自动执行 handler() 函数

解决

侦听器有 immediate 属性,为 true 时,表示 页面加载后自动 执行函数 handler() 函数,默认为 false

代码

<script type="text/javascript">
    var vm = new Vue({
        el:'#app',
        data:{
            score:90,
            ping:'',
        },

        // 侦听器
        watch:{
            // 侦听 score 属性,当值改变时,就调用  handler 函数
            score:{
                immediate:true,//为 true时,表示初始化时就执行。默认为false
                handler:function(newValue,oldValue){
                    console.log("newValue:",newValue)
                    console.log("oldValue:",oldValue)

                    var ret = ""
                    if(this.score >= 90){
                        ret = "优"
                    }else if(this.score >= 80){
                        ret = "良"
                    }else if(this.score >= 70){
                        ret = "中"
                    }else if(this.score >= 60){
                        ret = "差"
                    }else if(this.score == ""){ // 当输入框的内容为空时,评价显示为空字符串
                        ret = ""
                    }
                    else{
                        ret = "不及格"
                    }
                    this.ping = ret

                }
            },

        },
   });
</script>

简化写法

<script type="text/javascript">
    var vm = new Vue({
        el:'#app',
        data:{
            score:90,
            ping:'',
        },

        // 侦听器
        watch:{
            // 简化写法,侦听 score 属性,当score属性的值改变时,就调用 该函数
            score:function(newValue,oldValue){
                console.log("newValue:",newValue)
                console.log("oldValue:",oldValue)

                var ret = ""
                if(this.score >= 90){
                    ret = "优"
                }else if(this.score >= 80){
                    ret = "良"
                }else if(this.score >= 70){
                    ret = "中"
                }else if(this.score >= 60){
                    ret = "差"
                }else if(this.score == ""){ // 当输入框的内容为空时,评价显示为空字符串
                    ret = ""
                }
                else{
                    ret = "不及格"
                }
                this.ping = ret


            },

        },
   });
</script>

校验价格

当输入价格是 负数 或 大于100 时,显示上一次的价格

代码

注意: 类型是 type="number" ,否则可以输入数字以外的字符

<div id="app">
    价格:<input type="number" v-model.number="price">
</div>

js:

<script>
    var app = new Vue({
        el: '#app', //el是element缩写
        data: { //数据
            price:undefined, // 价格
        },
        watch:{
            price:{ // 监听price属性
                // handler 必须是这个名字
                //newVal:修改后的值
                //oldVal  修改前的值
                handler:function(newVal,oldVal){
                    console.log("newVal:",newVal,"--oldVal:",oldVal)
                    console.log("newVal类型:",typeof newVal,"--oldVal类型:",typeof oldVal)
                    if( newVal < 0 || newVal > 100){ // 当是负数或大于100时
                        this.price = oldVal // 就显示上一次的值
                    }
                }
            }
        }
    })
</script>

原文出处:/show_1IX6lguvpO5O.html