Vue3全局组件通信之EventBus

本文介绍了如何在Vue3项目中利用mitt库进行全局组件间的通信,包括安装mitt、在main.js中全局引入、页面内使用方法示例以及数据传递的实例。
摘要由CSDN通过智能技术生成

参考博客:Vue3全局组件通信之EventBus

1、安装 mitt

npm install --save mitt

2、在 main.js 全局引入

import mitt from 'mitt';
app.config.globalProperties.mittBus = mitt();

3、页面内使用方法

import { onMounted, ref, getCurrentInstance } from 'vue';
const { proxy } = getCurrentInstance();
//注册监听事件,接收传参
proxy.mittBus.on('visitDataTimeLine', (data) => {
   visitId.value = data.visitId; 
});
//调用方法传递数据
proxy.mittBus.emit('visitDataTimeLine',data);
//移除监听事件
proxy.mittBus.off('visitDataTimeLine');

4、使用举例

传递数据:

<template>
    <div class="wrap">
        <iframe
        ref="frameSelect"
        :src="htmlSrc"
        width="100%"
        height="100%"
        frameborder="0">
        </iframe>
        <!-- <button @click="vueSendMsg">vue向iframe传递信息</button>
        <button @click="iframeMethods">触发iframe中的方法</button> -->
    </div>
</template>

<script>
import { onMounted, ref, getCurrentInstance } from 'vue';
export default {
  setup() {
    const instance = getCurrentInstance();
    const htmlSrc = ref('static/index.html');
    onMounted(() => {
      const iframe = getCurrentInstance().refs.frameSelect;
      //html里写window.parent.postMessage(res, '*');) 传数据过来
      window.addEventListener('message', (event) => {
        if (event.source === iframe?.contentWindow) {
          instance.message = event.data; // 接收html的数据
          instance.proxy.mittBus.emit('visitDataTimeLine', instance.message); // 传递数据
        }
      });
    });
    return {
      htmlSrc,
    };
  },
};
</script>

接收数据:

<template>
    <div class="frameContent">
        <div class="position">
            <div class="title">主车:</div>
            <div class="contentCoord">
                <div class="content">
                <div class="titleCoord">
                    x : {{ data.datax }}
                </div>
                <div class="slisd">
                    <slisd :min="-50" :max="10" :value="data.datax" :isDrag="true" bgColor="#5caee5"></slisd>
                </div>
            </div>
            <div class="content">
                <div class="titleCoord">
                    y : {{ data.datay }}
                </div>
                <div class="slisd">
                    <slisd :min="110" :max="120" :value="data.datay" :isDrag="true" bgColor="#5caee5"></slisd>
                </div>
            </div>
            <div class="content">
                <div class="titleCoord">
                    z : {{ data.dataz }}
                </div>
                <div class="slisd">
                    <slisd :min="-50" :max="10" :value="data.dataz" :isDrag="true" bgColor="#5caee5"></slisd>
                </div>
            </div>
            </div>
            <button>渲染</button>
        </div>
    </div>
</template>

<script>
import slisd from './slisd.vue'; // 进度条组件,不重要
import { onMounted, ref, reactive, getCurrentInstance } from 'vue';
import jsonFile from '../assets/data/extrinsic.json';
export default {
  components: { slisd },
  setup() {
    const instance = getCurrentInstance();
    const frame = ref(0);
    const positionData = ref([]);
    const data = reactive({
      datax: instance.proxy.datax,
      datay: instance.proxy.datay,
      dataz: instance.proxy.dataz,
    });
    const fetchData = () => { // 这个是读取json文件的,不重要
      try {
        if (Array.isArray(jsonFile)) {
          positionData.value = jsonFile.map(row => row.map(num => parseFloat(num)));
          data.datax = positionData.value[frame.value][0];
          data.datay = positionData.value[frame.value][1];
          data.dataz = positionData.value[frame.value][2];
        }
      } catch (error) {
        console.error('Error fetching JSON data:', error);
      }
    }; 
    onMounted(() => {
      instance.proxy.mittBus.on('visitDataTimeLine', (data) => {
        frame.value = data; // 接收数据
        fetchData();
      });
    //   fetchData();
    });
    return {
      data,
      frame: frame.value,
    };
  },
}; 
</script>
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值