使用wujie微前端,主子应用都是vue+vite:实现localStorage隔离,解决子应用使用vite时样式丢失问题,解决子应用element-plus悬浮组件(日期框、下拉框)计算偏移量错误

主应用安装wujie

wujie有专门封装vue、react的组件,直接安装组件使用

npm i -s wujie-vue2

main.js

import WujieVue from 'wujie-vue2';
Vue.use(WujieVue);

主体布局中使用全局组件
currentRouterName是子应用的url地址
showWuJie是判断是嵌入的子应用页面时才进行显示
plugins是对子应用直接进行一些改造,且不需要去子应用中修改
props是传递给子应用的参数

 <WujieVue
        height="100%"
        name="vue2"
        :url="currentRouterName"
        :plugins="plugins"
        v-show="showWuJie"
        :props="{ userInfo, token }"></WujieVue>

使用插件解决问题:一、解决子应用使用vite时样式丢失问题;二、解决子应用组件库element-plus悬浮组件(日期框、下拉框)计算偏移量错误问题

 plugins: [
        {
          // 解决子应用使用vite时样式丢失问题 
          // https://github.com/Tencent/wujie/issues/434#issuecomment-1614089196
          patchElementHook(element, iframeWindow) {
            if (element.nodeName === 'STYLE') {
              element.insertAdjacentElement = function (_position, ele) {
                iframeWindow.document.head.appendChild(ele);
              };
            }
          },
        },
        {
          // 在子应用所有的css之前,为子应用插入样式
          cssBeforeLoaders: [
            // 强制使子应用body定位是relative
            { content: 'body{position: relative !important}' },
            // 解决子应用高度问题
            { content: 'html{height: 100%}' },
            { content: 'body{height: 100%}' },
            { content: '#app{height: 100%}' },
          ],
        },
        {
          // 解决子应用计算偏移量错误问题
          jsLoader: (code) => {
            // 替换popper.js内计算偏左侧偏移量
            var codes = code.replace(
              'left: elementRect.left - parentRect.left',
              'left: fixed ? elementRect.left : elementRect.left - parentRect.left'
            );
            // 替换popper.js内右侧偏移量
            return codes.replace(
              'popper.right > data.boundaries.right',
              'false'
            );
          },
        },
      ],

解决主子应用localStorage隔离问题

在主应用中重写localStorage函数,为localStorage加入前缀,因为主子应用共用的都是主应用的window,主应用中调用一下即可
这里我取得是window.location.pathname,根据个人需求自行更改

    // 隔离localstorage
    const originalSetItem = window.localStorage.setItem;
    const originalGetItem = window.localStorage.getItem;
    // 不需要添加前缀的白名单存储键
    const whiteStorage = ['core_platform_user_information'];
    window.localStorage.setItem = function (key, value) {
      originalSetItem.call(
        window.localStorage,
        whiteStorage.includes(key) ? key : window.location.pathname + '_' + key,
        value
      );
    };
    window.localStorage.getItem = function (key) {
      return originalGetItem.call(
        window.localStorage,
        whiteStorage.includes(key) ? key : window.location.pathname + '_' + key
      );
    };
    window.localStorage.clear = function () {
      for (let i = 0; i < localStorage.length; i++) {
        const key = localStorage.key(i);
        if (
          key.startsWith(window.location.pathname) ||
          whiteStorage.includes(key)
        ) {
          localStorage.removeItem(key);
        }
      }
    };

需要共享给子应用的数据使用wujie的props传参

子应用接收传参,然后自己存起来

 created() {
    // 父应用props传参
    localStorage.setItem(
      'core_platform_user_information',
      JSON.stringify(window.$wujie?.props?.userInfo)
    );
    localStorage.setItem('token', window.$wujie?.props?.token);
    console.log('子应用获取父应用通信传参', window.$wujie?.props?.userInfo, window.$wujie?.props?.token);
  },
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue 3 和 wujie 前端中,`destroySubApp` 方法的使用方法如下: 1. 首先,在主应用中,通过 `app.config.globalProperties` 添加一个全局方法 `destroySubApp`,用于销毁应用。比如: ```javascript app.config.globalProperties.destroySubApp = function(appName) { // 销毁应用的逻辑代码 // appName 是应用的名称,用于标识需要销毁的应用 } ``` 2. 在主应用的路由守卫或其他需要销毁应用的地方,调用 `destroySubApp` 方法。传入应用的名称作为参数,以标识需要销毁的应用。比如: ```javascript router.beforeEach((to, from, next) => { // 判断当前页面是否需要销毁应用 if (to.meta.destroySubApp) { app.config.globalProperties.destroySubApp(to.meta.appName); } next(); }); ``` 3. 在应用中,通过 `import { createApp } from 'vue'` 导入 Vue 3 的 `createApp` 方法。 4. 在应用中,创建一个全局的 Vue 实例,并将其赋值给一个变量,比如 `const app = createApp(App)`,其中 `App` 是应用的根组件。 5. 在应用中,通过 `app.mount` 方法将根组件挂载到 DOM 中。应用的启动和销毁逻辑可以在这里实现。 通过以上步骤,当需要销毁指定应用,在主应用中调用 `destroySubApp` 方法,并传入应用的名称作为参数。在应用中,可以在挂载和销毁阶段实现相应的逻辑。请根据你的具体需求,替换代码中的注释部分以实现应用的销毁操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值