qiankun微前端主应用向子应用共享的数据没有实时更新解决

问题:

主应用通过props将store里的数据传给子应用,包括userName、token等信息;偶然会出现一个问题,通过登录页面登录系统,子应用没有及时的拿到主应用最新登录的token,当点击菜单加载子应用时,子应用请求的接口传的token还是上一次登录记录的已经失效的token,导致直接返回登录页面。

有问题的代码:

micro.js

import { registerMicroApps, start,initGlobalState } from "qiankun";
import store from "@/store";
registerMicroApps(
  [
    //需要保证 activeRule 和 entry 不同
    {
      name: "microApp1", // 子应用1
      entry: "http://localhost:9007",
      container: "#panelContainer",
      activeRule: "/micro-app1",
      props: {
        actions: initGlobalState(store.state.user)
      }
    },
    {
      name: "microApp2", // 子应用2
      entry: "http://localhost:9008",
      container: "#panelContainer",
      activeRule: "/micro-app2",
      props: {
        actions: initGlobalState(store.state.user)
      }
    },
    {
      name: "microApp3", // 子应用3
      entry: "http://localhost:9009",
      container: "#panelContainer",
      activeRule: "/micro-app3",
      props: {
        actions: initGlobalState(store.state.user)
      }
    }
  ],
  ......
  );
  export default start;

解决:

用一个方法返回props的值,确保在登录后加载页面时才获取到props的值,而不是在一开始加载静态文件时就加载了props的值,导致store的数据不是最新的。

micro.js

import { registerMicroApps, start,initGlobalState } from "qiankun";
import store from "@/store";
registerMicroApps(
  [
    //需要保证 activeRule 和 entry 不同
    {
      name: "microApp1", // 子应用1
      entry: "http://localhost:9007",
      container: "#panelContainer",
      activeRule: "/micro-app1",
      props: () => ({
        actions: initGlobalState(store.state.user)
      })
    },
    {
      name: "microApp2", // 子应用2
      entry: "http://localhost:9008",
      container: "#panelContainer",
      activeRule: "/micro-app2",
      props: () => ({
        actions: initGlobalState(store.state.user)
      })
    },
    {
      name: "microApp3", // 子应用3
      entry: "http://localhost:9009",
      container: "#panelContainer",
      activeRule: "/micro-app3",
      props: () => ({
        actions: initGlobalState(store.state.user)
      })
    }
  ],
  ......
  );
  export default start;

home.vue (引入micro.js的页面)

<template>
  <div id="panelContainer" :style="panelStyle"></div>
  <router-view></router-view>
</template>
<script setup>
import { onMounted, computed } from "vue";
import start from "../micro";
import store from "@/store";
onMounted(() => {
    if (!window.qiankunStarted) {
      window.qiankunStarted = true;
      start();
    }
  }
});
const panelStyle = computed(() => ({
     "min-width": store.state.user.toggle ? "1080px" : "1248px"
  })
);
</script>
<style lang="less" scoped>
#panelContainer {
  width: 100%;
  height: 100%;
}
</style>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值