微前端micro-app 子应用 调用父应用方法

2024-04-26 20:04

本文主要是介绍微前端micro-app 子应用 调用父应用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:micro-app官方文档

场景描述

父应用存储一套vuex数据,其中包含登录信息token等,登录信息透传给子应用使用。
当子应用中的接口返回“登录失效”时,需要清空父应用vuex中的登录相关信息,并且跳转到登录页面。

原本vuex中有一个名为 LogOut 的action(如下),正常情况直接通过this.$store.dispatch("LogOut") 触发即可。

	...// 退出系统LogOut({ commit, state }) {return new Promise((resolve, reject) => {logout(state.token).then(() => {commit('SET_TOKEN', '')commit('SET_ROLES', [])commit('SET_PERMISSIONS', [])removeToken()resolve()}).catch(error => {reject(error)})})},....

但是微前端改造之后,子应用自身没有 vuex 的实例,最后考虑通过 子应用向主应用发送数据 的方式实现功能,原理:

解决办法

  1. 触发条件下,子应用通过 dispatch 向 父应用传递参数:
// 子应用 window.microApp.dispatch 传值
...
window.microApp.dispatch({type: 'callLogOut'})
...
  1. 父应用 通过 绑定监听函数 addDataListener 监听子应用传递的数据
// 父应用监听数据变化
...
microApp.addDataListener(appName, handlerFun);
...
发现问题:父应用只能监听到一次数据变化

上述代码写好之后,项目运行,发现父应用只能监听到一次数据变化,之后再次触发该特定场景,父组件始终无法监听到数据变化,即使子应用明明触发的 dispatch

经仔细查阅 父子应用传值文档,发现:

dispatch只接受对象作为参数,它发送的数据都会被缓存下来。 micro-app会遍历新旧值中的每个key判断值是否有变化,如果所有数据都相同则不会发送(注意:只会遍历第一层key),如果数据有变化则将新旧值进行合并后发送。

例如:

// 第一次发送数据,记入缓存值 {name: 'jack'},然后发送 
window.microApp.dispatch({name: 'jack'})
// 第二次发送数据,将新旧值合并为 {name: 'jack', age: 20},记入缓存值,然后发送 
window.microApp.dispatch({age: 20})
// 第三次发送数据,新旧值合并为 {name: 'jack', age: 20},与缓存值相同,不再发送
window.microApp.dispatch({age: 20})

dispatch是异步执行的,多个dispatch会在下一帧合并为一次执行

window.microApp.dispatch({name: 'jack'})
window.microApp.dispatch({age: 20})// 上面的数据会在下一帧合并为对象{name: 'jack', age: 20}一次性发送给主应用

解决方法

那么,有没有什么办法,不缓存参数,做到每次场景触发,子应用给父应用传值,父应用都能及时监听到并触发对应操作呢

有,那就是 forceDispatch:强制发送

forceDispatch方法拥有和dispatch一样的参数和行为,唯一不同的是forceDispatch会强制发送数据,无论数据是否变化。

示例:

// 强制发送数据,无论缓存中是否已经存在 name: 'jack' 的值
window.microApp.forceDispatch({name: 'jack'}, () => {console.log('数据已经发送完成')
})

最终代码

// 子应用
...// 重新登录window.microApp.forceDispatch({type: 'callLogOut'})
...// 父应用
...mounted() {// 父应用中监听子应用触发的自定义事件microApp.addDataListener('app-deploy', this.subListener)},beforeDestroy() {// 移除监听microApp.removeDataListener('app-deploy', this.subListener)},methods: {subListener(data) {// 登录过期,跳转首页并退出登录if (data?.type === 'callLogOut') {this.$store.dispatch('LogOut').then(() => {location.href = '/index'})}},...}
...

这篇关于微前端micro-app 子应用 调用父应用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938522

相关文章

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分