qiankun 应用之间数据传递

news/2024/10/18 13:12:59/

qiankun__0">qiankun 应用之间数据传递

initGlobalState_2">全局共享 initGlobalState

qiankun initGlobalState API 单击前往

qiankun 内部提供了 initGlobalState 方法用于注册 MicroAppStateActions 实例用于通信,该实例有三个方法,分别是onGlobalStateChange、setGlobalState、offGlobalStateChange。这几个方法其实看一下他们的英文就大概知道所对应做的事情了,下面直接通过一个案例演示一下

主应用注册

改造一下主应用的入口文件,下面是新加的和全局状态共享相关的。这里初始化了一个状态数据,并且将值给设置了,同时调用了监听改变,当值被改变后会触发对应回调。

补充这一段代码可以抽离为一个单独的文件(就像vue3当中单独写一个store一样,然后导出这个action),然后在你的主应用页面代码当中导入之后去通过setGlobalState改变值也是一样的(haha,这样就是在vue或者jsx当中用的咯,别突然被我这个写在入口当中的困住了)

import {registerMicroApps, start, initGlobalState} from 'qiankun';// 全局状态管理
const state = {count: 1};const action = initGlobalState(state);action.onGlobalStateChange((value, prev) => {console.log('main app change', value, prev);
});action.setGlobalState(state);

子应用获取

这里以vue3作为子应用来进行说明,同样的是对入口文件进行改造,在子应用接入qiankun的时候,我们要将对应的生命周期写上。在mount注册的时候会有一个props参数,在这个props当中就有我们所需要的全局共享对象。

let app: any;
if (!qiankunWindow.__POWERED_BY_QIANKUN__) {createApp(App).use(router).use(ElementPlus).mount('#app');
} else {renderWithQiankun({mount(props) {app = createApp(App).use(router).use(ElementPlus);app.mount(props.container?.querySelector('#app'));console.log('vue app mount get props', props);props.onGlobalStateChange((state: any, prev: any) => console.log(`vue 子应用 [onGlobalStateChange - ${props.name}]:`, state, prev));props.setGlobalState({count: 100});},// bootstrap、update、unmount三个生命周期省略。。。。});
}
优化

在子应用当中我们也可以把这个action单独抽离出来封装一下

function emptyAction() {// 警告:提示当前使用的是空 Actionconsole.warn("Current execute action is empty!");
}class Actions {// 默认值为空 Actionactions = {onGlobalStateChange: emptyAction,setGlobalState: emptyAction};/*** 设置 actions*/setActions(actions) {this.actions = actions;}/*** 映射*/onGlobalStateChange(...args) {return this.actions.onGlobalStateChange(...args);}/*** 映射*/setGlobalState(...args) {return this.actions.setGlobalState(...args);}
}const actions = new Actions();
export default actions;

然后还是在入口文件的mount生命周期当中把props的action赋值给我们包的这个actions,也就是下面这样,然后再在其他地方用的时候导入这个actions就好了

import actions from './action.js';
actions.setActions(props);

在这里插入图片描述

观察者模式 & 发布订阅

js设计模式-观察者&发布订阅 单击前往

可以利用观察者模式或者发布订阅将数据给绑定在windows下,然后进行对应的监听处理

Props传值

在主应用当中注册子应用的时候可以通过props来进行值传递

registerMicroApps([{name: 'react app', // app name registeredentry: '//localhost:7100',container: '#yourContainer',activeRule: '/yourActiveRule',// 通过这个将myData传递,子应用在mount中可以拿到这个prop里面的值props: myData}
]);

骚操作

localStorage

反正不管什么都往这里面塞,要拿的时候再从这里面拿

window

把要传的值挂载到window全局上,要拿的时候来window上拿


http://www.ppmy.cn/news/1540008.html

相关文章

精益生产现场管理和改善的具体步骤是什么?

在竞争日益激烈的今天,企业如何才能在保持高效运营的同时,不断提升产品质量与客户满意度?答案就藏在精益生产现场管理和改善之中。今天,就让我们(深圳天行健企业管理咨询公司)一同探索,从混乱无…

掌握 Vue.js 中的 Axios:解密字符串插值和 URL 构建20241011

掌握 Vue.js 中的 Axios:解密字符串插值和 URL 构建 在使用 Vue.js 进行前端开发时,Axios 是一个常用的 HTTP 客户端库,用于与后端服务器进行通信。然而,对于初学者来说,如何正确编写 Axios 请求,特别是在…

广州市孤独症康复训练学校,携手迈向未来

在繁华的广州市,隐藏着一家充满爱与希望的孤独症康复训练学校——星贝育园康复中心。作为全国规模较大的广泛性发育障碍全托寄宿制儿童康复训练机构,星贝育园以其专业的康复理念、科学的训练方法以及显著的康复效果,成为了无数特殊儿童家庭的…

探索 Spring AI:Java 开发者的 AI 应用开发新利器

在当今这个由人工智能驱动的时代,AI 技术正在以前所未有的速度改变着我们的工作和生活方式。对于 Java 开发者来说,将 AI 能力集成到他们的应用程序中,已经成为了一个迫切的需求。阿里云开源的 Spring AI Alibaba 框架,正是为了满…

Axure重要元件三——中继器修改数据

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器修改数据 主要内容:显示编辑内容、表格赋值、修改数据 应用场景:更新行、表单数据行修改 案例展示: 正文…

接口模式、工厂模式、模板方法模式的日志文件系统

日志文件系统 编写一个与具体业务无关的示例代码。这个示例代码主要体现以下几个设计思想和模式: 接口模式(Interface Pattern):定义接口类,并让具体实现类去实现该接口的功能。工厂模式(Factory Pattern…

面试官:为什么 MySQL 不推荐使用 join?

1、对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据。 2、子查询就更别用了,效率太差&…

C# 3D开发-环境配置-VS Code + Unity-常见错误汇总

VS Code没有作为Unity的默认开发工具或找不到VS Code 在Unity中,请前往:Window(窗口)> Package Manager(包管理器)。然后,确保从左上角的下拉菜单中选择“Packages: Unity Registry”&#…