微前端子应用间通信和数据共享

news2024/11/18 1:33:17

前面讲到了微前端的应用:(94条消息) 微前端应用(qiankun+umi+antd)_他夏了夏天吖的博客-CSDN博客icon-default.png?t=N3I4https://blog.csdn.net/zh0623/article/details/130615234?spm=1001.2014.3001.5501今天讲一下不同子应用的通信和数据共享问题

微前端不同子应用之间可能需要进行通信和数据共享,假如子应用分别为react.js项目和vue.js项目。不同子应用要跨应用通信方案,可以使用自定义事件、消息总线或共享状态库等

1.自定义事件

自定义事件是一种简单的跨应用通信方案,它允许不同的子应用之间通过事件来进行通信。在React和Vue中,我们可以使用自定义事件来实现跨组件通信。下面是一个简单的例子:

在React中:


import React, { useState } from 'react';

function App() {
  const [count, setCount] = useState(0);

  function handleClick() {
    window.dispatchEvent(new CustomEvent('increment', { detail: { count: count + 1 } }));
  }

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

export default App;

在Vue中:

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="handleClick">Increment</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    handleClick() {
      window.dispatchEvent(new CustomEvent('increment', { detail: { count: this.count + 1 } }));
    },
  },
};
</script>

在上面的例子中,我们在React和Vue中都使用了自定义事件来实现跨组件通信。当用户点击“Increment”按钮时,我们会触发一个名为“increment”的自定义事件,并将当前计数器的值作为事件的详细信息传递给其他子应用。

2. 消息总线

消息总线是一种更高级的跨应用通信方案,它允许不同的子应用之间通过消息队列来进行通信。在React和Vue中,我们可以使用第三方库(如PubSubJS)来实现消息总线。下面是一个简单的例子:在React中:

import React, { useState, useEffect } from 'react';
import PubSub from 'pubsub-js';

function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const token = PubSub.subscribe('increment', (msg, data) => {
      setCount(data.count);
    });

    return () => {
      PubSub.unsubscribe(token);
    };
  }, []);

  function handleClick() {
    PubSub.publish('increment', { count: count + 1 });
  }

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

export default App;

在Vue中:

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="handleClick">Increment</button>
  </div>
</template>

<script>
import PubSub from 'pubsub-js';

export default {
  data() {
    return {
      count: 0,
    };
  },
  mounted() {
    PubSub.subscribe('increment', (msg, data) => {
      this.count = data.count;
    });
  },
  methods: {
    handleClick() {
      PubSub.publish('increment', { count: this.count + 1 });
    },
  },
};
</script>

在上面的例子中,我们在React和Vue中都使用了PubSubJS库来实现消息总线。当用户点击“Increment”按钮时,我们会发布一个名为“increment”的消息,并将当前计数器的值作为消息的详细信息传递给其他子应用。同时,我们还在组件中订阅了“increment”消息,并在收到消息时更新计数器的值。

除了上面的方式,消息总线还有以下几种方式:

1. 本地事件总线:使用事件监听和事件触发在同一个应用内部通信。
2. 跨窗口消息传递:使用 postMessage 在不同的浏览器窗口/标签页之间通信。
3. Web Sockets:使用 WebSocket 协议在客户端和服务器之间建立持久连接,进行双向通信。
4. 本地存储事件:使用本地存储监听 storage 事件在不同的浏览器窗口/标签页之间通信。
5. 第三方消息代理:使用第三方服务如 Pusher、Socket.io 等在客户端之间传递消息。

2.1 本地事件总线

React 项目:

js
// React 项目
import { useState } from 'react';

// 创建事件总线
const eventBus = {
  on(event, callback) {
    document.addEventListener(event, callback);
  },
  emit(event, data) {
    document.dispatchEvent(new CustomEvent(event, { detail: data })); 
  } 
}

function ReactApp() {
  const [msg, setMsg] = useState('');
  
  // 监听事件
  useEffect(() => {
    eventBus.on('message', (e) => {
      setMsg(e.detail); 
    })
  }, []);
  
  return <div>{msg}</div>  
}

Vue项目:

js
// Vue 项目

// 创建事件总线
const eventBus = new Vue(); 

methods: {
  sendMessage() {
    eventBus.$emit('message', 'Hello from Vue!'); 
  }
},
mounted() {
  eventBus.$on('message', (msg) => {
    this.msg = msg; 
  });
}

2.2 跨窗口消息传递postMessage

//React:
js
// 发送消息
window.opener.postMessage('Hello from React!', '*');

// 接收消息
window.addEventListener('message', (e) => {
  console.log(e.data); // Hello from Vue!
});
//Vue:
js
// 发送消息
window.opener.postMessage('Hello from Vue!', '*');

// 接收消息
window.addEventListener('message', (e) => {
  console.log(e.data); // Hello from React!
});

3. Web Sockets进行双向通信

js
// React 项目
import { useState, useEffect } from 'react';

function ReactApp() {
  const [msg, setMsg] = useState('');
  
  // 连接 WebSocket 
  useEffect(() => {
    const socket = new WebSocket('ws://localhost:3000');
    socket.onmessage = (e) => {
      setMsg(e.data); 
    }
  }, []);
  
  return <div>{msg}</div>  
}

// Vue 项目
methods: {
  sendMessage() {
    this.$socket.send('Hello from Vue!');
  }
},
sockets: {
  connect() {
    this.$socket = new WebSocket('ws://localhost:3000');
  }  
}


4. 本地存储事件:使用本地存储监听 storage 事件在不同的浏览器窗口/标签页之间通信

//React:
js
// 发送消息
localStorage.setItem('message', 'Hello from React!');

// 接收消息
window.addEventListener('storage', (e) => {
  console.log(e.newValue); // Hello from Vue!
}); 
/Vue:
js
// 发送消息 
localStorage.setItem('message', 'Hello from Vue!');

// 接收消息
window.addEventListener('storage', (e) => {
  console.log(e.newValue); // Hello from React!
});


5. 第三方消息代理:使用第三方服务如 Pusher、Socket.io 等在客户端之间传递消息

//Socket.io:
//React:
js
// 连接 Socket.io
const socket = io('http://localhost:4000');

// 发送消息
socket.emit('message', 'Hello from React!'); 

// 接收消息
socket.on('message', (msg) => {
  console.log(msg); // Hello from Vue!
});
//Vue:
js
// 连接 Socket.io
const socket = io('http://localhost:4000');

// 发送消息
socket.emit('message', 'Hello from Vue!');

// 接收消息
socket.on('message', (msg) => {
  console.log(msg); // Hello from React!
});
//Socket.io 服务器:
//js
const app = require('express')();
const http = require('http').createServer(app);
const io = require('socket.io')(http);

io.on('connection', (socket) => {
  socket.on('message', (msg) => {
    socket.broadcast.emit('message', msg);
  });  
});

http.listen(4000);

3.共享状态库

//在React中:javascript
import React from 'react';
import { createStore } from 'redux';

const initialState = { count: 0 };

function reducer(state = initialState, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    default:
      return state;
  }
}

const store = createStore(reducer);

function App() {
  const { count } = store.getState();

  function handleClick() {
    store.dispatch({ type: 'INCREMENT' });
  }

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

export default App;
//在Vue中:javascript
<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="handleClick">Increment</button>
  </div>
</template>

<script>
import { mapState, mapActions } from 'vuex';

export default {
  computed: mapState(['count']),
  methods: mapActions(['increment']),
};
</script>

在微前端中,不同的子应用之间可以通过多种方式进行通信和数据共享,不仅限于引用组件的方式。下面是一些常见的场景和解决方案:

1. 引用组件的方式在主应用中引用不同子应用的组件时,可以使用上面提到的自定义事件、消息总线或共享状态库等方式进行通信和数据共享。这种方式通常适用于子应用以组件的形式嵌入到主应用中的场景。

2. 路由的方式如果不同的子应用是通过路由的方式在主应用中引用的,可以使用URL参数、localStorage或cookie等方式进行通信和数据共享。例如,我们可以在URL参数中传递一些数据,或者使用localStorage或cookie来存储一些共享状态。

3. 独立运行的方式如果不同的子应用是独立运行的,它们之间无法直接进行通信和数据共享。但是,我们可以使用一些第三方工具或技术来实现跨域通信和数据共享,例如iframe、postMessage、WebSocket等。总之,不同的场景和需求需要选择不同的通信和数据共享方案。在实际应用中,我们需要根据具体情况来选择最合适的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习中,batch大小对模型的效果有影响吗?

内容来自李宏毅-2021机器学习 ##先说结论&#xff1a;同一个模型&#xff0c;大batch结果往往会较差。 上图中&#xff0c;横轴代表batch size&#xff0c;从左到右越来越大&#xff1b;纵轴代表准确率acc&#xff0c;越往上正确率越来越高。 在观察validation上的结果时&…

【数据结构与算法】基础数据结构

文章目录 数组概述动态数组二维数组局部性原理越界检查 链表概述单向链表单向链表&#xff08;带哨兵&#xff09;双向链表&#xff08;带哨兵&#xff09;环形链表&#xff08;带哨兵&#xff09; 队列概述链表实现环形数组实现 栈概述链表实现数组实现应用 双端队列概述链表实…

Android内部存储与外部存储(私有目录与公共目录)图文详解

目录 一、存储空间概述 二、存储空间的划分 1、存储划分 2、内部存储 2.1 内部存储概述 2.2 内部存储 - 私有目录 3. 外部存储 3.1 外部存储概述 3.2 外部存储 - 私有目录 3.3 外部存储 - 公共目录 三、内部存储与外部存储比较 1、横向对比 2、目录结构 3、存储分…

English Learning - L3 作业打卡 Lesson3 Day15 2023.5.19 周五

English Learning - L3 作业打卡 Lesson3 Day15 2023.5.19 周五 引言&#x1f349;句1: We present more expressions about food.成分划分连读爆破语调 &#x1f349;句2: They are from Elenir Scardueli, a listener in Brazil.成分划分弱读连读语调 &#x1f349;句3: My m…

plsql为什么连不上远程或本地的Oracle,需要做哪些准备?

文件配置解说 tnsnames.ora文件 文件所在地址&#xff1a;ORACLE_HOME\network\admin ORACLE_HOME&#xff1a;Oracle数据库或者客户端软件所在的地址 但是我的在Oracle数据库的目录下&#xff0c;而不是Oracle客户端软件&#xff08;instantclient_11_2&#xff09;下 里…

分布式架构设计及理论指导

目录 核心概念分布式分布式SOA架构微服务架构微服务技术对比 服务拆分拆分思想和原则创建父类工程创建子工程 远程调用方式引入RestTemplate CAP/BASE理论CAP理论分区容错 &#xff08;Partition-tolerance&#xff09;一致性&#xff08;Consistency&#xff09;可用性&#x…

【C++】继承/虚拟继承/菱形虚拟继承

继承 继承的概念继承体系中对象赋值转换继承方式对继承后的访问限定&#xff08;重定义-同名隐藏&#xff09;继承体系中派生类的默认成员函数友元函数、静态成员在继承中的特点菱形继承和菱形虚拟继承 继承的概念 为了让代码可以复用&#xff0c;当前类可以继承其他类的成员变…

阿里云OSS存储空间绑定自定义域名,浏览器通过自定义域名预览文件

阿里云官方文档&#xff1a; 如何绑定自定义域名_对象存储-阿里云帮助中心 华东1&#xff08;杭州&#xff09;地域创建了名为monkey的存储空间 Bucket&#xff1a;monkey Endpoint&#xff1a;oss-cn-hangzhou.aliyuncs.com 上传文件默认域名的url: https://monkey.oss-cn-han…

微信小程序nodejs+vue课程推荐报名学习分享平台uniapp

本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c; 整个开发过程首先对课程分享平台进行需求分析&#xff0c;得出课程分享平台主要功能。接着对课程分享平台 进行总体设计和详细设计。总体设计主要包括小程序功能设计、小程序总体结构设计、小程序…

Python数据可视化小结

1. 引言 原始形式的数据对大多数人来说可能都是枯燥乏味的&#xff0c;但是如果掌握正确的可视化工具&#xff0c;给人的印象就会变得引人入胜。本文通过实际例子&#xff0c;让我们利用数据可视化工具来探索不一样的数据体验。 闲话少说&#xff0c;我们直接开始吧&#xff…

推荐3款超好用的海报设计软件!

在现代社会&#xff0c;海报设计已经成为了一种非常重要的视觉传达方式。如果你需要制作一个引人注目的海报&#xff0c;但却没有设计师的技能和经验&#xff0c;那么在线海报设计图片软件就是你的最佳选择。下面我们将介绍 5 款最受欢迎的在线海报设计图片软件&#xff0c;它们…

qt中使用QGIS实现二次开发导入shp格式地图(MSVC2019_64bit+qt5.15+qgis)

在qt开发过程中可能要导入自定义格式的图层地图&#xff0c;那么可以把这些数据导入qgis然后导出为shp格式文件&#xff0c;然后下载qgis源码&#xff0c;在qt项目中配置环境变量导入qgis有关的头文件&#xff0c;然后再引入shp数据格式的地图。 qgis处理数据 QGIS安装 QGIS…

oracle数据库当中用户的创建,添加,授权,以及表的创建与表的简单介绍,以及在oracle数据库当中的约束以及约束条件的简单介绍

系列文章目录 (3条消息) oracle数据库简介 文章目录 系列文章目录 前言 一、用户的创建 1.1、创建命令 1.2、给予scott用户权限 1.3、以scott用户进行连接登录 二、表和表的设计原则 2.1、表的概念 2.1.1、表是从属于用户的 2.1.2、表是逻辑表(概念表)&#xff0c;不…

[比赛简介]Predict Student Performance from Game Play

比赛链接&#xff1a;https://www.kaggle.com/competitions/predict-student-performance-from-game-play/overview 比赛简介 本次比赛的目标是实时预测学生在基于游戏的学习中的表现。您将开发一个在最大的游戏日志开放数据集之一上训练的模型。 您的工作将有助于推进对基于…

Next.js ---未完待续....

Next.js 1.介绍2.体会服务器端渲染2.1为什么这就服务器端渲染了&#xff1f; 3.如何判断是否是服务器端渲染&#xff1f;--- 响应头信息4.文件名路由5.如何启动项目*另外1.Next.js 是基于 Webpack 的框架&#xff1f;1.1所以无需手动编译 TypeScript 代码 1.介绍 Next.js 是一…

【C++】C++泛型编程 | 模板初阶

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

LT8711UXE1,Type-C/DP1.2 转 HDMI2.0,内置HDCP,支持4k 60Hz向下兼容

1. 描述 LT8711UXE1 是一款高性能 Type-C/DP1.2 至 HDMI2.0 转换器&#xff0c;设计用于将 USB Type-C 源或 DP1.2 源连接到 HDMI2.0 接收器。LT8711UXE1 集成了一个符合 DP1.2 标准的接收器和一个符合 HDMI2.0 标准的发射器。此外&#xff0c;还包括两个用于 CC 通信的 CC 控…

研发/IT工程师双视角测评8大仿真平台,结果……

上一篇&#xff0c;我们围绕着亿万研发工程师的梦想&#xff0c;考察了市面上几乎所有类型的工业仿真平台&#xff0c;深度评测了他们本质究竟是什么&#xff0c;适用场景有哪些&#xff0c;分别能给研发和IT工程师们减轻多少工作量。 据此&#xff0c;我们搭建了一个工业仿真…

C++/PTA 神坛

C/PTA 神坛 题目要求解题前提及思路凹包算法概念步骤 解题思路 代码tan(y/x)及tan2(y,x)函数 总结 题目要求 在古老的迈瑞城&#xff0c;巍然屹立着 n 块神石。长老们商议&#xff0c;选取 3 块神石围成一个神坛。因为神坛的能量强度与它的面积成反比&#xff0c;因此神坛的面…

记录:自回归 模型在记忆 全随机序列 的潜变量 统计量爆炸现象

只是一个记录 8层12头512维度的 GPT 模型&#xff0c;使用它来记忆 10000 条 512长度 的无序序列&#xff0c;vocab_size 为100。 模型要自回归生成这些序列&#xff0c;不可能依赖局部推理&#xff0c;必须依赖全局视野&#xff0c;即记住前面的序列。 然后统计 最后一个no…