perf(modal): optimize table embedding height calculation problem
This commit is contained in:
parent
84c9d78fa7
commit
9abf1763c7
|
|
@ -12,6 +12,11 @@
|
||||||
|
|
||||||
- 表单代码优化重构
|
- 表单代码优化重构
|
||||||
|
|
||||||
|
### ⚡ Performance Improvements
|
||||||
|
|
||||||
|
- Modal slot 可以覆盖
|
||||||
|
- 优化表格嵌入高度计算问题
|
||||||
|
|
||||||
### 🎫 Chores
|
### 🎫 Chores
|
||||||
|
|
||||||
- 添加部分注释
|
- 添加部分注释
|
||||||
|
|
|
||||||
|
|
@ -225,11 +225,11 @@ export default defineComponent({
|
||||||
{...{ ...attrs, ...props, ...unref(getProps) }}
|
{...{ ...attrs, ...props, ...unref(getProps) }}
|
||||||
>
|
>
|
||||||
{{
|
{{
|
||||||
|
footer: () => renderFooter(),
|
||||||
|
closeIcon: () => renderClose(),
|
||||||
|
title: () => renderTitle(),
|
||||||
...extendSlots(slots, ['default']),
|
...extendSlots(slots, ['default']),
|
||||||
default: () => renderContent(),
|
default: () => renderContent(),
|
||||||
closeIcon: () => renderClose(),
|
|
||||||
footer: () => renderFooter(),
|
|
||||||
title: () => renderTitle(),
|
|
||||||
}}
|
}}
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,12 @@ import {
|
||||||
import { Spin } from 'ant-design-vue';
|
import { Spin } from 'ant-design-vue';
|
||||||
|
|
||||||
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
|
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 { getSlot } from '/@/utils/helper/tsxHelper';
|
||||||
import { useElResize } from '/@/hooks/event/useElResize';
|
import { useElResize } from '/@/hooks/event/useElResize';
|
||||||
|
import { provideModal } from './provideModal';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'ModalWrapper',
|
name: 'ModalWrapper',
|
||||||
props: {
|
props: {
|
||||||
|
|
@ -56,6 +58,11 @@ export default defineComponent({
|
||||||
const wrapperRef = ref<HTMLElement | null>(null);
|
const wrapperRef = ref<HTMLElement | null>(null);
|
||||||
const spinRef = ref<any>(null);
|
const spinRef = ref<any>(null);
|
||||||
const realHeightRef = ref(0);
|
const realHeightRef = ref(0);
|
||||||
|
// 重试次数
|
||||||
|
// let tryCount = 0;
|
||||||
|
let stopElResizeFn: Fn = () => {};
|
||||||
|
|
||||||
|
provideModal(setModalHeight);
|
||||||
|
|
||||||
const wrapStyle = computed(() => {
|
const wrapStyle = computed(() => {
|
||||||
return {
|
return {
|
||||||
|
|
@ -65,10 +72,6 @@ export default defineComponent({
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
// 重试次数
|
|
||||||
let tryCount = 0;
|
|
||||||
let stopElResizeFn: Fn = () => {};
|
|
||||||
|
|
||||||
watchEffect(() => {
|
watchEffect(() => {
|
||||||
setModalHeight();
|
setModalHeight();
|
||||||
});
|
});
|
||||||
|
|
@ -123,17 +126,17 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
await nextTick();
|
await nextTick();
|
||||||
const spinEl = unref(spinRef);
|
const spinEl = unref(spinRef);
|
||||||
if (!spinEl) {
|
// if (!spinEl) {
|
||||||
useTimeout(() => {
|
// useTimeout(() => {
|
||||||
// retry
|
// // retry
|
||||||
if (tryCount < 3) {
|
// if (tryCount < 3) {
|
||||||
setModalHeight();
|
// setModalHeight();
|
||||||
}
|
// }
|
||||||
tryCount++;
|
// tryCount++;
|
||||||
}, 10);
|
// }, 10);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
tryCount = 0;
|
// tryCount = 0;
|
||||||
|
|
||||||
const spinContainerEl = spinEl.$el.querySelector('.ant-spin-container') as HTMLElement;
|
const spinContainerEl = spinEl.$el.querySelector('.ant-spin-container') as HTMLElement;
|
||||||
if (!spinContainerEl) return;
|
if (!spinContainerEl) return;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
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 { useTimeout } from '/@/hooks/core/useTimeout';
|
||||||
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
|
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
|
||||||
import { useProps } from './useProps';
|
import { useProps } from './useProps';
|
||||||
|
import { injectModal } from '/@/components/Modal/src/provideModal';
|
||||||
|
|
||||||
export function useTableScroll(refProps: ComputedRef<BasicTableProps>, tableElRef: Ref<any>) {
|
export function useTableScroll(refProps: ComputedRef<BasicTableProps>, tableElRef: Ref<any>) {
|
||||||
const { propsRef } = useProps(refProps);
|
const { propsRef } = useProps(refProps);
|
||||||
|
|
||||||
const tableHeightRef: Ref<number | null> = ref(null);
|
const tableHeightRef: Ref<number | null> = ref(null);
|
||||||
|
|
||||||
|
const redoModalHeight = injectModal();
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => unref(propsRef).canResize,
|
() => unref(propsRef).canResize,
|
||||||
() => {
|
() => {
|
||||||
redoHeight();
|
redoHeight();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
function redoHeight() {
|
function redoHeight() {
|
||||||
const { canResize } = unref(propsRef);
|
const { canResize } = unref(propsRef);
|
||||||
|
|
||||||
if (!canResize) {
|
if (!canResize) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
calcTableHeight();
|
calcTableHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function calcTableHeight(cb?: () => void) {
|
async function calcTableHeight(cb?: () => void) {
|
||||||
const { canResize, resizeHeightOffset, pagination, maxHeight } = unref(propsRef);
|
const { canResize, resizeHeightOffset, pagination, maxHeight } = unref(propsRef);
|
||||||
if (!canResize) {
|
if (!canResize) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
await nextTick();
|
await nextTick();
|
||||||
const table = unref(tableElRef) as any;
|
const table = unref(tableElRef) as any;
|
||||||
|
if (!table) return;
|
||||||
|
|
||||||
if (!table) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const tableEl: Element = table.$el;
|
const tableEl: Element = table.$el;
|
||||||
if (!tableEl) {
|
if (!tableEl) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
const el: HTMLElement | null = tableEl.querySelector('.ant-table-thead ');
|
const el: HTMLElement | null = tableEl.querySelector('.ant-table-thead ');
|
||||||
// const layoutMain: Element | null = document.querySelector('.default-layout__main ');
|
// const layoutMain: Element | null = document.querySelector('.default-layout__main ');
|
||||||
if (!el) {
|
if (!el) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 表格距离底部高度
|
// 表格距离底部高度
|
||||||
const { bottomIncludeBody } = getViewportOffset(el);
|
const { bottomIncludeBody } = getViewportOffset(el);
|
||||||
// 表格高度+距离底部高度-自定义偏移量
|
// 表格高度+距离底部高度-自定义偏移量
|
||||||
|
|
@ -89,6 +86,8 @@ export function useTableScroll(refProps: ComputedRef<BasicTableProps>, tableElRe
|
||||||
tableHeightRef.value =
|
tableHeightRef.value =
|
||||||
tableHeightRef.value! > maxHeight! ? (maxHeight as number) : tableHeightRef.value;
|
tableHeightRef.value! > maxHeight! ? (maxHeight as number) : tableHeightRef.value;
|
||||||
cb && cb();
|
cb && cb();
|
||||||
|
// 解决表格放modal内的时候,modal自适应高度计算问题
|
||||||
|
redoModalHeight && redoModalHeight();
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue