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

郑州 外包网站沈阳营销网站建设

郑州 外包网站,沈阳营销网站建设,php 网站目录结构,找个人做网站的qiankun 作为流行的微前端解决方案,提供了多种子应用间通信的方式。以下是全面的通信方法总结: 1. 基于 props 的通信(主应用与子应用) 主应用向子应用传递数据: // 主应用注册子应用时传递数据 registerMicroApps(…

qiankun 作为流行的微前端解决方案,提供了多种子应用间通信的方式。以下是全面的通信方法总结:

1. 基于 props 的通信(主应用与子应用)

主应用向子应用传递数据

// 主应用注册子应用时传递数据
registerMicroApps([{name: 'subApp',entry: '//localhost:7100',container: '#subapp-container',activeRule: '/sub-app',props: {  // 通过props传递数据basePath: '/sub-app',globalState: mainAppState,onStateChange: (state) => { /* 回调函数 */ }}}
]);

子应用接收数据

// 子应用入口文件
export async function mount(props) {console.log(props.basePath); // 使用主应用传递的数据props.onGlobalStateChange((state, prevState) => {// 监听全局状态变化});
}

2. 全局状态管理(推荐方式)

使用 qiankun 的 initGlobalState

主应用初始化全局状态

// 主应用
import { initGlobalState } from 'qiankun';const initialState = { user: { name: 'Admin' } };
const actions = initGlobalState(initialState);// 监听状态变化
actions.onGlobalStateChange((state, prev) => {console.log('主应用观察到的状态变化:', state, prev);
});// 设置状态
actions.setGlobalState({ ...initialState, menu: ['home'] });

子应用使用全局状态

// 子应用
export function mount(props) {// 监听全局状态props.onGlobalStateChange((state, prev) => {console.log('子应用收到的状态:', state);}, true); // 第二个参数为是否立即触发// 更新全局状态props.setGlobalState({ user: { name: 'SubAppUser' } });
}

3. 自定义事件通信(EventBus 模式)

创建全局事件总线

// 主应用或公共文件
class EventBus {constructor() {this.events = {};}$on(event, callback) {if (!this.events[event]) this.events[event] = [];this.events[event].push(callback);}$emit(event, ...args) {(this.events[event] || []).forEach(cb => cb(...args));}
}// 挂载到全局
window.microFrontendEventBus = new EventBus();

子应用间通信

// 应用A发送事件
window.microFrontendEventBus.$emit('data-shared', { key: 'value' });// 应用B监听事件
window.microFrontendEventBus.$on('data-shared', (data) => {console.log('收到数据:', data);
});

4. 使用 Redux/Vuex 等状态管理库

共享 store 方案

// 主应用创建store并传递给子应用
const store = createStore(reducer, initialState);
registerMicroApps([{name: 'subApp',entry: '//localhost:7100',props: { store }
}]);// 子应用使用
export function mount({ store }) {store.subscribe(() => {console.log('状态变化:', store.getState());});store.dispatch({ type: 'UPDATE', payload: {} });
}

5. localStorage/sessionStorage 通信

// 应用A设置数据
localStorage.setItem('shared-data', JSON.stringify({ key: 'value' }));// 应用B监听变化
window.addEventListener('storage', (event) => {if (event.key === 'shared-data') {console.log('数据已更新:', JSON.parse(event.newValue));}
});

6. 使用 window 全局变量

// 主应用设置全局对象
window.__MAIN_APP_STATE__ = { token: 'abc123',updateToken: (newToken) => { /* ... */ }
};// 子应用访问
const token = window.__MAIN_APP_STATE__.token;
window.__MAIN_APP_STATE__.updateToken('newToken');

7. 使用 BroadcastChannel API(跨标签页通信)

// 所有应用中使用相同的channel名称
const channel = new BroadcastChannel('micro-frontend-channel');// 发送消息
channel.postMessage({ type: 'DATA_UPDATE', payload: {} });// 接收消息
channel.onmessage = (event) => {console.log('收到消息:', event.data);
};

8. 使用 postMessage(iframe 式通信)

主应用与子应用通信

// 主应用发送消息
window.postMessage({ type: 'FROM_MAIN', data: {} }, '*');// 子应用接收
window.addEventListener('message', (event) => {if (event.data.type === 'FROM_MAIN') {console.log(event.data.data);}
});

最佳实践建议

  1. 简单场景:使用 qiankun 内置的 initGlobalState 即可满足需求
  2. 复杂场景:推荐组合使用全局状态管理 + 自定义事件
  3. 安全考虑
    • 避免直接暴露修改全局状态的方法
    • 对通信数据进行校验
    • 使用命名空间避免冲突(如 __MAIN_APP__ 前缀)
  4. 性能优化
    • 避免高频通信
    • 对大体积数据考虑使用共享存储
  5. 类型安全(TypeScript 项目):
// 定义全局状态类型
interface GlobalState {user: {name: string;role: string;};token?: string;
}// 安全访问全局状态
if (window.__POWERED_BY_QIANKUN__) {const state = (props as { getGlobalState: () => GlobalState }).getGlobalState();
}

通信方式对比

方法适用场景优点缺点
props 传递主-子单向通信简单直接只能主传子,不能子传子
initGlobalState任意应用间通信官方推荐,内置支持需要手动管理状态变更
自定义事件任意应用间通信灵活,解耦需要自己实现事件管理
全局状态管理复杂状态共享专业状态管理增加复杂度
localStorage持久化数据共享简单,跨标签页数据类型受限,安全性问题
window 全局变量简单数据共享非常直接容易造成污染,不安全
BroadcastChannel跨标签页通信原生支持,高效兼容性考虑
postMessageiframe 式隔离环境安全隔离使用较复杂

选择通信方式时,应根据项目复杂度、团队技术栈和安全要求综合评估。对于大多数 qiankun 项目,组合使用 initGlobalState 和自定义事件通常是最佳选择。


文章转载自:

http://ZbfBiY5n.wjLhp.cn
http://KzP1b2Do.wjLhp.cn
http://QetMxwaO.wjLhp.cn
http://CQmG0Jnh.wjLhp.cn
http://vibuivSX.wjLhp.cn
http://lYdgU28G.wjLhp.cn
http://ZMSYOvmR.wjLhp.cn
http://Ky0a7U03.wjLhp.cn
http://mauRrSCz.wjLhp.cn
http://Iau2I9iE.wjLhp.cn
http://hSMxrvq2.wjLhp.cn
http://ceNhlyQn.wjLhp.cn
http://15i17FrX.wjLhp.cn
http://pXbYBx9t.wjLhp.cn
http://DH31L1dW.wjLhp.cn
http://YTnGrjeE.wjLhp.cn
http://dcDN3aax.wjLhp.cn
http://Q0nguS5e.wjLhp.cn
http://TcPOFEL7.wjLhp.cn
http://w6IUCAkL.wjLhp.cn
http://3d1gAxwM.wjLhp.cn
http://tPkF61ET.wjLhp.cn
http://FXtebio9.wjLhp.cn
http://CQUPcp2B.wjLhp.cn
http://MvzsjC2K.wjLhp.cn
http://7cfNvMXZ.wjLhp.cn
http://OGKmzXp9.wjLhp.cn
http://nb9nuex9.wjLhp.cn
http://rAwFhTXj.wjLhp.cn
http://2YPdrQKt.wjLhp.cn
http://www.dtcms.com/wzjs/606085.html

相关文章:

  • 自己建设网站需要花多少钱中国第一作文网官网
  • python django 做 网站建设网络平台费用
  • 网站建设详细的步骤有哪些品牌企业网站案例
  • 杭州模板建站定制制度建设对网站管理的重要性
  • 郑州免费建站鄂州网站建设哪家专业
  • 建设网站成都wordpress数据库密码错误
  • 不属于企业网站建设基本标准深圳外贸公司排名榜
  • 网站改版 请示山东卓创 网站建设
  • 网站备案和icp备案外国茶网站建设
  • 企业为什么要做建站音乐分享 wordpress
  • 怎么制作网站源码怎么在百度上建网站
  • 企业网站建设实训指导书所得税 网站建设费
  • php mysql 网站源码天元建设集团有限公司张桂玉丑闻
  • 建平台跟建网站网站建设模板怎么直接套
  • 重庆网站设计公司网站制作合肥网站制作套餐
  • 标杆网站建设东莞专业网站建设价格
  • 网站含中国的备案手机网站标准字体大小
  • 桂电做网站的毕设容易过嘛浙江省交通建设工程监督管理局网站
  • 江门网站建设php多语言网站怎么做
  • app那个网站开发比较好常见的软件开发工具
  • 网站建设客户需要提供什么网络编程就是做网站么
  • 广州网站关键词优化推广网站动效怎么做的
  • 快三竞猜网站建设小程序开发费用明细
  • 安徽网站建设费用郑州企业网站建站模板
  • 软件开发详细设计文档网站做优化好还是做推广好
  • 做网站按页面收费wordpress评论框提示
  • 网站模板登录模块wordpress改变上传目录权限
  • 重庆 网站 建设 公司网站定制文章列表项怎么做
  • 桂林景区网站策划工信部备案网站查
  • flask网站开发视频php网站带数据库