前端Vue组件隔代通讯v-bind=“$props“、v-bind=“$attrs“、v-on=“listeners“

组件隔代通讯

v-on=“$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: {
    msg:{ //接收A传递的msg
      typeof:String,
      default:''
    }
  },
}
</script>

v-on="$listeners"用法

1种

用于底层组件向高级层组件传递信息。

例如有 父组件A,子组件B,孙组件C 三个组件,如果C传递信息给B则可直接使用$emit,如果是C向A传递信息还使用$emit,则就需要C先$emit给B,B再$emit给A,这种方式比较繁琐,则此时可以使用v-on="$listeners"来满足当前需求。

用例:

C组件
<template>
  <div @click="onClick">C组件</div>
</template>
 
onClick(){
  this.$emit("Msg",'123')
}
B组件
<template>
  <cCom v-on="$listeners"/>
</template>
A组件
<template>
  <bCom @Msg='Msg'/>
</template>
 
methods:{
  Msg(val){
    console.log(val) //123
  }
}

2种

父组件调用子组件方法,给挂载子组件加方法,然后在子组件需要加的方法加v-on="$listeners",就可以访问到子组件,添加对应的方法

父组件
<template>
      <Search @change="handleChangeClicks"></Search>
</template>
<script>
    methods: {
        handleChangeClicks(val) {
            if (val.length) return;
            this.getPurchaseOrderList();
        },
      }
</script>
子组件

v-on=“$listeners”

<template>
  <label class="input-search-label d-inline-flex align-items-center">
    <i :class="`bx ${icon} label-icon`"></i>
    <b-form-input
      v-model="value"
      v-on="$listeners"
      type="search"
      :placeholder="placeholder"
    ></b-form-input>
  </label>
</template>

v-bind="$props"用法

组件A

<template>
  <bCom :name="name" :age="age" />
</template>
data() {
     return {
          name: '传给父组件的值',
          age: '18'
 };

组件B

<template>
 <div>组件名上绑定的非props特性($attrs): {{$attrs}}</div>
  <cCom  v-bind="$props"/>
</template>
 props: ['name', 'age'],

组件C

<template>
   <div>父组件传递过来的名称: {{name}}</div>
  <div>父组件传递过来的年龄: {{age}}</div>
</template>

props: ['name', 'age'],

总的

index.vue页面

<template>
  <div>
    <h1>props、属性、事件传递</h1>
    <app-parent test="123"  :name="name" :age="age" v-on:start1="say1" @start2="say2"></app-parent>
  </div>
</template>
 
<script>
  import AppParent from './parent.vue';
  export default {
    data() {
      return {
          name: '传给父组件的值',
          age: '18'
      };
    },
    components: {
        AppParent
    },
    methods: {
        say1() {
            console.log('第一个。。。。。');
        },
        say2() {
            console.log('第二个。。。。。');
        }
    }
  }
</script>

parent.vue组件

<template>
  <div>
      <h3>父组件</h3>
      <div>组件名上绑定的非props特性($attrs): {{$attrs}}</div>
      <app-child v-on="$listeners" v-bind="$props"></app-child>
  </div>
</template>
 
<script>
  import AppChild from './child.vue';
  export default {
    data() {
      return {
 
      };
    },
    inheritAttrs: false,
    props: ['name', 'age'],
    components: {
        AppChild
    },
    mounted() { 
        this.$emit('start1');
    }
  }
</script>

child.vue组件

<template>
  <div>
      <h3>子组件</h3>
      <div>父组件传递过来的名称: {{name}}</div>
      <div>父组件传递过来的年龄: {{age}}</div>
  </div>
</template>
 
<script>
  export default {
    data() {
      return {
 
      };
    },
    props: ['name', 'age'],
    components: {},
    created() {
 
    },
    mounted() {
        this.$emit('start2');
    },
  }
</script>

在这里插入图片描述

转载

博主
博主

最后

感觉文章好的话记得点个心心和关注和收藏,有错的地方麻烦指正一下,如果需要转载,请标明出处,多谢!!!

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值