qiankun微服务架构下子应用路由跳转问题
背景
在最近qiankun.js微服务架构的后台管理中,进入子应用内页后再返回,会覆盖掉上一级路由的情况,造成页面跳转混乱问题。
eg:
开始页面 | 动作 | 结束页面 | 跳转结果 | 预期结果 | |
---|---|---|---|---|---|
子应用B/a/list | 进入 | 子应用B/b/list | 正常 | 正常进入B/b/list | ✔ |
子应用B/b/list | 进入 | 子应用B/b/content | 正常 | 正常进入B/b/content | ✔ |
子应用B/b/content | 返回 | 子应用B/a/list | 错误❌ | 返回到子应用B/b/list | ❗❗❗ |
解决方案
使用
window.location.href
方法进行跳转,可以解决问题。但在跳转时候会出现页面刷新动作,和目前的SPA格格不入,可做为应急解决方法。调用
window.history.pushState
,这个在网上看是可以,未实践。把主应用的
history
以props
的形式传给子应用 ,子应用跳转路由使用主应用的router。主应用router/配置
正常写router文件
const routes = [ { path: '/', component: '...' }, ... ] Vue.use(Router) const router = new VueRouter({ mode: "history", routes, }) export default router;
主应用main.js通过props传递router
*** import router from "./router" *** // 注册子应用 registerMicroApps([ { name: 'gwapp', // 子应用名称口 entry: process.env.NODE_ENV === 'development' ? '//192.168.0.1:9000/b/' : '//192.168.0.2:9000/b/', // 子应用入口 container: '#B', // 子应用所在容器 activeRule: process.env.NODE_ENV === 'development' ? '/b' : '/B/b', // 子应用触发规则(路径) props: { mainAppRouteBase: router } }, ], ***
子应用main.js接收与注册全局
*** function render(props) { // 接收 const { container, mainAppRouteBase } = props app = createApp(App) // 注册全局 app.provide('mainAppRouteBase', mainAppRouteBase) *** app.mount(container instanceof Element ? (container.querySelector("#B")) : (container) ) ***
子应用组件内使用
import { inject } from 'vue'; const mainAppRouteBase = inject('mainAppRouteBase'); // 跳转页面 mainAppRouteBase.push('/B/b/content') // 返回页面 mainAppRouteBase.back();
参考链接: Qiankun微应用之间路由跳转📩 - 掘金