qiankun实现子应用tab页签切换缓存页面

实现背景

项目中是使用的jeecg-boot低代码构建的前端开发环境,由于后期各个模块代码越来越多,打包慢,分支管理麻烦,领导要求使用微前端,每个模块拆分为子应用。

拆分子应用

由于jeecg里面自带qiankun,所以改造微前端我们使用qiankun来做

为了方便我们使用的qiankun自动挂载(registerMicroApps)的方式实现的

新的问题?

registerMicroApps方式使用了一段时间后,需求上需要切换tab页面时缓存子应用页面,页签关闭取消缓存,从菜单点击页面刷新。

从网上找了一些registerMicroApps实现缓存的方法,不是很适用,比如说:
https://zhuanlan.zhihu.com/p/548520855,3.1描述的方式实现,以及
https://blog.csdn.net/lunahaijiao/article/details/134657734,方案二实现方式。这两种都是registerMicroApps自动挂载的方式实现缓存页面。但是出现的问题是:一个子应用多个缓存页面就会出问题了
在这里插入图片描述

通过loadMicroApp实现

主应用

  1. 首先,主应用修改apps.js
const _apps = [
  {
    name: 'app1,
    entry:
      process.env.NODE_ENV === 'development'
        ? 'http://localhost:9529/'
        : document.querySelector('html').dataset.app1Url,
    container: '#contentApp1',
    activeRule: 'app1', //路由匹配
    sandbox: {
      strictStyleIsolation: true // 开启样式隔离
    }
  },
  {
    name: 'app2',
    entry:
      process.env.NODE_ENV === 'development'
        ? 'http://localhost:3099/'
        : document.querySelector('html').dataset.app2Url,
    container: '#contentApp2',
    activeRule: 'app2', //路由匹配
    sandbox: {
      strictStyleIsolation: true // 开启样式隔离
    }
  },
]
  1. 修改index.js
/**
 * qiankun配置
 */
import {
  loadMicroApp,
} from 'qiankun'
import { apps } from './apps'
import { getProps, initGlState } from './state'
import { prefetchApps } from 'qiankun';

prefetchApps(apps);


/**
 * 微应用注册
 */
function registerApps(item) {
  const loader = loadMicroApp({
    ...item,
    props: {
      ...getProps(),
    }
  }, {
    sandbox: {
      experimentalStyleIsolation: true, //   开启沙箱模式,实验性方案
    }
  })
  // 定义全局状态
  initGlState()
  return loader
}

export default registerApps

  1. state.js更改
/**
 *公共数据
 */
import { initGlobalState } from 'qiankun'
import store from '../store'
import Vue from 'vue'
import { ACCESS_TOKEN, USER_NAME } from '@/store/mutation-types'
// 公共组件

//定义传入子应用的数据
export function getProps() {
  return {
    data: {
      publicPath: process.env.BASE_URL,
      token: Vue.ls.get(ACCESS_TOKEN)
    }
  }
}

/**
 * 定义全局状态,并返回通信方法,在主应用使用,微应用通过 props 获取通信方法。
 * @param state 主应用穿的公共数据
 */
export function initGlState() {
  const info = {
    userName: Vue.ls.get(USER_NAME),
    isLogin: true,
    closeCurrent: false,
    produceTabsChange: 1,
    approvalParams: '',
  }
  // 初始化state
  const actions = initGlobalState(info)
  // 设置新的值
  actions.setGlobalState(info)
  // 注册 观察者 函数 - 响应 globalState 变化,在 globalState 发生改变时触发该 观察者 函数。
  actions.onGlobalStateChange((newState, prev) => {
    if (!newState.isLogin) {
      store.dispatch('Logout').then(() => {
        window.location.reload()
      })
    }
    if (newState.closeCurrent) {
      store.dispatch('setCloseTab', true)
      actions.setGlobalState({ closeCurrent: false })
    }
  })
  // 将action对象绑到Vue原型上,为了项目中其他地方使用方便
  Vue.prototype.$actions = actions
}


  1. mian.js 修改
let activeApps = {}
router.beforeEach((to, from, next) => {
  const conf = apps.find(item => to.path.includes(item.activeRule))
  if (conf) {
    store.dispatch('setOpenQianKun', true)
    const cacheMicro = activeApps[conf.activeRule]
    // 已缓存应用
    if (cacheMicro) {
      next()
      return
    }
    // 未缓存应用
    activeApps[conf.activeRule] = registerApps({ ...conf })
    next()
  } else {
    unmountMicroApps()
    store.dispatch('setOpenQianKun', false)
    next()
  }
})
export function unmountMicroApps () {
  for (const key in activeApps) {
    // 缓存的页面
    const includedRoutes = Vue.ls.get(CACHE_INCLUDED_ROUTES) || []
    // 子应用所有的页面
    const subNameArr = Vue.ls.get(CACHE_SUB_ROUTES)[key]
    let isInclude = false
    includedRoutes.forEach(item => {
      if (subNameArr.includes(item)) {
        isInclude = true
      }
    })
    // 子应用没有缓存的页面,卸载子应用
   if (!isInclude) {
     activeApps[key].unmount()
     delete activeApps[key]
   }
  }
}

  1. 子应用入口
    在这里插入图片描述
  2. 在tab页面关闭时调用unmountMicroApps 方法

子应用

  1. user.js加上这段代码,解决主子应用路由冲突
    在这里插入图片描述

大致就是这些改造,还有一些页面的优化没有贴上来,后续会梳理出不含业务的代码,有需要的朋友可以联系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/774046.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.1.2数据结构的三要素

一.数据结构的三要素 数据结构这门课着重关注的是数据元素之间的关系,和对这些数据元素的操作,而不关心具体的数据项内容 。 1.逻辑结构 (1)集合结构 (2)线性结构 数据元素之间是一对一的关系。除了第一个…

虚幻引擎 快速的色度抠图 Chroma Key 算法

快就完了 ColorTolerance_PxRange为容差,这里是0-255的输入,也就是px单位,直接用0-1可以更快 Key为目标颜色

[数据集][目标检测]护目镜检测数据集VOC+YOLO格式888张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):888 标注数量(xml文件个数):888 标注数量(txt文件个数):888 标注类别…

【微信小程序开发实战项目】——花店微信小程序实战项目(4)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

10种有效提高电子设备可靠性的PCB散热技术

在现代电子领域,随着器件尺寸的不断缩小和性能的不断提高,热管理问题日益凸显,不容忽视。电子设备在运行过程中产生的热量,如果处理不当,散发不了,就会像潜移默化的威胁一样,悄无声息地危及设备…

Desktop docker 部署 WordPress

Desktop Docker 部署 WordPress 之前都是在Linux里面玩的,今天看到别人在windwos下安装docker,一时兴起装了一个试试,效果一般,很吃硬盘空间和内存。 首先在docker官方下载桌面版,安装下一步一直到完成。 安装完docker会自动加入到环境变量,而且docker-compose也会一并安…

SPLL单相软件锁相环相关源代码理解-SOGI及PI系数计算

最近在学习TI的TIDA-010062(DSP型号用的是TMS320F280049C),也就是1kW、80 Plus Titanium、GaN CCM 图腾柱无桥 PFC 和半桥 LLC(具有 LFU)参考设计。在整个框图中看到SPLL_1ph_SOGI的模块(实验4:…

软件测试面试题集(含答案)

软件测试面试题集一、Bug基本要素 缺陷ID,状态,类型,所属项目,所属模块,缺陷提交时间,缺陷提交人(检测者),严重程度,优先级别,缺陷描述信息&#…

【TS】TypeScript 联合类型详解:解锁更灵活的类型系统

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript 联合类型详解:解锁更灵活的类型系统一、联合类型的定义二…

一站式采购!麒麟信安CentOS安全加固套件上架华为云云商店

近日,麒麟信安CentOS安全加固套件正式上架华为云云商店,用户可登录华为云官网搜索“CentOS安全加固”直接采购,一站式获取所需资源。 麒麟信安CentOS安全加固套件已上架华为云 https://marketplace.huaweicloud.com/contents/9fe76553-8d87-…

后端部署Jar包 | 启动失败系列问题(图解-BuiId,Maven)

目录 项目的构建 打包前的准备 合理配置pox.xml文件 Build 打包方式 Maven打包方式 Jar包部署 测试后端接口 项目的构建 我的项目是SpringBoot2脚手架 先准备一个相对于的数据库依赖 数据库的任意库 Yaml配置后 才能正常在IDEA中跑起来 打包前的准备 合理配置pox.xm…

推荐的一键下载1688高保真原图信息

图片在电商中扮演着至关重要的角色。高质量的商品图片能够直观展示产品特性,吸引消费者注意力,提升购买欲望。良好的视觉呈现还能增强品牌形象,提高转化率。此外,图片是跨语言的沟通方式,能够克服语言障碍,…

linux——小细节(Makefile)(gdb)

一、makefile a.out:main.c func.cgcc main.c func.cclean:rm a.out a.out:main.c func.cgcc $^ -o $clean:rm a.out SRCmain.c func.c OBJa.out CCgcc FLAG -g -lpthread $(OBJ):$(SRC)$(CC) $(SRC) $(FLAG)clean:rm $(OBJ) 二、gdb

快速傅里叶变换(Fast Fourier Transform)

快速算法(FFT),即快速傅里叶变换(Fast Fourier Transform),是一种用于计算离散傅里叶变换(DFT)及其逆变换的高效算法。FFT算法由J.W.库利和T.W.图基于1965年提出,显著减少…

7-google::protobuf::io命名空间下常用的C++ API----zero_copy_stream_impl.h

一、protobuf输入输出文件流C API总览 二、经常会用到的API

昇思25天学习打卡营第12天|MindSpore-基于MobileNetv2的垃圾分类

基于MobileNetv2的垃圾分类 主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写(Python语言);了解Linux操作系统的基本使用;掌握atc命令进行模型…

每日Attention学习8——Rectangular self-Calibration Attention

模块出处 [ECCV 24] [link] [code] Context-Guided Spatial Feature Reconstruction for Efficient Semantic Segmentation 模块名称 Rectangular self-Calibration Attention (RCA) 模块作用 空间注意力 模块结构 模块代码 import torch import torch.nn as nn import tor…

Redis基础教程(十四):Redis连接

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

Turborepo简易教程

参考官网:https://turbo.build/repo/docs 开始 安装全新的项目 pnpm dlx create-turbolatest测试应用包含: 两个可部署的应用三个共享库 运行: pnpm install pnpm dev会启动两个应用web(http://localhost:3000/)、docs(http://localhost…

程序员,去哪个城市工作更幸福?

深漂、沪漂、京漂、杭漂……又是一年毕业季,作为CS专业or新手程序员会选择什么城市工作呢?希望这篇文章给各位一些参考。 根据拉勾招聘大数据研究院的数据显示,超六成程序员集中在一线城市,其中北京19%,深圳16%&#x…