From 0fe42a06c1f2ef69805dbfeecbcac919ff0aedd0 Mon Sep 17 00:00:00 2001 From: ztw2010 <1148611348@qq.com> Date: Wed, 10 Mar 2021 22:24:37 +0800 Subject: [PATCH] fix(table): fix table height calculation problem Because the table data obtained by the interface may be later than the calctableheight method, the table cannot adapt to the height, and a scroll bar appears on the page (#348) --- src/components/Page/src/PageWrapper.vue | 83 +++++++++++-------- .../Table/src/hooks/useTableScroll.ts | 14 +++- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/components/Page/src/PageWrapper.vue b/src/components/Page/src/PageWrapper.vue index 4db8ec23e5a..c08f1a40153 100644 --- a/src/components/Page/src/PageWrapper.vue +++ b/src/components/Page/src/PageWrapper.vue @@ -45,6 +45,7 @@ import { propTypes } from '/@/utils/propTypes'; import { omit } from 'lodash-es'; import { PageHeader } from 'ant-design-vue'; + import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'; export default defineComponent({ name: 'PageWrapper', components: { PageFooter, PageHeader }, @@ -105,41 +106,7 @@ watch( () => [contentHeight?.value, getShowFooter.value], () => { - if (!props.contentFullHeight) { - return; - } - nextTick(() => { - //fix:in contentHeight mode: delay getting footer and header dom element to get the correct height - const footer = unref(footerRef); - const header = unref(headerRef); - footerHeight.value = 0; - const footerEl = footer?.$el; - - if (footerEl) { - footerHeight.value += footerEl?.offsetHeight ?? 0; - } - let headerHeight = 0; - const headerEl = header?.$el; - if (headerEl) { - headerHeight += headerEl?.offsetHeight ?? 0; - } - // fix:subtract content's marginTop and marginBottom value - let subtractHeight = 0; - const { marginBottom, marginTop } = getComputedStyle( - document.querySelectorAll(`.${prefixVar}-page-wrapper-content`)?.[0] - ); - if (marginBottom) { - const contentMarginBottom = Number(marginBottom.replace(/[^\d]/g, '')); - subtractHeight += contentMarginBottom; - } - if (marginTop) { - const contentMarginTop = Number(marginTop.replace(/[^\d]/g, '')); - subtractHeight += contentMarginTop; - } - setPageHeight?.( - unref(contentHeight) - unref(footerHeight) - headerHeight - subtractHeight - ); - }); + calcContentHeight(); }, { flush: 'post', @@ -147,6 +114,52 @@ } ); + onMountedOrActivated(() => { + nextTick(() => { + calcContentHeight(); + }); + }); + + function calcContentHeight() { + if (!props.contentFullHeight) { + return; + } + //fix:in contentHeight mode: delay getting footer and header dom element to get the correct height + const footer = unref(footerRef); + const header = unref(headerRef); + footerHeight.value = 0; + const footerEl = footer?.$el; + + if (footerEl) { + footerHeight.value += footerEl?.offsetHeight ?? 0; + } + let headerHeight = 0; + const headerEl = header?.$el; + if (headerEl) { + headerHeight += headerEl?.offsetHeight ?? 0; + } + // fix:subtract content's marginTop and marginBottom value + let subtractHeight = 0; + let marginBottom = '0px'; + let marginTop = '0px'; + const classElments = document.querySelectorAll(`.${prefixVar}-page-wrapper-content`); + if (classElments && classElments.length > 0) { + const contentEl = classElments[0]; + const cssStyle = getComputedStyle(contentEl); + marginBottom = cssStyle?.marginBottom; + marginTop = cssStyle?.marginTop; + } + if (marginBottom) { + const contentMarginBottom = Number(marginBottom.replace(/[^\d]/g, '')); + subtractHeight += contentMarginBottom; + } + if (marginTop) { + const contentMarginTop = Number(marginTop.replace(/[^\d]/g, '')); + subtractHeight += contentMarginTop; + } + setPageHeight?.(unref(contentHeight) - unref(footerHeight) - headerHeight - subtractHeight); + } + return { getContentStyle, footerRef, diff --git a/src/components/Table/src/hooks/useTableScroll.ts b/src/components/Table/src/hooks/useTableScroll.ts index 2396d631ddf..da40002543e 100644 --- a/src/components/Table/src/hooks/useTableScroll.ts +++ b/src/components/Table/src/hooks/useTableScroll.ts @@ -9,6 +9,7 @@ import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'; import { useModalContext } from '/@/components/Modal'; import { useDebounce } from '/@/hooks/core/useDebounce'; import type { BasicColumn } from '/@/components/Table'; +import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated'; export function useTableScroll( propsRef: ComputedRef, @@ -21,8 +22,8 @@ export function useTableScroll( const modalFn = useModalContext(); - //320 Greater than animation time 280 - const [debounceRedoHeight] = useDebounce(redoHeight, 300); + // Greater than animation time 280 + const [debounceRedoHeight] = useDebounce(redoHeight, 100); const getCanResize = computed(() => { const { canResize, scroll } = unref(propsRef); @@ -30,13 +31,12 @@ export function useTableScroll( }); watch( - () => unref(getCanResize), + () => [unref(getCanResize), , unref(getDataSourceRef)?.length], () => { debounceRedoHeight(); }, { flush: 'post', - immediate: true, } ); @@ -132,6 +132,12 @@ export function useTableScroll( } useWindowSizeFn(calcTableHeight, 280); + onMountedOrActivated(() => { + calcTableHeight(); + nextTick(() => { + debounceRedoHeight(); + }); + }); const getScrollX = computed(() => { let width = 0;