首页 > 其他分享 >微前端qiankun框架子应用主和应用之间通信方法

微前端qiankun框架子应用主和应用之间通信方法

时间:2024-03-14 09:44:39浏览次数:23  
标签:vue onGlobalStateChange actions qiankun state 应用 全局 主和

子应用主应用间如何通信

qiankun官方提供了actions通信,qiankun内部使用initGlobalState(state)定义全局状态,该方法执行后返回一个MicroAppStateActions实例,实例中包含三个方法,分别是onGlobalStateChange、setGlobalState、offGlobalStateChange。

MicroAppStateActions
onGlobalStateChange: (callback: OnGlobalStateChangeCallback, fireImmediately?: boolean) => void //在当前应用监听全局状态,有变更触发 callback,fireImmediately = true 立即触发 callback
setGlobalState: (state: Record<string, any>) => boolean, //按一级属性设置全局状态,微应用中只能修改已存在的一级属性(就是用来修改全局状态的
offGlobalStateChange: () => boolean  //移除当前应用的状态监听,微应用 umount 时会默认调用
  • 1
  • 2
  • 3
  • 4

实战:父子应用之间相互通信:

==第一步:==首先需要在父应用中使用initGlobalState设置全局状态actions并导出供其他组件使用。

src/action.js:

// 此action文件为定义微应用之间全局状态
// 引入qiankun的应用间通信方法initGlobalState
import { initGlobalState, MicroAppStateActions } from 'qiankun'

const initialState = {
// 这里可以写初始化数据

}
const actions = initGlobalState(initialState) //初始化state

// 监听actions全局公共状态数据的变化
actions.onGlobalStateChange((state, prevState) => {
console.log("主应用变更前:", prevState);
console.log("主应用变更后:", state);
this.$store.commit("setProject", state) //将获取的最新的公共状态保存到vuex中
})

export default actions

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

==第二步:==然后在main.js中引入actions实例并在注册子应用时通过props传递全局状态actions:

main.js

// 注册的应用列表
const apps = [
  // 子应用vue应用
  {
    name: 'vueApp',  //应用名字
    // 默认请求的url,并解析里面的js,因为此时父应用请求了子应用里面的资源,所以子应用必须支持跨域
    entry: "http://localhost:8001",
    //容器名,子应用挂载到哪个元素
    container: "#container",
    //路由匹配激活规则,当路由匹配到activeRule时,就会请求获取entry资源,然后渲染到container容器中
    activeRule: '/vue',
    // 通过props实现通信传递值
    props: { actions, msg: "w" }   //向子应用传递创建的全局状态
  }
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

第三步:

主应用中的组件要修改全局状态actions,就在此组件中引入actions实例

Home.vue:

<template>
  <div class="home">
    <button @click="handle1">点击向子应用发送消息</button>
    <button @click="handle2">点击向子应用发送消息</button>
    <p>当前显示的项目:{{ project }}</p>
  </div>
</template>

<script>
import HelloWorld from "@/components/HelloWorld.vue"; //引入的HelloWorld组件
import actions from "../action";

export default {
name: "Home",
data() {
return {
mes1: {
project_id: "项目1",
},
mes2: {
project_id: "项目2",
},
};
},
computed: {
project() {
return this.$store.state.project_id;
},
},
mounted() {
// 需要在mounted钩子函数中注册qiankun的观察者函数
// 注册一个观察者函数
// 一旦修改actions的内容就会触发这个onGlobalStateChange监听函数
actions.onGlobalStateChange((state, prevState) => {
// state为变更后的状态,prevState为变更前的状态
console.log("主应用观察者,改变前的state为:", prevState);
console.log("主应用观察者,改变后的state为:", state);
});
},
methods: {
handle1() {
actions.setGlobalState(this.mes1); //修改全局的actions
this.$router.push("/vue"); //跳转到vue子应用中
},
handle2() {
actions.setGlobalState(this.mes2); //修改全局的actions
this.$router.push("/vue"); //跳转到vue子应用中
},
},

components: {
HelloWorld, //注册组件
},
};
</script>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

第四步:配置子应用的全局状态Actions,子应用中的全局状态必须要跟主应用中的全局状态变量属性名相同,比如主应用中全局状态变量为{project_id: “项目2”},则子应用中也需要保证在setGloabalState时也需要设定相同的变量名。

先在子应用中配置一个空的actions实例为以后重新赋值从主应用中传递过来的actions:

actions.js

function emptyAction() {
    // 警告:提示当前使用的是空 Action
    console.warn("Current execute action is empty!");
}

// 我们首先设置一个用于通信的Actions类

class Actions {
actions = {
onGlobalStateChange: emptyAction,
setGlobalState: emptyAction
}
constructor() {

<span class="token punctuation">}</span>
<span class="token comment">// 默认值为空Action</span>

<span class="token comment">// 设置actions</span>
<span class="token function">setActions</span><span class="token punctuation">(</span><span class="token parameter">actions</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>actions <span class="token operator">=</span> actions
<span class="token punctuation">}</span>

<span class="token comment">// 映射</span>
<span class="token function">onGlobalStateChange</span><span class="token punctuation">(</span><span class="token parameter"><span class="token operator">...</span>args</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>actions<span class="token punctuation">.</span><span class="token function">onGlobalStateChange</span><span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token comment">// 映射</span>
<span class="token function">setGlobalState</span><span class="token punctuation">(</span><span class="token parameter"><span class="token operator">...</span>args</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>actions<span class="token punctuation">.</span><span class="token function">setGlobalState</span><span class="token punctuation">(</span><span class="token operator">...</span>args<span class="token punctuation">)</span>
<span class="token punctuation">}</span>

}

const actions = new Actions()
export default actions

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

然后在mounted的生命周期里注入actions实例:

main.js

function render(props) {
  if (props) {
    actions.setActions(props)
  }
  const { container } = props
  // 渲染的时候赋值
  instance = new Vue({
    router,
    store,
    render: h => h(App)
  }).$mount(container ? container.querySelector("#app") : '#app') //这里是挂载到自己的html中,基座会拿到这个挂载后的html,将其插入进去
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

子应用向主应用发送数据(子应用中修改数据,可以在主应用中监听到)

子应用的组件Home.vue:

<template>
  <div class="home">
    <button @click="handle">快点我向父应用发送数据</button>
    <p>{{ msg }}</p>
    <img alt="Vue logo" src="../assets/logo.png" />
    <HelloWorld msg="Welcome to Your Vue.js App" />
  </div>
</template>

<script>
// @ is an alias to /src
import HelloWorld from "@/components/HelloWorld.vue";
import actions from "../actions";
export default {
name: "Home",
data() {
return {
msg: "2",
};
},
mounted() {
// console.log("cccc");
// console.log(actions);
actions.onGlobalStateChange((state) => {
console.log("我是子应用,我检测到数据了:", state);
this.msg = state;
}, true); //onGlobalStateChange的第二个参数设置为true,则会立即触发一次观察者函数
},
methods: {
handle() {
actions.setGlobalState({ project_id: "项目520" });
},
},

components: {
HelloWorld,
},
};
</script>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

标签:vue,onGlobalStateChange,actions,qiankun,state,应用,全局,主和
From: https://www.cnblogs.com/mounterLove/p/18070495

相关文章

  • 一致性哈希算法及其在分布式系统中的应用
    摘要本文将会从实际应用场景出发,介绍一致性哈希算法(ConsistentHashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算......
  • AI在商业逻辑应用中的革命性作用
    在今天的商业环境中,我们面临着一系列复杂且瞬息万变的问题。从最初的业务点子产生,到方案的落地实施,每一个环节都充满了不确定性。传统的商业逻辑构建方式,往往耗时耗力,而且容易因为人的主观因素导致效率低下或偏离初衷。然而,随着人工智能(AI)的快速发展,它在商业逻辑应用中的作用日......
  • 浅谈容斥原理在计数中的应用
    基本容斥[ABC066D]11首先如果没有重复的数,答案肯定是\(C_n^k\)。考虑如何加入有重复的数这一性质。不难想到用容斥思想,减去重复的部分。那么考虑那些数列可能会重复:显然如果\(x\)出现了两次并且分别出现在\(y1\),\(y2\),那么重复了的数列中一定不会出现下标在\((y1,y2-1)......
  • 鸿蒙应用开发-基础动画实战
    在移动互联网时代,App的使用体验非常重要,比如布局的变化、页面的切换、弹窗的显示和隐藏都要是平顺的,丝滑的,这就需要用到动画。鸿蒙提供了很多种动画的方式,今天为大家一一分享。布局更新动画尺寸、位置等的变化都属于布局更新,鸿蒙提供了属性动画和显示动画两种方式。下面通过......
  • PHP立体安全攻击向量:保护应用程序的关键挑战
    PHP立体安全攻击向量:保护应用程序的关键挑战PHP作为一种广泛使用的服务器端脚本语言,拥有庞大的用户群体和丰富的生态系统。然而,随着互联网的发展,网络安全问题也变得愈发严重。本文将深入探讨PHP的立体安全攻击向量,分析其原理和可能的应对策略,帮助开发者了解并应对这些潜在威......
  • 实验一_C语言输入输出和简单程序应用编程实验报告
    实验任务一task1_1 1#include<stdio.h>2#include<stdlib.h>3intmain()4{5printf("0\n");6printf("<H>\n");7printf("II\n");8printf("0\n");9printf(&qu......
  • # Java网络编程入门与实践:构建简单的Socket通信应用
    导言随着互联网的不断发展,网络编程在软件开发领域中变得愈发重要。本文将引导您进入Java网络编程的世界,通过简单而实用的Socket通信实例,帮助您理解网络编程的基本概念和技术。让我们一起动手,构建一个简单的客户端-服务器应用程序,并进行实际的编码练习。1.Java网络编程基......
  • tomcat中虚拟主机以及web应用程序的配置
    一:新建虚拟主机1.在tomcat里新建文件夹myapps,在里面添加ROOT文件,放入网站的首页文件新建文本文档,输入你想要的内容我这里的内容是TOM.AI,把文本文档的名字改成index.htm2.server.xml下每个host节点就代表一个主机,相当于一个网站。用记事本打开tomcat的conf下的server.xml文......
  • 实验1_C语言输入输出和简单程序应用编程实验报告
    实验任务一1.task1_1点击查看代码#include<stdio.h>#include<stdlib.h>intmain(){ printf("0\n"); printf("<H>\n"); printf("II\n"); printf("0\n"); printf("<H>\n"); printf(&quo......
  • 【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis serv
    问题描述在AKSPod中连接AzureRedis服务,大概率出现连接不上的问题。大多数的错误为 RedisConnectionException:UnabletoconnecttoRedisserver:xxxxxxxxx.redis.cache.chinacloudapi.cn/52.xxx.xxx.xxx:6380,但是有时候的错误信息为: RedisConnectionException:Unable......