位置: IT常识 - 正文

微前端:qiankun的五种通信方式(微前端Qiankun介绍)

编辑:rootadmin
微前端:qiankun的五种通信方式 背景

推荐整理分享微前端:qiankun的五种通信方式(微前端Qiankun介绍),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:微前端:qiankun 主应用与子应用之间的跳转,微前端Qiankun介绍,微前端:qiankun 主应用与子应用之间的跳转,微前端Qiankun 子应用css后加载导致页面闪动,微前端:qiankun 主应用与子应用之间的跳转,微前端:qiankun 子应用跳转到主应用,微前端:qiankun 主应用与子应用之间的跳转,微前端:qiankun 主应用与子应用之间的跳转,内容如对您有帮助,希望把文章链接给更多的朋友!

今天盘点一下 qiankun 父子应用的通信方式都有哪些,我发现了 5 种。

1、localStorage/sessionStorage 2、通过路由参数共享 3、官方提供的 props 4、官方提供的 actions 5、使用vuex或redux管理状态,通过shared分享

接下来我们一个一个进行说明

1、localStorage/sessionStorage

有人说这个方案必须主应用和子应用是同一个域名下。其实不是的,子应用使用不同的域名也是可以的,因为在 qiankun 中,主应用是通过 fetch 来拉取子应用的模板,然后渲染在主应用的 dom 上的,说白了还是运行在主应用上,所以还是运行在同一个域名上,也就是主应用的域名。

父传子

主应用 main.js

localStorage.setItem('token', '123')console.log('在main中设置了token')

子应用app1 main.js

const token = localStorage.getItem('token')console.log('app1中打印token:', token)

我们可以看到,从主应用的首页跳到微应用 app1 的首页,分别打印了这两项,说明是可以通过 localstorage 通信的。

子传父

同理app1修改token,main也可以看到,这里就不再赘述

2、通过路由参数共享

这个也很好理解,因为只有一个 url,不过子应用还是主应用给 url 上拼接一些参数,那么父子应用都可以通过 route 来获取到。

父传子

这里我没有找到父传子的场景

子传父

主应用跳到子应用,子应用内部路由跳转携带参数,父应用通过路由守卫可以拿到路由上的参数。

从 main 首页跳到 app1 首页,app1 首页点击列表跳到了 app1 的详情页,可以看到详情页的 url 上分别带了两个参数,而路由跳转的时候触发了 main 的路由守卫,捕获到了这个路由。

可以看到这里的 meta 和 name 是空的,但是我子应用明明有设置啊,这是怎么回事?

其实捕获到的路由对象是主应用的,而不是子应用的,这里能获取到这两个参数,完全是因为路由守卫获取的时候只关心 url 的 ? 后面的参数,所以这里碰巧共享了。

如果父应用想完整的获取子应用的路由怎么获取呢? 只能通过其他传值方式将子应用的路由对象传给父应用了。 把父应用的路由实例传给子应用,也是没用的,大家可以不用尝试了。

3、官方提供的 props

上一篇文章 微前端:qiankun的两种运作模式 介绍了qiankun 的两种运作模式,而这两种模式都提供了一个参数 props。

父传子微前端:qiankun的五种通信方式(微前端Qiankun介绍)

我们以一个例子来示范一下,这个例子是父应用把父路由的实例传递给子应用。

父应用:

import { registerMicroApps, start,} from "qiankun";import router from '@/router'const apps = [ { name: "App1MicroApp", entry: '//localhost:9001', container: "#app1", activeRule: "/app1", props: { parentRouter: router } }];registerMicroApps(apps);start();

子应用:

let instance = nulllet router = nullfunction render (props) { router = new VueRouter({ base: window.__POWERED_BY_QIANKUN__ ? '/app1' : '', mode: 'history', routes: routes }) instance = new Vue({ router, store, // 挂载在根节点上 data(){ return { parentRouter: props.parentRouter, } }, render: (h) => h(App) }).$mount('#app')}export async function mount(props) { render(props);}// 在子应用中使用就可以访问到这个parentRouter了this.$root.parentRouter子传父

同理,传进来一个函数或者对象等,子应用操作这个对象就是改变的父应用的状态。 类似 react 的通信方式。

4、官方提供的 actions

就一个 API initGlobalState(state) 参数:传入你维护的一个 state,类似 store 中的 state 返回:action 实例,并挂载了三个函数 1、onGlobalStateChange: (callback: OnGlobalStateChangeCallback, fireImmediately?: boolean) => void, 在当前应用监听全局状态,有变更触发 callback,fireImmediately = true 立即触发 callback

2、setGlobalState: (state: Record<string, any>) => boolean, 可以在应用中任何地方调用来修改全局状态,子应用想使用的话可以通过 props 把 action 传给子应用使用

3、offGlobalStateChange: () => boolean,移除当前应用的状态监听,微应用 umount 时会默认调用

父传子

主应用: src/micro/actions.ts

import { initGlobalState, MicroAppStateActions } from 'qiankun';const state = { num: 1};// 初始化 stateconst actions: MicroAppStateActions = initGlobalState(state);actions.onGlobalStateChange((state, prev) => { // state: 变更后的状态; prev 变更前的状态 console.log('主应用检测到state变更:', state, prev);});// 你还可以定义一个获取state的方法下发到子应用actions.getGlobalState = function () { return state}export default actions;

当然,父应用也可以自己通过这个 actions 来调用 setGlobalState 函数改变全局状态 state

src/micro/index.js

import { registerMicroApps, start,} from "qiankun";import actions from './actions'const apps = [ { name: "App1MicroApp", entry: '//localhost:9001', container: "#app1", activeRule: "/app1", props: { parentActions: actions } }];registerMicroApps(apps);start();

这样就把这个 actions 传给了子应用。

子应用:

let instance = nulllet router = nullfunction render (props) { router = new VueRouter({ base: window.__POWERED_BY_QIANKUN__ ? '/app1' : '', mode: 'history', routes: routes }) instance = new Vue({ router, store, // 挂载在根节点上 data(){ return { parentActions: props.parentActions, } }, render: (h) => h(App) }).$mount('#app')}export async function mount(props) { render(props);}// 在子应用中使用就可以访问到这个parentActions了this.$root.parentActions.setGlobalState({ num: 2 })// 调用挂载在 actions 上的自定义方法,获取当前的全局 statethis.$root.parentActions.getGlobalState()

我在子应用的 mounted 中把全局 state 的 num 设置了 2,就是如下效果。

子传父

上面例子其实已经都包括了。再总结一下就是:

父传子就是父应用通过 props 把 parentActions 传给子应用,子传父就是子应用接受到 parentActions 可以来改变父应用的状态。

5、shared 方案

这个方案我大概描述一下,就不写代码细讲了,因为和上面的方案很像。

就是父应用通过 vuex 或者 redux 正常使用维护一个 state,然后创建一个 shared 实例,这个实例提供对 state 的增删改查,然后通过 props 把这个 shared 实例传给子应用,子应用使用就行。

主应用: 这个 shared 实例大概就长这样:

// micro-app-main/src/shared/index.tsimport store from "./store";class Shared { /** * 获取 Token */ public getToken(): string { const state = store.getState(); return state.token || ""; } /** * 设置 Token */ public setToken(token: string): void { // 将 token 的值记录在 store 中 store.dispatch({ type: "SET_TOKEN", payload: token }); }}const shared = new Shared();export default shared;

同样的传入方式 src/micro/index.js

import { registerMicroApps, start,} from "qiankun";import shared from './shared'const apps = [ { name: "App1MicroApp", entry: '//localhost:9001', container: "#app1", activeRule: "/app1", props: { parentShared: shared } }];registerMicroApps(apps);start();

想要了解具体可以看这篇文章: https://cloud.tencent.com/developer/article/1770605

总结类似设置全局共享 token 就适合方案1每个页面要设置不同的title,可以用方案2在 url 上带上一个 title,这样父子应用都能监听到方案3则适合一些复杂一点的数据交互一般到方案3,就可以了,如果需要方案4了,就说明应用交流太频繁了,考虑是不是你们的应用拆分的有问题
本文链接地址:https://www.jiuchutong.com/zhishi/289642.html 转载请保留说明!

上一篇:YOLOv5部署到web端(flask+js简单易懂)(yolo部署到服务器)

下一篇:vue.config.js配置proxy代理解决跨越;proxy代理报404;(vueconfigjs配置proxy 无效)

  • 如何利用软文让你的产品广告上百度首页(如何利用软文让客户满意)

    如何利用软文让你的产品广告上百度首页(如何利用软文让客户满意)

  • 直播、语音、短视频、VR……体验时代,要如何做营销?(语音直播的一些术语)

    直播、语音、短视频、VR……体验时代,要如何做营销?(语音直播的一些术语)

  • 索爱w550详细测评(索爱w550)(索爱w550c)

    索爱w550详细测评(索爱w550)(索爱w550c)

  • 花呗自动扣款在哪里关(花呗自动扣款在哪里设置的)

    花呗自动扣款在哪里关(花呗自动扣款在哪里设置的)

  • 稻壳模板怎么免费去水印(稻壳有免费模板吗)

    稻壳模板怎么免费去水印(稻壳有免费模板吗)

  • 微信扫一扫黑屏权限正常(拍照正常微信扫一扫黑屏)

    微信扫一扫黑屏权限正常(拍照正常微信扫一扫黑屏)

  • 朋友圈分组会被发现吗(朋友圈分组被屏蔽的人能发现吗)

    朋友圈分组会被发现吗(朋友圈分组被屏蔽的人能发现吗)

  • 华为手机进水水印几天消失(华为手机进水水印要换膜吗)

    华为手机进水水印几天消失(华为手机进水水印要换膜吗)

  • 抖音去水印怎么弄(抖音去水印怎么去掉?微信小程序)

    抖音去水印怎么弄(抖音去水印怎么去掉?微信小程序)

  • 京东单单减最高99是什么意思(京东单单减最高299一般减多少)

    京东单单减最高99是什么意思(京东单单减最高299一般减多少)

  • 微信备注字数限制能改吗(微信备注有字数限制吗)

    微信备注字数限制能改吗(微信备注有字数限制吗)

  • 苹果id和icloud一样吗(苹果apple id和icloud)

    苹果id和icloud一样吗(苹果apple id和icloud)

  • 手机卡暂停服务了,交话费还能用吗(手机卡暂停服务可以恢复吗)

    手机卡暂停服务了,交话费还能用吗(手机卡暂停服务可以恢复吗)

  • 影视tv怎么下载了进不去

    影视tv怎么下载了进不去

  • b站永久封禁的账号还能用吗(b站永久封禁的手机号)

    b站永久封禁的账号还能用吗(b站永久封禁的手机号)

  • 大数据应用领域成就有哪些(下列哪些属于大数据应用领域)

    大数据应用领域成就有哪些(下列哪些属于大数据应用领域)

  • 手机qq恢复我的收藏(恢复qqcomqq)

    手机qq恢复我的收藏(恢复qqcomqq)

  • qq手机安全防护怎么开启(qq手机安全防护在哪里)

    qq手机安全防护怎么开启(qq手机安全防护在哪里)

  • 小米悬浮球有用吗(小米悬浮球开启了但不知道在哪里打)

    小米悬浮球有用吗(小米悬浮球开启了但不知道在哪里打)

  • 三星充电慢是怎么回事啊(三星充电太慢了)

    三星充电慢是怎么回事啊(三星充电太慢了)

  • 苹果怎么把视频私密(苹果怎么把视频变成gif)

    苹果怎么把视频私密(苹果怎么把视频变成gif)

  • word怎么调整页面大小(word怎么调整页边距)

    word怎么调整页面大小(word怎么调整页边距)

  • vivoz5x视频聊天怎么开(vivoz5视频聊天美颜设置)

    vivoz5x视频聊天怎么开(vivoz5视频聊天美颜设置)

  • 荣耀v20怎么清除后台程序(荣耀v20怎么清除缓存)

    荣耀v20怎么清除后台程序(荣耀v20怎么清除缓存)

  • 华为支持5g网络的手机(华为哪款手机支持5g)

    华为支持5g网络的手机(华为哪款手机支持5g)

  • 电脑显示器模糊了怎么办?(电脑显示器模糊不清晰是什么原因)

    电脑显示器模糊了怎么办?(电脑显示器模糊不清晰是什么原因)

  • [YOLOv7/YOLOv5系列算法改进NO.11]主干网络C3替换为轻量化网络MobileNetV3(yolov5m)

    [YOLOv7/YOLOv5系列算法改进NO.11]主干网络C3替换为轻量化网络MobileNetV3(yolov5m)

  • 城建税计算方法有哪些
  • 税控盘清卡失败
  • 改签费可以进项转出吗
  • 法人可以是办税人和发票领购人吗
  • 领取营业执照后30天内没做税务登记
  • 存根联给了客户怎么办
  • 备用金每个月可以用几次
  • 金税三期账号是自己申请吗
  • 救护车能随便买吗
  • 存货内部交易抵消通俗讲解
  • 计提坏账准备的做法体现了什么的信息质量要求
  • 税控盘会计处理
  • 购进原材料发生非正常损失,账面成本10万元 该原材料
  • 支付开票税款计入什么科目
  • 股东撤资退出的处理方式
  • 作为展示用的物品
  • 预交了一个季度的社保
  • 土地款印花税计入无形资产吗
  • 境外演艺经纪公司代扣代缴哪些税款?
  • 小规模纳税人定额发票累计领用金额
  • 对外工程承包企业
  • 知识产权支出
  • 贷款逾期账务处理流程
  • win7对话框文本框在哪里
  • 怎么升级鸿蒙系统3.1
  • php如何防止表单重复提交
  • 法人变更涉及到什么
  • 比较常见的病有哪些
  • 代扣代缴个人所得税怎么算
  • 在承租的土地上建房
  • 企业投资入股的几种方式
  • 定额征收怎么交税
  • php文件在线解密
  • linux命令tar zcvf
  • wind10待机唤醒
  • 装修费用账务怎么处理
  • 职工教育经费会计账务处理
  • 阳光照耀下的人
  • 文化建设事业费优惠政策
  • 库存现金月末怎么结转
  • 电力安装公司都有什么业务
  • php中的表达式简写是什么
  • 销售多余材料的收入属于收入吗
  • vue项目移动端怎么做适配
  • 归还本金和利息的分录
  • 前端搭建小人逃脱游戏(内附源码)
  • 如何更改telnet端口
  • wordpress mobile themes
  • 社会团体收取的会费是否缴纳企业所得税
  • 上个月没有开票需要清卡吗
  • 停车费报销怎么说委婉
  • 发票说明格式
  • 进项抵扣了还要交附加嘛
  • 本年利润和利润分配属于什么账户
  • 企业对公帐户怎么转出私人帐户
  • 公司对外投资企业与行政许可的区别是什么
  • 固定资产对外投资通过固定资产清理吗
  • 在建工程物资属于存货吗
  • 对于银行已入账企业未入账的未达账项应该
  • 货物赔偿款计入什么会计科目
  • 小规模纳税人增值税账务处理
  • 银行承兑到期后怎么兑现
  • win2008r
  • 蓝屏service
  • windowsserver2008密码规则
  • openssl安装教程
  • sysscjh.exe是什么文件
  • windows10如何多选文件
  • 狗刨好学吗
  • shell监控文件
  • js中的表达式是什么
  • 安卓手机自定义ua
  • python基础入门教程
  • python文件a
  • 股权转让申报期限
  • 税务局纳税服务中心
  • 税务局审计整改的信息
  • 车船税完税证明查询官网
  • 中国税务报订阅电话
  • 国税能级管理(国税局等级制度)
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设