i @micro-zoe/micro-app --save
2.在入口文件 中引入
import microApp from '@micro-zoe/micro-app'
()异步函数
importModule
来导入图标字体样式表,避免可能的样式冲突。之后判断是否在微信小程序基座下运行。如果不在基座下运行则导入模块。如果在基座下运行,则会添加一个数据监听器,监听基座下发的数据变化。当数据中的
path
字段发生变化时(即用户可能需要跳转到新的页面),就会通过方法进行页面跳转。
async function importModule() {
const module = await import('./iconfont/');
return module;
}
let oldPath = null;
if (!window.__MICRO_APP_BASE_ROUTE__) {
importModule();
} else {
// 监听基座下发的数据变化
((data) => {
// 当基座下发跳转指令时进行跳转
if ( && !== oldPath) {
oldPath = ;
({path:, query:});
}
});
}
4 路由配置
//router import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router"; const routes: Array<RouteRecordRaw> = [ { path: "/", name: "home", component: () => import("@/components/"), children: [ { path: "/", name: "hello", component: () => import("@/views/"), }, // react-app 子应用路由 { path: "/reactApp/:page*", name: "reactApp", component: () => import("@/views/MicroApp/"), }, ], }, ]; const router = createRouter({ history: createWebHistory(window.__MICRO_APP_BASE_ROUTE__ ||.BASE_URL), routes, }); const microPushAndReplace= (target, prop) => { return (to) => { if (window.__MICRO_APP_ENVIRONMENT__) { // 判断处于微前端环境 const baseRouter = ().router; // 获取主应用路由 let microPath = ''; if (typeof to === 'string') { } else if (typeof to === 'object' && ) { } else if (typeof to === 'object' && ) { } target[prop](to); setTimeout(() => { ({ path: microPath, query: , }); }, 0); } else { return target[prop](to); } }; }; // 代理router,拦截push和replace方法,如果是微前端环境则触发主应用跳转 const routerProxy = new Proxy(router, { get(target, prop, receiver) { if (prop === 'push' || prop === 'replace') { return microPushAndReplace(target, prop); } return (target, prop, receiver); }, }); export default routerProxy; export default router;
5接入子应用
//也可以在 通过 = window.__MICRO_APP_ENVIRONMENT__;区分子应用
<router-view v-slot="{ Component }" v-if=“isMicroApp”> <!-- 微前端的默认缓存 --> <keep-alive><component :is="Component" /></keep-alive> </router-view> setup() { const isMicroApp = ref(false); //获取url路径判断是否隐藏页签(1) const hideMenu = ('hideMenu') === 'true'; onMounted(() => { = window.__MICRO_APP_ENVIRONMENT__; const DefaultSystem = getLocal(`#项目标识1#/${}`) || {}; if ((DefaultSystem) === '{}' && !hideMenu) { } // hideMenu 隐藏菜单,顶部栏 if (hideMenu) { ('.app-header'). = 'none'; ('.app-side'). = 'none'; } }); const aiUrl = ; const keepLive = computed(() => { return ;//获取路由页签 }); return { aiUrl, locale, keepLive, hideMenu, warehouseChange, lotsHeader, isMicroApp, }; },
//可以新建vue文件
// <h1>react-app 子应用</h1> // <!-- name(必传):应用名称 // url(必传): 应用地址 // baseroute(可选):基座应用分配给子应用的基础路由 <template> <micro-app name="react-app" url="http://localhost:3000/" baseroute="/reactApp" ></micro-app> </template>
//6.在路由或者登录页面获取相关系统信息存在store
export default { state: { user: {}, authority: '', appId: , currentTenant: {}, currentWarehouse: {}, ..., ..., }, getters: { user: state => , appId: state => , authority: state => , menus: state => { if () { return ; } return []; }, lang: state => , locale: state => , langInfo: state => , isShowLang: state => , tenantInfo: state => , currentTenant: state => , currentWarehouse: state => , applicationCode: state => { const currentPath = (item => { if () { return () >= 0; } return false; }); return currentPath ? : ''; }, supplier: state => , ..., ..., ..., ..., ..., }, mutations: { updateUserInfo(state, user) { = user; }, updateAuthority(state, authority) { = authority; }, updateTenant(state, _tenantInfo) { = _tenantInfo; }, ..., ..., ..., ..., ..., }, actions: { initTenantsData({ dispatch, commit }) { }, initMicro({ commit }) { const data = (); commit('updateUserInfo', ); commit('updateTenant', ); commit('updateCurrentWarehouse', ); }, initSources({ commit, state }) { const applicationCode = ''; commit('updateCurrentApplicationCode', applicationCode); }, ..., ..., ..., ..., }, };
一、 基座应用向子应用发送数据
方式1:通过 data 属性发送数据
<template>
<micro-app
name='appname-vue3'
:url='url'
baseroute='/app-vue3'
:data='microAppData' // data只接受对象类型,数据变化时会重新发送
/>
</template>
<script>
export default {
name: 'vue3',
data () {
return {
url: 'http://localhost:4009/',
microAppData: {msg: '来自基座的数据'}
}
},
methods: {
initPage() {
('report', { path: this.$ });
const {
user,
appId,
authority,
} = this;
= {
user,
authority,
};
},
},
watch: {
$route() {
();
},
immediate: true,
},
mounted() {
();
},
}
</script>
方式2:手动发送数据
手动发送数据需要通过 name 指定接受数据的子应用,此值和 <micro-app> 元素中的 name 一致。
import microApp from '@micro-zoe/micro-app'
// 发送数据给子应用 appname-vue3,setData第二个参数只接受对象类型
('appname-vue3', {msg: '新的数据'})
二、子应用获取来自基座应用的数据
micro-app 会向子应用注入名称为 microApp 的全局对象,子应用通过这个对象和基座应用进行数据交互。
方式1:直接获取数据
const data = () // 返回基座下发的data数据
方式2:绑定监听函数
function dataListener (data) {
('来自基座应用的数据', data)
}
/**
* 绑定监听函数,监听函数只有在数据变化时才会触发
* dataListener: 绑定函数
* autoTrigger: 在初次绑定监听函数时如果有缓存数据,是否需要主动触发一次,默认为false
* !!!重要说明: 因为子应用是异步渲染的,而基座发送数据是同步的,
* 如果在子应用渲染结束前基座应用发送数据,则在绑定监听函数前数据已经发送,在初始化后不会触发绑定函数,
* 但这个数据会放入缓存中,此时可以设置autoTrigger为true主动触发一次监听函数来获取数据。
*/
(dataListener: Function, autoTrigger?: boolean)
// 解绑监听函数
(dataListener: Function)
// 清空当前子应用的所有绑定函数(全局数据函数除外)
()
三、子应用向基座应用发送数据
// dispatch只接受对象作为参数
({type: '子应用发送的数据'})
四、基座应用获取来自子应用的数据
方式1:直接获取数据
import microApp from '@micro-zoe/micro-app'
const childData = (appName) // 返回子应用的data数据
方式2:监听自定义事件 datachange
<template>
<micro-app
name='appname-vue3'
:url='url'
baseroute='/app-vue3'
:data='microAppData' // data只接受对象类型,数据变化时会重新发送
@datachange='handleDataChange' // 数据在事件对象的 字段中,子应用每次发送数据都会触发 datachange
/>
</template>
<script>
export default {
name: 'vue3',
data () {
return {
url: 'http://localhost:4009/',
microAppData: {msg: '来自基座的数据'}
}
},
methods: {
handleDataChange (e) {
('来自子应用的数据:', )
}
}
}
</script>
方式3: 绑定监听函数
import microApp from '@micro-zoe/micro-app'
function dataListener (data) {
('来自子应用的数据', data)
}
/**
* 绑定监听函数
* appName: 应用名称
* dataListener: 绑定函数
* autoTrigger: 在初次绑定监听函数时如果有缓存数据,是否需要主动触发一次,默认为false
*/
(appName: string, dataListener: Function, autoTrigger?: boolean)
// 解绑监听my-app子应用的函数
(appName: string, dataListener: Function)
// 清空所有监听appName子应用的函数
(appName: string)
五、全局数据通信
全局数据通信会向基座应用和所有子应用发送数据,在跨应用通信的场景中适用。
1、发送全局数据
基座应用:
import microApp from '@micro-zoe/micro-app'
// setGlobalData只接受对象作为参数
({type: '全局数据'})
子应用:
// setGlobalData只接受对象作为参数
({type: '全局数据'})
2、获取全局数据
基座应用:
import microApp from '@micro-zoe/micro-app'
// 直接获取数据
const globalData = () // 返回全局数据
function dataListener (data) {
('全局数据', data)
}
/**
* 绑定监听函数
* dataListener: 绑定函数
* autoTrigger: 在初次绑定监听函数时如果有缓存数据,是否需要主动触发一次,默认为false
*/
(dataListener: Function, autoTrigger?: boolean)
// 解绑监听函数
(dataListener: Function)
// 清空基座应用绑定的所有全局数据监听函数
()
子应用:
// 直接获取数据
const globalData = () // 返回全局数据
function dataListener (data) {
('全局数据', data)
}
/**
* 绑定监听函数
* dataListener: 绑定函数
* autoTrigger: 在初次绑定监听函数时如果有缓存数据,是否需要主动触发一次,默认为false
*/
(dataListener: Function, autoTrigger?: boolean)
// 解绑监听函数
(dataListener: Function)
// 清空当前子应用绑定的所有全局数据监听函数
()