router-shell.tsx 1.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
import { defineComponent, getCurrentInstance, ref } from 'vue';
import { ModelUtil } from '@ibiz-template/model';
import {
  IRouteViewData,
  parseRouteViewData,
  useRoute,
  useRouter,
} from '@ibiz-template/vue-util';
import { Route } from 'vue-router';

export default defineComponent({
  name: 'RouterShell',
  props: {
    level: {
      type: Number,
      default: 0,
    },
  },
  setup(props, ctx) {
    const { proxy } = getCurrentInstance()!;
    const route = useRoute(proxy) as Route;
    const router = useRouter(proxy);
    const viewData = ref<IRouteViewData>({});
    const isLoaded = ref(false);

    // 根据应用模型解析视图参数
    ModelUtil.getModelService().then(async service => {
      const appModel = service.app;
      if (appModel) {
        // 获取视图
        try {
          viewData.value = parseRouteViewData(appModel, route, props.level);
          // 确定视图组件
          isLoaded.value = true;
          ctx.emit('viewFound', { modelPath: viewData.value.viewPath });
        } catch (error) {
          router.replace(`/${route.params.view1}/404`);
        }
      }
    });

    // 视图初始化事件,往上抛
    const onNeuronInit = (...args: IData[]) => {
      ctx.emit('neuronInit', ...args);
    };
    return {
      route,
      viewData,
      isLoaded,
      onNeuronInit,
    };
  },
  render(h) {
    if (!this.isLoaded) {
      return null;
    }
    return h('ViewShell', {
      props: {
        context: this.viewData.context,
        params: this.viewData.params,
        modelPath: this.viewData.viewPath,
      },
      on: {
        neuronInit: this.onNeuronInit,
      },
    });
  },
});