当前位置: 首页 > article >正文

qiankun自定义数据通信方案

  1. 监听初始推送一次
  2. 合并多次变更
  3. 自动回收副作用

dataBus.js

/* 
dataBus 单例
state
dispatch
forceDispatch
onListener @return offListner
offListner
initData
 */
import { reactive, watch } from 'vue'
import { tryOnBeforeUnmount } from '@vueuse/core'

let dataBus

function useTasks() {
  const tasks = new Set()

  function _runTasks() {
    tasks.forEach((task) => task())
  }

  function runTask(task) {
    tasks.add(task)
    Promise.resolve().then(() => {
      _runTasks()
      tasks.clear()
    })
  }
  return {
    runTask
  }
}

function createFactory(initialData = {}) {
  const state = reactive(initialData)
  const listeners = new Set()
  const { runTask } = useTasks()

  watch(
    () => state,
    () => {
      runTask(_exe)
    },
    { deep: true }
  )

  function _exe(newVal = state) {
    listeners.forEach((listener) => listener(newVal))
  }

  function dispatch(newState) {
    Object.assign(state, newState)
  }

  function forceDispatch(newState) {
    dispatch(newState)
    runTask(_exe)
  }

  function onListener(callback, initialPush) {
    listeners.add(callback)
    if (initialPush) runTask(_exe)
    const clean = offListner.bind(this, callback)
    tryOnBeforeUnmount(clean)
    return clean
  }

  function offListner(callback) {
    listeners.delete(callback)
  }

  dataBus = {
    state,
    dispatch,
    forceDispatch,
    onListener,
    offListner
  }
}

createFactory()

export function initData(initialData = {}) {
  const data = dataBus.state
  Object.keys(data).forEach(key => {
    delete data[key];
  });
  Object.assign(data, initialData)
}

export default dataBus

MicroApp.vue

import dataBus from '@/utils/dataBus'

onMounted(() => {
  if (window.registedMicroApps) return
  window.registedMicroApps = true
  registerMicroApps([
    {
      name: 'report',
      entry: 'http://localhost:8080',
      container: '.micro-app-container',
      activeRule: '/child/report',
      props: {
        dataBus,
      }
    }
  ])
  start({
    sandbox: {
      experimentalStyleIsolation: true
    }
  })
})

主应用使用例子1

import { initData } from '@/utils/dataBus'

initData({
  collapse: false
})

主应用使用例子2

<template>
	<div class="main-content">
		state.collapse: {{ state.collapse }}
		<el-radio-group v-model="state.collapse" style="margin-bottom: 20px" @change="handleSwichChange">
			<el-radio-button :value="false">expand</el-radio-button>
			<el-radio-button :value="true">collapse</el-radio-button>
		</el-radio-group>
		<RouterView />
	</div>
</template>

<script setup>
	import dataBus from '@/utils/dataBus'
	const { state } = dataBus
</script>

微应用main.js

async function render(props = {}) {
  const { container, dataBus } = props;

  window.$dataBus = dataBus;
}

微应用使用例子1

created() {
    if (window.$dataBus) {
      const { onListener } = window.$dataBus;
      onListener((data) => {
        console.log("data变化:", data);
        this.collapse = data.collapse;
      }, true);
    }
}

微应用使用例子2

const { state, forceDispatch, onListener } = window.$dataBus || {};

function toggle() {
  if (!window.$dataBus) return;
  forceDispatch({ collapse: !state.collapse });
}

http://www.kler.cn/a/326414.html

相关文章:

  • Linux下多线程
  • web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
  • 鸿蒙中如何实现图片拉伸效果
  • 【网络安全】网络安全防护体系
  • Python爬虫项目 | 一、网易云音乐热歌榜歌曲
  • JavaEE 重要的API阅读
  • Json files to Excel - Python
  • 【QT】QWidget 重要属性
  • Golang | Leetcode Golang题解之第435题无重叠区间
  • Qt开发第一讲
  • ip池子的大小与什么相关?
  • echarts 导出pdf空白原因
  • Spring系统学习(五)——Spring数据库编程
  • YOLOv8改进 | 主干改进篇,华为的轻量化架构GhostNetV2改进特征提取网络
  • 前端项目依赖包中的依赖包漏洞解决方案
  • springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)
  • 解决VRM格式模型在Unity中运行出现头发乱飞等问题
  • Java | Leetcode Java题解之第443题压缩字符串
  • ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!
  • 数据中心解决方案
  • 手写体识别毕设——人工智能和深度学习技术的快速发展
  • 前端安装 lerna
  • Knots_3D 9.3.0 一款教你绑绳结的手机应用
  • 高标准农田灌区信息化:为农业可持续发展注入新动力
  • 开源模型应用落地-qwen2.5-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(十八)
  • 抽象工厂模式和工厂模式的区别