爷爷组件
<template>
   <div>
     <child-dom
      :foo="foo"
      :coo="coo"
      :goo=‘goo‘
      v-on:upRocket="reciveRocket"
     >
     </child-dom>
   </div>
</template>
<script>
   import childDom from "./child.vue";
   export default {
     data() {
        return {
          foo:"Hello, world",
          coo:"Hello,rui",
          goo:‘googoo‘
        }
     },
    components:{childDom},
    methods:{
    reciveRocket(e){
        console.log(‘爷爷组件传来的值‘,e)
        console.log("reciveRocket success")
    }
 }
   }
</script>
父组件
<template>
   <div>
      <p>foo:{{foo}}</p>
      <p>attrs:{{$attrs}}</p>
       <grandson v-bind="$attrs" v-on="$listeners"></grandson>
   </div>
</template>
<script>
import grandson from ‘./grandson‘;
export default {
 name:‘child-dom‘,
 props:[
   "foo",      //父组件不能接收,否则在孙子组件中获取不到值
  ],
//  inheritAttrs:false,
 components:{grandson},
}
</script>
孙子组件:
<template>
  <div>
   <p>coo:{{coo}}</p>
   <p>{{goo}}</p>
   <button @click="startUpRocket">我要发射火箭</button>
  </div>
</template>
<script>
  export default {
    name:‘grandson‘,
    props:["coo","goo"],
    // inheritAttrs:false,
    methods:{
      startUpRocket(){
        this.$emit("upRocket",‘传值到爷爷组件‘);
        // console.log("startUpRocket")
      }
    }
  }
</script>
首先我们来看下面的一张图,图中表示一个多级组件嵌套的情形。

现在我们来讨论一种情况,A组件与C组件怎么通信,我们有多少种解决方案?
在很多开发情况下,我们只是想把A组件的信息传递给C组件,如果使用props 绑定来进行信息的传递,虽然能够实现,但是代码并不美观。
转:https://blog.csdn.net/songxiugongwang/article/details/84001967
爷爷、孙子组件间值的传递(Vue2.4中$attrs和$listeners用法)
原文:https://www.cnblogs.com/ygyy/p/14603409.html