vue兄弟组件传值(通过事件总线EventBus)

该示例展示了在Vue项目中如何通过创建一个eventBus.js文件来实现父子组件及兄弟组件之间的通信。在父组件transfer.vue中,注册了NavTab和TransChart两个子组件。子组件TransChart在选择操作后,利用eventBus向其他组件广播数据更新,而nav.vue监听这个事件并接收数据,完成数据同步。这种方法避免了直接依赖父子关系或使用Vuex进行状态管理。
摘要由CSDN通过智能技术生成

1:在项目中创建一个单独的eventBus.js文件

// eventBus.js
import Vue from 'vue'
export default new Vue;

2:在父组件注册并引入两个子组件

// transfer.vue(父组件)
<template>
  <div class="container layer_nobetween">
    <nav-tab />
    <trans-chart />
  </div>
</template>  
<script>
import NavTab from "./model/nav";
import TransChart from "./model/TransChart";
export default {
  components: {
    NavTab,
    TransChart,
  },
  data() {
    return {};
  },
  methods: {},
};
</script>  

3:分别在两个子组件引入eventBus.js

// TransChart.vue (子组件)
<template>
  <div class="right layer_star flex_warp">
    <div
      class="right_one layer_star"
      v-for="(item, index) in rightArr"
      :key="index"
    >
      <div class="right_icon" @click="choose(item)">
        <img :src="item.choose ? chooseImg : checkImg" alt="" />
      </div>
      <div class="right_name">{{ item.name }}</div>
    </div>
  </div>
</template>  
<script>
import bus from "../../utils/eventBus";
export default {
  name: "trainCity",
  data() {
    return {
      chooseImg: require("@/assets/choose.png"),
      checkImg: require("@/assets/check.png"),
      leftArr: [],
      rightArr: [
        { name: "张三", key: 1, choose: false },
        { name: "李四", key: 2, choose: false },
        { name: "王五", key: 3, choose: false },
        { name: "赵麻子", key: 4, choose: false },
      ],
    };
  },
  methods: {
    // 选中右侧
    choose(item) {
      let t = this;
      let leftArr = t.leftArr;
      let rightArr = t.rightArr;
      let key = item.key;
      for (var i = 0; i < rightArr.length; i++) {
        if (key == rightArr[i].key) {
          if (rightArr[i].choose) {
            rightArr[i].choose = false;
            for (var k = 0; k < leftArr.length; k++) {
              if (key == leftArr[k].key) {
                leftArr.splice(k, 1);
              }
            }
          } else {
            rightArr[i].choose = true;

            leftArr.push(rightArr[i]);
          }
        }
      }
      t.rightArr = rightArr;
      t.leftArr = leftArr;
      bus.$emit("sendByBus", t.leftArr);
    },
  },
};
</script>  
// nav.vue(子组件)
<template>
  <div class="left flex_star">
    <div class="left_one" v-for="(item, index) in leftArr" :key="index">
      {{ item.name }}
    </div>
  </div>
</template>  
<script>
import bus from "../../utils/eventBus";
export default {
  name: "trainCity",
  data() {
    return {
      leftArr: [],
    };
  },
  methods: {},
  mounted() {
    bus.$on("sendByBus", (data) => {
      console.log(data);
      this.leftArr = data;
    });
  },
};
</script>  

4:TransChart向nav传值(传值使用$emit)

bus.$emit("sendByBus", t.leftArr);

5:nav接到TransChart的值(接收值使用$on)

mounted() {
    bus.$on("sendByBus", (data) => {
      console.log(data);
      this.leftArr = data;
    });
  },
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值