diff --git a/src/components/index.ts b/src/components/index.ts index 58caa6a41193a741959a9889bdc4e572bc2b7f34..6c2de142845dcfa6d7fd7bda454a6e31ddd3ad0b 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,10 +1,12 @@ import { App } from 'vue'; import { IBizViewShell } from './view-shell/view-shell'; +import { IBizSpecialViewShell } from './special-view-shell/special-view-shell'; export { IBizViewShell }; export default { install(v: App): void { v.component(IBizViewShell.name, IBizViewShell); + v.component(IBizSpecialViewShell.name, IBizSpecialViewShell); }, }; diff --git a/src/components/special-view-shell/special-view-shell.tsx b/src/components/special-view-shell/special-view-shell.tsx new file mode 100644 index 0000000000000000000000000000000000000000..61e8eac7de11d2cc602a8ed0d68f6acf51767f53 --- /dev/null +++ b/src/components/special-view-shell/special-view-shell.tsx @@ -0,0 +1,57 @@ +/* eslint-disable no-param-reassign */ +/* eslint-disable vue/no-mutating-props */ +import { IViewProvider, getViewProvider } from '@ibiz-template/runtime'; +import { defineComponent, h, PropType, ref, resolveComponent } from 'vue'; +import { IAppView } from '@ibiz/model-core'; +import { useNamespace } from '@ibiz-template/vue3-util'; + +export const IBizSpecialViewShell = defineComponent({ + name: 'IBizSpecialViewShell', + props: { + context: { type: Object as PropType, required: true }, + params: { type: Object as PropType }, + modelData: { type: Object as PropType }, + viewId: { type: String }, + }, + setup(props) { + const ns = useNamespace('view-shell'); + const isComplete = ref(false); + const errMsg = ref(''); + const provider = ref(); + // 初始化方法 + const init = async (): Promise => { + try { + provider.value = await getViewProvider(props.modelData!); + } catch (error) { + ibiz.log.error(error); + errMsg.value = (error as IData).message; + } finally { + isComplete.value = true; + } + }; + + init(); + + return { ns, isComplete, errMsg, provider }; + }, + render() { + if (this.isComplete && this.provider) { + return h( + resolveComponent(this.provider.component) as string, + { + context: this.$props.context, + params: this.$props.params, + modelData: this.$props.modelData, + ...this.$attrs, + provider: this.provider, + }, + this.$slots, + ); + } + return ( +
+ {this.isComplete ? this.errMsg : null} +
+ ); + }, +}); diff --git a/template/@macro/view/default-view.hbs b/template/@macro/view/default-view.hbs index ca024872528e9026aaccee61451ce33bc1d6a51d..864ce9d2fbe049d3ea85c9c40c600929d67cbfe5 100644 --- a/template/@macro/view/default-view.hbs +++ b/template/@macro/view/default-view.hbs @@ -1,10 +1,12 @@