欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue祖孙组件之间的数据传递

程序员文章站 2024-03-15 08:25:59
...

**解决的问题:**

 使用$attrs和$listeners实现祖孙组件之间的数据传递,也就是多重嵌套组件之间的数据传递。

**注意:**

本方法针对vue2.4版本及以上,使用$attrs和$listeners来实现的

**解决方案:**

**首先创建父组件:**      父组件用于动态数据的绑定与事件的定义

<template>

    <div>
           <!--这里 :one和:two是向后代组件传递数据-->
        <child1 :one="child1" :two="child2" @test1="onTest1" @test2="onTest2"></child1>
    </div>
</template>

<script>

import Child1 from './Child.vue';

export default {

    data () {

        return {

          child1:'lihua',

          child2:'lignag',
          parent: 0

        };

    },

    components: {

      'child1':Child1  //引入子组件

    },

    methods: {

        onTest1 () {

            console.log('child')

        },

        onTest2 (val) {

         this.parent = val

        }

    }

}

</script>

子组件的写法:     通过设置v-bind="$attrs" 和v-on="$listeners"来充当中间人,
 

<template>
    <div class="child-1">
       <p>$attrs:{{$attrs['two']}}</p>   
       <hr>
        <!-- 子组件中通过v-bind='$attrs'接受数据,通过$listeners接收事件 -->
        <child2 v-bind="$attrs" v-on="$listeners"></child2>
    </div>
</template>
<script>
import child2 from './Child2.vue';
export default {
    props: ['one','two'],  //可写可不写
    data () {
        return {
            
        }
    },
    inheritAttrs: false,  //父组件传递动态数据后,子组件的默认行为
    components: {
        child2    
    },
    mounted () {
        this.$emit('test1')  //触发父组件方法的一种方式
        this.$listeners.test2(123)  //触发父组件方法的另一种方式
    }
}
</script>

孙组件写法: 通过props或者$attrs和$listeners来获取父组件数据和事件。

<template>
    <div class="child-2">
        <p>props:{{one}}</p>
        <p>props:{{two}}</p>
        <p>$attrs: {{$attrs['one']}}</p>  
        <hr>
    </div>
</template>
<script>
export default {
    props:['one','two'],  //接收父组件传递的数据,可以不写,通过$attrs来获取
    data(){
        return {};
    },
    inheritAttrs: false,  //默认行为需要取消
    mounted(){
        this.$emit('test1') //触发父组件方法的一种方式
        this.$listeners.test1(123)//触发父组件方法的另一种方式
    }
}
</script>

 

另:inheritAttrs的作用:

先注意一点:使用$attrs时inhertAttrs设置为false.

 

当inheritAttrs设置为true时,父元素动态绑定组件的数据,子组件如果没有通过props接收的话,该属性就会附加于子组件的根元素上。什么意思看代码

//父组件

<child :one="help"></child>


data(){
 return {
    help:123 
   }
 }


//子组件


<template>
  <div>
    <h1>作为子组件的我并没有设置props来接收父组件的one属性。</h1>
  </div>
</template>





//父组件解析出来就是这样

<div one="123">
 <h1>作为子组件的我并没有设置props来接收父组件的one属性。</h1>
</div>

 

所以呢我们通过v-bind="$attrs"来指定父组件数据的绑定位置,同时设置inheritAttrs为false来取消默认行为