import { defineComponent, getCurrentInstance, onMounted, PropType, reactive, ref, } from 'vue'; import { useNamespace } from '@ibiz-template/vue-util'; import { ViewNeuron } from '@ibiz-template/controller'; import { isNumber } from 'lodash-es'; import { IModal, IModalData, ViewMode } from '@ibiz-template/runtime'; import { AppDrawerOptions } from '@/interface'; import { useUIStore } from '@/store'; import '@ibiz-template/theme/style/components/util/drawer/drawer.scss'; export const AppDrawerComponent = defineComponent({ props: { componentName: String, componentProps: Object as PropType<IData>, opts: { type: Object as PropType<AppDrawerOptions>, default: () => ({}), }, resolve: { type: Function, required: true }, reject: { type: Function, required: true }, }, setup(props) { const ns = useNamespace('drawer'); const isShow = ref(false); const { proxy } = getCurrentInstance()!; const { zIndex } = useUIStore(); const drawerZIndex = zIndex.increment(); // 处理自定义样式 const customStyle = reactive<IData>({}); const { width, height } = props.opts; if (width) { customStyle.width = isNumber(width) ? `${width}px` : width; } if (height) { customStyle.height = isNumber(height) ? `${height}px` : height; } // 执行抽屉关闭操作 const doDrawerClose = () => { setTimeout(() => { zIndex.decrement(); proxy.$destroy(); document.body.removeChild(proxy.$el); }, 300); }; // 抽屉自身的操作触发的关闭(如点右上角的×) const onVisibleChange = (state: boolean) => { if (!state) { props.resolve({ ok: false, data: {} }); doDrawerClose(); } }; // modal对象 const modal: IModal = { mode: ViewMode.DRAWER }; // 抽屉标题 const drawerCaption = ref(''); // 视图神经元接收 const onNeuronInit = (neuron: ViewNeuron) => { neuron.evt.on('setTitle', title => { drawerCaption.value = title; }); neuron.evt.on('closeView', (res?: IModalData) => { props.resolve(res); doDrawerClose(); }); }; onMounted(() => { isShow.value = true; }); return { ns, modal, isShow, drawerZIndex, customStyle, drawerCaption, onNeuronInit, onVisibleChange, }; }, render(h) { return ( <i-drawer value={this.isShow} on-input={(val: boolean) => { this.isShow = val; }} width={this.opts.width} height={this.opts.height} class={[this.ns.b()]} style={{ [this.ns.cssVarBlockName('z-index')]: this.drawerZIndex }} styles={this.customStyle} placement={this.opts.placement || 'right'} on-on-visible-change={this.onVisibleChange} > {h(this.componentName, { props: { ...this.componentProps, modal: this.modal, }, on: { neuronInit: this.onNeuronInit, }, })} </i-drawer> ); }, });