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

perf(modal): optimize table embedding height calculation problem

上级 84c9d78f
...@@ -12,6 +12,11 @@ ...@@ -12,6 +12,11 @@
- 表单代码优化重构 - 表单代码优化重构
### ⚡ Performance Improvements
- Modal slot 可以覆盖
- 优化表格嵌入高度计算问题
### 🎫 Chores ### 🎫 Chores
- 添加部分注释 - 添加部分注释
......
...@@ -225,11 +225,11 @@ export default defineComponent({ ...@@ -225,11 +225,11 @@ export default defineComponent({
{...{ ...attrs, ...props, ...unref(getProps) }} {...{ ...attrs, ...props, ...unref(getProps) }}
> >
{{ {{
...extendSlots(slots, ['default']),
default: () => renderContent(),
closeIcon: () => renderClose(),
footer: () => renderFooter(), footer: () => renderFooter(),
closeIcon: () => renderClose(),
title: () => renderTitle(), title: () => renderTitle(),
...extendSlots(slots, ['default']),
default: () => renderContent(),
}} }}
</Modal> </Modal>
); );
......
...@@ -15,10 +15,12 @@ import { ...@@ -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({ ...@@ -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({ ...@@ -65,10 +72,6 @@ export default defineComponent({
}; };
}); });
// 重试次数
let tryCount = 0;
let stopElResizeFn: Fn = () => {};
watchEffect(() => { watchEffect(() => {
setModalHeight(); setModalHeight();
}); });
...@@ -123,17 +126,17 @@ export default defineComponent({ ...@@ -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;
......
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'; ...@@ -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 ...@@ -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);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册