浅析qiankun主应用与微应用间如何通信解决微应用需要重复登录的问题
一、问题背景
当主应用登录后,再进去微应用发现还需要登录,相当于登录状态没有同步。
二、解决方案 —— 主应用与微应用通信
qiankun微前端应用间的通信,我们要利用qiankun
框架的initGlobalState
和MicroAppStateActions
api,相关的api介绍如下:
(1)setGlobalState
:设置 globalState
- 设置新的值时,内部将执行浅检查
,如果检查到globalState
发生改变则触发通知,通知到所有的观察者
函数。
(2)onGlobalStateChange
:注册观察者
函数 - 响应globalState
变化,在globalState
发生改变时触发该观察者
函数。
(3)offGlobalStateChange
:取消观察者
函数 - 该实例不再响应globalState
变化。
所以承接上篇,我们需要改造一下两个项目:
1、首先是主应用的micros/index.js
import {
registerMicroApps,
addGlobalUncaughtErrorHandler,
start,
initGlobalState // 新增
} from "qiankun";
const state = {}
const actions = initGlobalState(state);
export { actions }
2、以上新增了并导出了actions
,然后去到login.vue —— 登录之后通知所有微应用去同步登录状态
import { actions } from "@/micros"; //新增
const login = () => {
if (username.value && password.value) {
store.commit("setToken", "123456");
// 新增
actions.setGlobalState({globalToken: "******"});
router.push({path: "/"});
}
};
引入actions
并新增了actions.setGlobalState
方法,通知所有微应用
3、然后是子应用的 main.js —— 主要是需要增加监听方法
function render(props) {
console.log("子应用render的参数", props)
// 新增
props.onGlobalStateChange((state, prevState) => {
// state: 变更后的状态; prev 变更前的状态
console.log("通信状态发生改变:", state, prevState);
// 这里监听到globalToken变化再更新store
store.commit('setToken', '******') }, true);
// 挂载应用
instance = new Vue({
router,
store,
render: (h) => h(App),
}).$mount("#micro-app");
}
在render
方法中我们加上onGlobalStateChange,并且第二位参数置为true,这样微应用一启动的时候,我们马上就可以看到刚刚设置的 globalToken
:******
这样经过改造之后,我们刷新重新登录主应用,然后点击微应用的菜单,可以看到微应用就不需要再登录了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-07-10 NuxtJS处理因css在服务端渲染而增加源代码量,从而影响到SEO的问题及VUE提取 CSS 到单个文件
2018-07-10 将url的查询参数解析成字典对象