diff --git a/src/components/index.ts b/src/components/index.ts index 58caa6a41193a741959a9889bdc4e572bc2b7f34..ef01f0a2e22439ff8a4ed2d44f38d7b02e6b536d 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 { IBizSpecialView } from './special-view/special-view'; export { IBizViewShell }; export default { install(v: App): void { v.component(IBizViewShell.name, IBizViewShell); + v.component(IBizSpecialView.name, IBizSpecialView); }, }; diff --git a/src/components/special-view/special-view.tsx b/src/components/special-view/special-view.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6faec6d84a3472d3ce32513a8686e281c2120137 --- /dev/null +++ b/src/components/special-view/special-view.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 IBizSpecialView = defineComponent({ + name: 'IBizSpecialView', + 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..568c737e0d7c2d7cab2e7e1843d931b2adf55d2c 100644 --- a/template/@macro/view/default-view.hbs +++ b/template/@macro/view/default-view.hbs @@ -1,10 +1,12 @@