Vue2.0 父子组件之间通信

本文介绍Vue.js中父子组件间的数据传递方法,包括父组件向子组件传递数据、子组件向父组件传递数据的方式,以及利用事件中心实现组件间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章分享我在做vue项目中遇到的父子组件之间通信和数据传递的问题。

在vue2.0中,已经废弃了 $dispatch 和 broadcast ,推荐使用Vuex

但是平时做一些简单的组件可以使用简单的数据通信工具。

父子组件传递数据:

1、父组件向子组件传递:

父组件:

<template>
  <div>
    <input type="text" v-model="msg">
    <br>
    //将子控件属性sendMsg与父组件msg属性绑定,通过sengMsg传送
    <child :sendMsg="msg"></child>
  </div>
</template>
<script>
  export default{
    data(){
      return {
        msg: '我的父组件'
      }
    },
    components: {
      child: require('./Child.vue')
    }
  }
</script>

子组件:

<template>
  <div>
    <p>{{sendMsg}}</p>
  </div>
</template>
<style>

</style>
<script>
    export default{
        props: {
          sendMsg: String
        }
    }
</script>

2、子组件向父组件传递数据:

父组件:

<template>
  <div>
<!-- message为父子组件通信的通道;recieveMessage为父组件监听到后的方法 -->
    <child2 @message="recieveMessage"></child2>
  </div>
</template>
<script>
  import {Toast} from 'mint-ui'
  export default{
    components: {
      child2: require('./Child2.vue'),
    },
    methods: {
      recieveMessage: function (el) {
        cosole.log(el); //打印出原生的div元素
      }
    }
  }
</script>

子组件:

<template>
    <div class='onput' @click='addEvent'></div>
</template>
<script>
  export default{
    methods: {
      addEvent(event) {
         this.$emit('message', event.target);
         //获取div的原生DOM元素
         //这里的message实际上对应了父组件中的message,两者一致才可以交互数据。
      }
    }
  }
</script>

有一点值得注意:如何在子组件和子组件之间传递数据?这里我想到可以借助父组件这个跳板,把从A子组件获取的数据写入自己的data中,然后传给B子组件。

父组件的recieveMessage中将获取的数据写入data
data() {
    el: {}
},
methods: {
      recieveMessage: function (el) {
        this.el = el;
      }
    }

再传递给子组件B。

vue2.0还有一个值得关注的问题,组件之间如何通信?官网提供了一种方法:

// 将在各处使用该事件中心
// 组件通过它来通信
//在一个单独的文件里写入下面内容,命名为eventHub.js
improt vue from 'vue';
export default  {
    bus: new Vue()
}

在子组件中引用:

import eventHub form 'eventHub.js';



然后是数据传递和通信的同时实现:

父组件:

<template>
  <div>
//message为父子组件通信的通道;recieveMessage为父组件监听到后的方法
    <child2 @message="recieveMessage"></child2>
    <child3 ref="child3"></child3>
  </div>
</template>
<script>
  export default{
    data() {
        el: {}
    },
    components: {
      child2: require('./Child2.vue'),
      child3: require('./Child3.vue'),
    },
    methods: {
      recieveMessage: function (el) {
        this.$refs.child3.drop(el); //在父组件上调用子组件3的drop方法。
      }
    }
  }
</script>

子组件2:

<template>
    <div class='onput' @click='addEvent'></div>
</template>
<script>
  export default{
    methods: {
      addEvent(event) {
         this.$emit('message', event.target);
         //获取div的原生DOM元素
         //这里的message实际上对应了父组件中的message,两者一致才可以交互数据。

        eventHub.bus.$emit('add', event.target);//组件之间通信
      }
    }
  }
</script>

子组件3:

<template>
  <div>{{el}}</div>
</template>
<script>
  export default{
    methods: {
          drop(el) {
          console.log(el); //打印出子组件2的div元素。
        }
      }
    }
  }
</script>

至此,完成了父子组件之间的通信和数据交互联合使用,非常简单实用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员青戈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值