当主应用登录后,再进去微应用发现还需要登录,相当于登录状态没有同步。
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
:******
这样经过改造之后,我们刷新重新登录主应用,然后点击微应用的菜单,可以看到微应用就不需要再登录了。