初识vue 2.0(13):子组件使用watch监听父组件变化

Posted phptree

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识vue 2.0(13):子组件使用watch监听父组件变化相关的知识,希望对你有一定的参考价值。

子组件使用created或者mounted通常只能在组件初始化的时候,获取父组件传过来的props数据。

父组件props数据发生变化,子组件默认无法感知,因此需要手动实现子组件监听父组件变化的功能。

一般的值类型数据,可以直接使用watch监听:

watch: {
    msg(newVal, oldVal){//对引用类型的值无效
        console.info(‘value changed ‘, newVal)
    }
}

引用类型,普通watch方法,无法监听到引用类型内部的变化。

解决此问题,可以在父组件中将变化的对象变成一个新的对象,自主实现深拷贝,例如:

methods: {
    addAge(){
        this.child.age ++;
        this.child = JSON.parse(JSON.stringify(this.child));
    }
}

但是这样做不是很优雅,vue提供了方便的深拷贝的方式去监听引用类型值的变化,例如:

watch: {
    msg: {
        handler(newVal, oldVal) {
            console.info(‘value changed 2‘, newVal)
        },
        deep: true
    }
}

 

完整例子:

1. 父组件Game.vue向子组件传递props值

<template>
    <div class="game">
        <button @click="addAge">birthday++</button>
        <DNF :msg="child"></DNF>
    </div>
</template>
<script>
import DNF from ./DNF
export default {
    name: Game,
    components: {
        DNF
    },
    data () {
        return {
            child:{name:dnf,age:18},
        }
    },
    methods: {
        addAge(){
            this.child.age ++;
            //this.child = JSON.parse(JSON.stringify(this.child));
        }
    }
}
</script>

2. 子组件DNF.vue 使用watch监听父组件中msg的变化,因为msg是一个object,因此设置 deep:true。

<template>
    <div class="dnf"></div>
</template>
<script>
export default {
    name: DNF,
    props: ["msg"],
    watch: {
        msg(newVal, oldVal){//对引用类型的值无效
            console.info(value changed 1, newVal)
        },
        msg: {
            handler(newVal, oldVal) {
                console.info(value changed 2, newVal)
            },
            deep: true
        }
    },
}
</script>

官方文档:https://cn.vuejs.org/v2/guide/computed.html#侦听器

 

以上是关于初识vue 2.0(13):子组件使用watch监听父组件变化的主要内容,如果未能解决你的问题,请参考以下文章

2020-09-13 浅谈: Vue watch监听deep、immediate属性

父组件可以监听到子组件的生命周期吗?

初识vue 2.0:路由与组件

Vue子组件(deep)深度监听props对象属性无效的解决办法

初识vue 2.0:vuex组件通信

浅谈VUE,使用watch方法监听父组件传到子组件的数据。