ventDoc.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <div style="position: absolute; width: 100%; height: 100%">
  3. <a-spin class="loading-box" size="large" :spinning="loading" tip="正在加载,请稍等。。。" />
  4. </div>
  5. <MicroLoadError v-if="loadFailed" @retry="retryMount" />
  6. <div id="micro-vent-doc"></div>
  7. </template>
  8. <script lang="ts">
  9. import { ref, onMounted, onBeforeUnmount, defineComponent, unref } from 'vue';
  10. import { unmountMicroApps, mountMicroApp, activeApps } from '/@/qiankun';
  11. import { resetMicroContentWH } from '/@/utils/domUtils';
  12. import MicroLoadError from './MicroLoadError.vue';
  13. import { useErrorLogStoreWithOut } from '/@/store/modules/errorLog';
  14. import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
  15. export default defineComponent({
  16. name: 'VentDoc',
  17. components: { MicroLoadError },
  18. setup() {
  19. const loading = ref(true);
  20. // [SEC-20260913] 加载失败错误态:超时不再静默放行
  21. const loadFailed = ref(false);
  22. const startMount = () => {
  23. // 判断子应用是否存在,不存在注册
  24. // [fix-subapp-loading] try/finally 保证就绪等待始终启动(同 ventModal)
  25. try {
  26. mountMicroApp('micro-vent-doc');
  27. } finally {
  28. resetMicroContentWH(
  29. 'micro-vent-doc',
  30. () => {
  31. loading.value = false;
  32. },
  33. () => {
  34. loadFailed.value = true;
  35. // 失败埋点:复用既有 errorLog store
  36. useErrorLogStoreWithOut().addErrorLogInfo({
  37. type: ErrorTypeEnum.RESOURCE,
  38. file: 'components/vent/micro/ventDoc.vue',
  39. name: 'MicroApp Load Timeout',
  40. message: '子应用 micro-vent-doc 加载超时',
  41. detail: 'resetMicroContentWH 等待容器内容超时',
  42. });
  43. }
  44. );
  45. }
  46. };
  47. const retryMount = () => {
  48. loadFailed.value = false;
  49. loading.value = true;
  50. startMount();
  51. };
  52. onMounted(startMount);
  53. onBeforeUnmount(async () => {
  54. await unmountMicroApps(['micro-vent-doc']);
  55. });
  56. return { loading, loadFailed, retryMount };
  57. },
  58. });
  59. </script>
  60. <style lang="less" scoped>
  61. .loading-box {
  62. position: fixed;
  63. display: flex;
  64. align-items: center;
  65. justify-content: center;
  66. width: 100%;
  67. height: 100%;
  68. }
  69. #micro-vent-doc {
  70. position: absolute;
  71. left: 0;
  72. top: 0;
  73. width: 100%;
  74. height: 100%;
  75. pointer-events: auto;
  76. }
  77. </style>