vue组件中使用watch响应数据

在vue中,使用watch来响应数据的变化。watch的用法大致有三种。下面代码是watch的一种简单的用法:

普通用法:

<template>
    //视图
 <input v-model="username" v-on="changeVal" placeholder="用户名"><span>dsfsf</span></input>
</template>
<script>
    export default {
        data() {
            return {
               username:'';
            }
        },
        methods: {
         changeVal(e){
              this.loginForm.username=e;
          }
        },
        watch: {
            username(newValue){
               console.log(newValue)//监听username的变化,这种写法,默认第一次不执行该函数
            }
        }
    }
</script>

灵活用法:immediate和handler结合使用

解析:

这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。

比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。

代码如下:

<template>
    //视图
 <input v-model="username" v-on="changeVal" placeholder="用户名"><span>dsfsf</span></input>
</template>
<script>
    export default {
        data() {
            return {
               username:'';
            }
        },
        methods: {
         changeVal(e){
              this.loginForm.username=e;
          }
        },
        watch: {
            username:{

              handler(newName){
                 console.log(newName);/
              }
            },
          immediate:true
        }
    }
</script>

监听的数据后面写成对象形式,包含handler方法和immediate,之前我们写的函数其实就是在写这个handler方法;

immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler。

wacth检测对象属性数据:deep深度监测

当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

<template>
    //视图
 <input v-model="person.username" v-on="changeVal" placeholder="用户名"><span>dsfsf</span></input>
</template>
<script>
    export default {
        data() {
            return {
               person:{
                 username:''  
              }
            }
        },
        methods: {
         changeVal(e){
              this.loginForm.username=e;
          }
        },
        watch: {
            'person.username':{
              handler(newName){
                 console.log(newName);/
              }
            },
          immediate:true,
          deep:true
        }
    }
</script>

设置deep: true 则可以监听到cityName.name的变化,此时会给cityName的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler,上面的写法是精准监听username的变化;

 

改文到这里就结束了,感谢查阅;

 

posted @ 2020-05-12 14:57  KG-work-space  阅读(946)  评论(0编辑  收藏  举报