feat(modal): exporse redoModalHeight
| | |
| | | ## Wip |
| | | |
| | | ### ✨ Features |
| | | |
| | | - useModal 新增返回值函数 `redoModalHeight`,用于在 modal 内为动态内容时刷新 modal 高度 |
| | | |
| | | ### 🐛 Bug Fixes |
| | | |
| | | - 修复 Upload 组件 maxNumber 失效问题 |
| | |
| | | watchEffect, |
| | | toRef, |
| | | getCurrentInstance, |
| | | nextTick, |
| | | } from 'vue'; |
| | | |
| | | import Modal from './components/Modal'; |
| | |
| | | |
| | | import { basicProps } from './props'; |
| | | import { useFullScreen } from './hooks/useModalFullScreen'; |
| | | |
| | | import { omit } from 'lodash-es'; |
| | | export default defineComponent({ |
| | | name: 'BasicModal', |
| | |
| | | const visibleRef = ref(false); |
| | | const propsRef = ref<Partial<ModalProps> | null>(null); |
| | | const modalWrapperRef = ref<ComponentRef>(null); |
| | | |
| | | // modal Bottom and top height |
| | | const extHeightRef = ref(0); |
| | | const modalMethods: ModalMethods = { |
| | | setModalProps, |
| | | emitVisible: undefined, |
| | | redoModalHeight: () => { |
| | | nextTick(() => { |
| | | if (unref(modalWrapperRef)) { |
| | | (unref(modalWrapperRef) as any).setModalHeight(); |
| | | } |
| | | }); |
| | | }, |
| | | }; |
| | | |
| | | const instance = getCurrentInstance(); |
| | | if (instance) { |
| | | emit('register', modalMethods, instance.uid); |
| | |
| | | (v) => { |
| | | emit('visible-change', v); |
| | | instance && modalMethods.emitVisible?.(v, instance.uid); |
| | | nextTick(() => { |
| | | if (props.scrollTop && v && unref(modalWrapperRef)) { |
| | | (unref(modalWrapperRef) as any).scrollTop(); |
| | | } |
| | | }); |
| | | }, |
| | | { |
| | | immediate: false, |
| | |
| | | |
| | | let stopElResizeFn: Fn = () => {}; |
| | | |
| | | useWindowSizeFn(setModalHeight); |
| | | useWindowSizeFn(setModalHeight.bind(null, false)); |
| | | |
| | | createModalContext({ |
| | | redoModalHeight: setModalHeight, |
| | |
| | | stopElResizeFn && stopElResizeFn(); |
| | | }); |
| | | |
| | | async function scrollTop() { |
| | | nextTick(() => { |
| | | const wrapperRefDom = unref(wrapperRef); |
| | | if (!wrapperRefDom) return; |
| | | (wrapperRefDom as any)?.scrollTo?.(0); |
| | | }); |
| | | } |
| | | |
| | | async function setModalHeight() { |
| | | // 解决在弹窗关闭的时候监听还存在,导致再次打开弹窗没有高度 |
| | | // 加上这个,就必须在使用的时候传递父级的visible |
| | | if (!props.visible) return; |
| | | const wrapperRefDom = unref(wrapperRef); |
| | | if (!wrapperRefDom) return; |
| | | |
| | | const bodyDom = wrapperRefDom.$el.parentElement; |
| | | if (!bodyDom) return; |
| | | bodyDom.style.padding = '0'; |
| | |
| | | } |
| | | } |
| | | |
| | | return { wrapperRef, spinRef, spinStyle }; |
| | | return { wrapperRef, spinRef, spinStyle, scrollTop, setModalHeight }; |
| | | }, |
| | | }); |
| | | </script> |
| | |
| | | setModalProps: (props: Partial<ModalProps>): void => { |
| | | getInstance()?.setModalProps(props); |
| | | }, |
| | | |
| | | getVisible: computed((): boolean => { |
| | | return visibleData[~~unref(uidRef)]; |
| | | }), |
| | | |
| | | redoModalHeight: () => { |
| | | getInstance()?.redoModalHeight?.(); |
| | | }, |
| | | |
| | | openModal: <T = any>(visible = true, data?: T, openOnSet = true): void => { |
| | | getInstance()?.setModalProps({ |
| | | visible: visible, |
| | |
| | | |
| | | export const modalProps = { |
| | | visible: propTypes.bool, |
| | | scrollTop: propTypes.bool.def(true), |
| | | height: propTypes.number, |
| | | minHeight: propTypes.number, |
| | | // open drag |
| | |
| | | export interface ModalMethods { |
| | | setModalProps: (props: Partial<ModalProps>) => void; |
| | | emitVisible?: (visible: boolean, uid: number) => void; |
| | | redoModalHeight?: () => void; |
| | | } |
| | | |
| | | export type RegisterFn = (modalMethods: ModalMethods, uuid?: string) => void; |
| | |
| | | // 启用wrapper后 底部可以适当增加高度 |
| | | wrapperFooterOffset?: number; |
| | | draggable?: boolean; |
| | | scrollTop?: boolean; |
| | | |
| | | // 是否可以进行全屏 |
| | | canFullscreen?: boolean; |
| | |
| | | if (slots.expandedRowRender) { |
| | | propsData = omit(propsData, 'scroll'); |
| | | } |
| | | |
| | | return propsData; |
| | | }); |
| | | |
| | |
| | | dept: '', |
| | | editable: true, |
| | | isNew: true, |
| | | key: `${Date.now()}`, |
| | | }; |
| | | data.push(addRow); |
| | | } |