提交 9abf1763 编写于 作者: V vben

perf(modal): optimize table embedding height calculation problem

上级 84c9d78f
......@@ -12,6 +12,11 @@
- 表单代码优化重构
### ⚡ Performance Improvements
- Modal slot 可以覆盖
- 优化表格嵌入高度计算问题
### 🎫 Chores
- 添加部分注释
......
......@@ -225,11 +225,11 @@ export default defineComponent({
{...{ ...attrs, ...props, ...unref(getProps) }}
>
{{
...extendSlots(slots, ['default']),
default: () => renderContent(),
closeIcon: () => renderClose(),
footer: () => renderFooter(),
closeIcon: () => renderClose(),
title: () => renderTitle(),
...extendSlots(slots, ['default']),
default: () => renderContent(),
}}
</Modal>
);
......
......@@ -15,10 +15,12 @@ import {
import { Spin } from 'ant-design-vue';
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
import { useTimeout } from '/@/hooks/core/useTimeout';
// import { useTimeout } from '/@/hooks/core/useTimeout';
import { getSlot } from '/@/utils/helper/tsxHelper';
import { useElResize } from '/@/hooks/event/useElResize';
import { provideModal } from './provideModal';
export default defineComponent({
name: 'ModalWrapper',
props: {
......@@ -56,6 +58,11 @@ export default defineComponent({
const wrapperRef = ref<HTMLElement | null>(null);
const spinRef = ref<any>(null);
const realHeightRef = ref(0);
// 重试次数
// let tryCount = 0;
let stopElResizeFn: Fn = () => {};
provideModal(setModalHeight);
const wrapStyle = computed(() => {
return {
......@@ -65,10 +72,6 @@ export default defineComponent({
};
});
// 重试次数
let tryCount = 0;
let stopElResizeFn: Fn = () => {};
watchEffect(() => {
setModalHeight();
});
......@@ -123,17 +126,17 @@ export default defineComponent({
}
await nextTick();
const spinEl = unref(spinRef);
if (!spinEl) {
useTimeout(() => {
// retry
if (tryCount < 3) {
setModalHeight();
}
tryCount++;
}, 10);
return;
}
tryCount = 0;
// if (!spinEl) {
// useTimeout(() => {
// // retry
// if (tryCount < 3) {
// setModalHeight();
// }
// tryCount++;
// }, 10);
// return;
// }
// tryCount = 0;
const spinContainerEl = spinEl.$el.querySelector('.ant-spin-container') as HTMLElement;
if (!spinContainerEl) return;
......
import { provide, inject } from 'vue';
const key = Symbol('basic-modal');
export function provideModal(redoHeight: Fn) {
provide(key, redoHeight);
}
export function injectModal(): Fn {
return inject(key) as Fn;
}
......@@ -6,47 +6,44 @@ import { isBoolean } from '/@/utils/is';
import { useTimeout } from '/@/hooks/core/useTimeout';
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
import { useProps } from './useProps';
import { injectModal } from '/@/components/Modal/src/provideModal';
export function useTableScroll(refProps: ComputedRef<BasicTableProps>, tableElRef: Ref<any>) {
const { propsRef } = useProps(refProps);
const tableHeightRef: Ref<number | null> = ref(null);
const redoModalHeight = injectModal();
watch(
() => unref(propsRef).canResize,
() => {
redoHeight();
}
);
function redoHeight() {
const { canResize } = unref(propsRef);
if (!canResize) {
return;
}
if (!canResize) return;
calcTableHeight();
}
async function calcTableHeight(cb?: () => void) {
const { canResize, resizeHeightOffset, pagination, maxHeight } = unref(propsRef);
if (!canResize) {
return;
}
if (!canResize) return;
await nextTick();
const table = unref(tableElRef) as any;
if (!table) return;
if (!table) {
return;
}
const tableEl: Element = table.$el;
if (!tableEl) {
return;
}
if (!tableEl) return;
const el: HTMLElement | null = tableEl.querySelector('.ant-table-thead ');
// const layoutMain: Element | null = document.querySelector('.default-layout__main ');
if (!el) {
return;
}
if (!el) return;
// 表格距离底部高度
const { bottomIncludeBody } = getViewportOffset(el);
// 表格高度+距离底部高度-自定义偏移量
......@@ -89,6 +86,8 @@ export function useTableScroll(refProps: ComputedRef<BasicTableProps>, tableElRe
tableHeightRef.value =
tableHeightRef.value! > maxHeight! ? (maxHeight as number) : tableHeightRef.value;
cb && cb();
// 解决表格放modal内的时候,modal自适应高度计算问题
redoModalHeight && redoModalHeight();
}, 0);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册