qiankun应用级缓存-多页签缓存

news2024/11/20 0:21:36

需求:

A:主应用
B:子应用
项目框架:vue2 + 全家桶 + qiankun
应用间切换需要保存页面缓存(多页签缓存),通过vue keep-alive只能实现页面级缓存,在单独打开的应用里能实现缓存,但是子应用切换到主应用,那子应用的缓存失效
在这里插入图片描述

方案:

采用子应用切换时,将子应用作为一个vue实例,再次加载时使用保存的实例上的vnode替换vue实例化的时候的render函数

前提

1.项目已实现页面级缓存(其实就是通过keep-alive include来实现)

解决步骤

1.qiankun加载子应用的方式选择

1.通过registerMicroApps注册子应用,qiankun会通过自动加载匹配的子应用;
2.通过loadMicroApp手动注册子应用

第一种qiankun自动检测路有的变化来控制子应用的卸载和加载,我们无法监听到,也就无法去替换vnode,所以采用第二种,手动加载应用(通过路由的变化去监听下就行了)

//navbar。vau
watch: {
    $route(to, from) {
    //判断是否要加载 或卸载应用
      doQiankun(to, from)
      //这段代码时其他功能
      if (to.path.indexOf(ssoName) !== -1) {
        this.isShowssoAdmin = true
      } else {
        let timer = setTimeout(() => {
          this.isShowssoAdmin = false
          clearTimeout(timer)
        })
      }
    }
  },

//抽离的js

export const doQiankun = (to, form) => {
  if (to.path.indexOf(ssoName) !== -1 && (form.path.indexOf(ssoName) === -1 || !form.path)) {
    loadApp()
  } else if (to.path.indexOf(ssoName) !== -1 && form.path.indexOf(ssoName) !== -1) {
    console.log('子应用之间切换')
  } else {
    unLoadApp()
  }
}

export const loadApp = () => {
  // 手动加载微应用
  microApp = loadMicroApp({
    name: ssoName,
    entry: ssoUrl,
    container: `#${ssoName}`,
    props: { }
  })
}

/**
 * @description: 手动卸载微应用
 * @return {*}
 * @Date Changed:
 */
export const unLoadApp = () => {
  console.log('手动卸载微应用')
  // 手动卸载微应用
  if (microApp) microApp.unmount()
}

2.实现手动加载后,在子应用中unmount 卸载周期中存储实例

//main.js
//instance 其实就是new Vue()的实例
//loadedApplicationMap定义的对象
let loadedApplicationMap = {}
let instance = null
export async function unmount() {
  unmountCache(instance, loadedApplicationMap, instance.$router)
  router = null
}

/**
 * @description: qiankun卸载子应用时 保存子应用实例
 * @param {*} instance  子应用实例
 * @param {*} loadedApplicationMap 保存的对象
 * @param {*} _router 离开时的路由
 * @return {*}
 * @Date Changed:
 */
 //代码都不用改  保存一下退出应用前的实例
function unmountCache(instance = {}, loadedApplicationMap = {}, _router) {
  // 此处永远只会保存首次加载生成的实例
  const needCached = instance.cachedInstance || instance
  const cachedInstance = {}
  cachedInstance._vnode = needCached._vnode
  // keepalive设置为必须 防止进入时再次created,同keep-alive实现
  if (!cachedInstance._vnode.data.keepAlive) cachedInstance._vnode.data.keepAlive = true

  loadedApplicationMap._vnode = cachedInstance._vnode
  loadedApplicationMap.$router = _router
  loadedApplicationMap.apps = [].concat(_router.apps)
  loadedApplicationMap.currentRoute = { ..._router.currentRoute }


}

3.进入应用时,替换vnode
这里要区分是否是首次进入

光替换node 会导致原来的路由失效,所以同时也要针对路有进行处理

//main.js
let isFirst = true

function render(props = {}) {
  const { container } = props
  // 这里必须要new一个新的路由实例,否则无法响应URL的变化
  router = new VueRouter({
    // base: window.__POWERED_BY_QIANKUN__ ? '/ssoAdmin/' : '/',
    mode: 'hash',
    // mode: 'history',
    routes
  })

  // 这里主要是适配子应用的单独访问和继承访问
  let vnode = loadedApplicationMap._vnode || null
  if (isFirst) {
    // 首次进入应用
    routerBeforeEach() //自己定义的路由守卫
    instance = newVueInstance(vnode).$mount(container ? container.querySelector('#app') : '#app')
    isFirst = false
  } else {
    //  router使用缓存命中
    // router = loadedApplicationMap.$router;

    // 让当前路由在最初的Vue实例上可用
    router.apps.push(...loadedApplicationMap.apps)
    routerBeforeEach() //自己定义的路由守卫
    instance = newVueInstance(vnode)

    // 当前路由和上一次卸载时不一致,则切换至新路由
    const { path } = router.currentRoute
    const oldPath = loadedApplicationMap.currentRoute.path
    if (path !== oldPath) {
    //replace 替换 浏览器记录
      loadedApplicationMap.$router.replace({ path, query: router.currentRoute.query })
    }

    instance.$mount(container ? container.querySelector('#app') : '#app')
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

德国申请专利,发明,实用,外观专利申请详细步骤

一、德国专利申请途径 申请人可以向德国专利商标局直接递交申请。要求优先权的情况下根据《保护工业产权巴黎公约》需要在递交中国在先申请的12个月之内向德国专利商标局递交申请。 另外,通过PCT(“Patent Cooperation Treaty”,即《专利合作…

【分享】免费的AI绘画网站(5个)

哈喽,大家好,我是木易巷~ 随着人工智能技术的不断发展,越来越多的AI绘画软件开始涌现,如果你想要免费享受AI绘画的乐趣,那你可要好好看下面的内容~ Vega AI创作平台 入口:https://rightbrain.art 一款专业的…

AIGC+RPA丨大语言模型赋能实在智能数字员工“超进化”

前不久,全球最大上市咨询公司埃森哲发布2023年技术愿景《When Atoms meet Bits》报告,并在当中深度解析到:生成式AI成为2023年四大技术发展趋势之一。 大型语言模型(Large Language Model, LLM)领域的研发和布局在国内…

如何科学判断研发团队是否在健康工作?(内附量表)

研发效能管理覆盖了交付速度、质量和价值三个维度,但文化建设、团队氛围和客户协作等其他因素对团队工作的影响又该如何度量和管理呢? LigaAI 在 John Cutler 的一篇分享中找到了答案:团队健康度评分。就像我们都很关心自己的身体健康一样&a…

《程序员面试金典(第6版)》面试题 16.02. 单词频率(哈希法,C++)

题目描述 设计一个方法,找出任意指定单词在一本书中的出现频率。 你的实现应该支持如下操作: WordsFrequency(book)构造函数,参数为字符串数组构成的一本书get(word)查询指定单词在书中出现的频率 示例: WordsFrequency word…

DevEco Studio 3.1 Beta新特性知多少

HUAWEI DevEco Studio是开发HarmonyOS应用及服务的一站式集成开发环境(IDE)。本次,DevEco Studio 3.1 Beta新增支持当前在市面上新的操作系统,如Windows11、macOS(ARM)操作系统,还面向HarmonyOS…

4.数据结构(0x3f:从周赛中学算法 2022下)

来自0x3f【从周赛中学算法 - 2022 年周赛题目总结(下篇)】:https://leetcode.cn/circle/discuss/WR1MJP/ 包括堆(优先队列)、单调栈、单调队列、字典树、并查集、树状数组、线段树等。 学习这些只是开始,能…

Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

原论文:EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 一般本人的习惯是先看论文熟悉它,然后代码去实现它,这样感觉要好点。因为论文讲解的比较全面和一些实验对比还有很多的引用等,另外大家知道好论文基本都是英文&#xff0c…

【Python】【进阶篇】2、Django MTV和MVC的区别

目录 2、Django MTV和MVC的区别1. MVC设计模式2. MTV设计模式 2、Django MTV和MVC的区别 在上一节《Django是什么》中,我们对 Django 的诞生以及 Web 框架的概念有了基本的了解,本节我们介绍 Django 的设计模式,也就是 MTV。 在 Web 开发领…

Point cloud tools for Matlab(点云学习工具)

Point cloud tools for Matlab (tuwien.ac.at)https://www.geo.tuwien.ac.at/downloads/pg/pctools/pctools.html#PointCloud_class 下载:Download Matlab Code 添加路径 addpath(genpath(D:\MyMatlabCode\pointCloudTools)); pc pointCloud(Lion.xyz); pc.plot…

AI绘画——ChilloutMix模型(现实真人,实现写实逼真的图像)

目录 重要提示:首先,我从不建议再生“真实”人物的图像, 但是,照片“逼真”图像。 本人郑重声明:本模型原则上禁止用于训练基于明星、公众人物肖像的风格模型训练,因为这会带来争议,对AI社区…

全网详细介绍百度低代码框架amis及实例讲解

文章目录 1. 文章引言2. amis官网3. amis介绍3.1 amis的简述3.2 amis的初衷3.3 amis的其他亮点3.4 amis不适之处 4. amis使用4.1 amis框架集成4.2 amis切换主题4.3 amis配置与组件4.4 amis变量 5. amis实例5.1 amis实例5.2 列表查询5.3 查看详情5.4 自定义操作按钮5.5 提交表单…

你知道ChatGPT中的数据模型是什么吗?

本文将为你揭开ChatGPT和GPT-4中使用的以数据为中心的人工智能技术的秘密。 人工智能在改变我们的生活、工作和与技术互动的方式方面取得了令人难以置信的进步。最近,一个取得重大进展的领域是大型语言模型(LLM)的开发,如​​GPT…

二十、SQL 数据分析基础与进阶(一)

文章目录 一、破冰 SELECT 基础检索1.1 检索所需要的列1.1.1 检索单列数据1.1.2 检索多列数据 1.2 * 符号初体验1.3 独特的 DISTINCT1.4 使用 ORDER BY 排序检索结果1.5 使用 LIMIT 限制返回行数1.6 ORDER BY 与 LIMIT 结合的妙用 二、过滤数据,选你所想三、计算字段…

ArcGIS Pro快捷键

目录 1 常规应用快捷键 2 动画快捷键 3 内容窗格快捷键 4 数据工程试图快捷键 5 编辑工具快捷键 5.1 常规编辑 5.3 选择工具 5.4 表 5.5 文本格式化标签 5.6 编辑注记 5.7 移动 5.8 旋转 5.9 比例 5.10 编辑折点 5.11 几何属性表 5.12 创建注记 5.13 创建点要…

安装 FME Desktop 2020 教程(内置补丁可以有效激活软件)

介绍:FME Desktop 2020是由加拿大Safe Software公司开发的空间数据转换处理系统,采用先进的数据转换技术,内置几十个转换器,能够满足绝大部分用户的空间数据格式转换功能。除此之外,该软件基于OpenGIS组织提出的新的数…

MySQL_第12章_MySQL数据类型精讲

第12章_MySQL数据类型精讲 1. MySQL中的数据类型 类型 类型举例 整数类型 TINYINT 、 SMALLINT 、 MEDIUMINT 、 INT( 或 INTEGER) 、 BIGINT 浮点类型 FLOAT 、 DOUBLE 定点数类型 DECIMAL 位类型 BIT 日期时间类型 YEAR 、 TIME 、 DATE 、 DATETIME 、 TIMESTAMP 文…

Java 7、8 HashMap源码详解与分析

文章目录 一、哈希表的简介二、JDK1.7 HashMap1、构造方法2、添加方法put()方法addEntry()方法 3、存在的问题 三、JDK1.8 HashMap1、红黑树TreeMap2、属性3、存储的结构4、构造方法5、添加方法put(K, V)方法resize扩容方法 5、putAll()方法6、移除方法remove(Objec…

Salesforce官方_中文学习、考证资源

Salesforce将Trailhead描述为学习热门技能的有趣且免费的平台。该平台有助于缩小技能差距,是所有Salesforce用户的宝藏资源。 Trailhead适合所有学习者。它涵盖了适用于Salesforce任何角色的主题和学习模块,从管理员、开发人员、销售主管到最终用户。学…

数据库基础篇 《12.MySQL数据类型精讲》

1. MySQL中的数据类型 2. 整数类型 2.1 类型介绍 整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。 它们的区别如下表所示: 2.2 可选属性 整数类型的可选属性有三个: 2.2.1 M …