react umi+qiankun 实现微前端 加载微应用、父子应用通信

1、安装依赖。

"devDependencies": {
   "@umijs/plugin-qiankun": "^2.40.0",
   "@umijs/preset-react": "^2.1.1",
   ...
}

2、微应用加载、注册

a. 父应用-----umirc.ts。还有一种运行时配置子应用方法。没写,试了报错。

import { defineConfig } from 'umi'

export default defineConfig({
  history: {
    type: 'browser',
  },
  /***********注册子应用*****************/
  qiankun: {
    master: {
      // 注册子应用信息
      sandbox: false,
      apps: [
        {
          name: 'app1',
          entry: 'https://XXXXXXXXXXXXXXXX',
          history: 'browser',
          props: {
          	// 可传入一些参数,在子应用生命周期函数的props参数中可以接收到
          }
        }
      ]
    }
  }
  /***********装载子应用,建议使用这种方式来引入自带路由的子应用*****************/
  routes: [
  	{
  		path: '/',
  		component: '@/layout',
  		routes: [
  			name: '子应用1',
  			path: '/app1',
  			microApp: 'app1',
  			// 子应用路由
  			routes: [
  				{
                  name: '详情',
                  path: '/app1/approval'
                },
                {
                  name: '待办',
                  path: '/app1/approval/todo',
                  hideInMenu: true,
                  showBackBtn: true,
                  rootMenuPath: '/app1/approval',
                }
  			]
  		]
	}
  ]
})

b. 子应用-----umirc.ts

import { defineConfig } from 'umi'

export default defineConfig({
  history: {
    type: 'browser',
  },
  //开启qiankun配置
  qiankun: {
    slave: {}
  },
  routes: [...]
})

子应用-----app.js,配置运行时生命周期钩子,可选

export const qiankun = {
  // 应用加载之前
  async bootstrap(props) {
    console.log('app1 bootstrap', props);
  },
  // 应用 render 之前触发
  async mount(props) {
    console.log('app1 mount', props);
  },
  // 应用卸载之后触发
  async unmount(props) {
    console.log('app1 unmount', props);
  }
}

3、父子应用通信(需确保已安装 @umijs/plugin-model 或 @umijs/preset-react)

a. 父应用—app.ts,导出一个 useQiankunStateForSlave 函数

import { useState } from 'react'

export function useQiankunStateForSlave() {
  const [campusId, setCampusId] = useState('')
  const [appId, setAppId] = useState('Scholar')
  return { campusId, setCampusId, appId, setAppId}
}

在系统任意需要修改变量值的文件里

import { useModel } from "umi"

const Test = (props) => {
	const { setCampusId, setAppId } = useModel('@@qiankunStateForSlave')

	const changeParams = () => {
		setCampusId('1005')
		setAppId('sean')
	}
}
export default Test

b. 子应用—合适的文件

import { useModel } from 'umi';

const Layout = (props) => {
	const  { dispatch } = props
	
	const initParams = () => {
		const masterProps = useModel('@@qiankunStateFromMaster')
		const { campusId, appId } = masterProps
		// 可以将参数存在 window.sessionStorage 中
		appId && sessionHelper.setAppId(appId)
   		campusId && sessionHelper.setCampusId(campusId)
   		// 父应用传参变化时,子应用需要刷新数据,所以使用到了dispatch
		dispatch({
	      type: 'user/saveParamsInfo',
	      campusId,
	      appId,
	    })
	}
}

export default layout
// 业务界面监听示例
const FormCategory = (props) => {
	const { campusId, appId } = props
	useEffect(() => {
		handleRefresh()
	}, [campusId, appId])
}

export default connect(({ user }) => ({
  campusId: user.paramsInfo.campusId,
  appId: user.paramsInfo.appId
}))(FormCategory);

没有啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值