总结

v-bind="[$attrs, $props]", v-on="$listeners",v-bind="$attrs",v-bind="$props" 使用情景可以总结为:组件隔代通讯

v-bind=“$attrs”

主要用于组件之间的隔代传值。例如有:父组件A,子组件B,孙组件C 三个组件,在A组件中传值给C,可直接在B中的C上设置v-bind=“$attrs”,然后在C组件中用prop接收,此时就直接把值传给了C。

// 组件A:
<template>
  <bCom msg='123'/>
</template>

// 组件B:
<template>
  <cCom v-bind="$attrs"/>
</template>

// 组件C:
<template>
  <div>A传递过来的值:{{msg}}</div>
</template>
 
<script>
export default {
  name: 'cCom',
  props: {
    //接收A传递的msg
    msg:{
      typeof:String,
      default:''
    }
  },
}
</script>

v-bind="$props"用法

中间组件B接收还是要接收的,但是标签上的属性绑定可以省掉了

// 组件A:
<template>
  <bCom :msg='msg' :sex='sex' />
</template>
data() {
   return {
     msg: 'Hi',
     sex: 'man'
 };

// 组件B:
<template>
  <cCom  v-bind="$props"/>
</template>
props: ['msg', 'sex'],

// 组件C:
<template>
  <div>A传递过来的值:{{msg}}</div>
  <div>A传递过来的值:{{sex}}</div>
</template>
<script>
export default {
  name: 'cCom',
  props: ['msg', 'sex'],
}
</script>

v-on="$listeners"用法

1、组件嵌套时,省写emit

例如有 父组件A,子组件B,孙组件C 三个组件;
如果C传递信息给B则可直接使用$emit,如果是C向A传递信息还使用$emit,
则就需要C先$emit给B,B再$emit给A,这种方式比较繁琐,则此时可以使用v-on="$listeners"来满足当前需求。
// 组件A:
<template>
  <bCom @Msg='Msg'/>
</template>
methods:{
  Msg(val){
    console.log(val) //123
  }
}

// 组件B:
<template>
  <cCom v-on="$listeners"/>
</template>

// 组件C:
<template>
  <div @click="onClick">C组件</div>
</template>
onClick(){
  this.$emit("Msg",'123')
}