From 947cafbb9c59261d0d7252a70bbbca8690c5cbc4 Mon Sep 17 00:00:00 2001 From: Ben Lin <maobin001@msn.com> Date: 星期三, 21 八月 2024 01:54:01 +0800 Subject: [PATCH] 是否称重 --- src/components/Page/src/PageWrapper.vue | 266 ++++++++++++++++++++++++++++------------------------ 1 files changed, 143 insertions(+), 123 deletions(-) diff --git a/src/components/Page/src/PageWrapper.vue b/src/components/Page/src/PageWrapper.vue index a7d1b9e..90a4b4e 100644 --- a/src/components/Page/src/PageWrapper.vue +++ b/src/components/Page/src/PageWrapper.vue @@ -1,9 +1,10 @@ <template> - <div :class="getClass" ref="wrapperRef"> + <div :class="getClass" :style="getStyle" ref="wrapperRef"> <PageHeader :ghost="ghost" :title="title" v-bind="omit($attrs, 'class')" + :style="getHeaderStyle" ref="headerRef" v-if="getShowHeader" > @@ -32,142 +33,161 @@ </PageFooter> </div> </template> -<script lang="ts"> +<script lang="ts" setup> + import { PageWrapperFixedHeightKey } from '@/enums/pageEnum'; + import { useContentHeight } from '@/hooks/web/useContentHeight'; + import { useDesign } from '@/hooks/web/useDesign'; + import { propTypes } from '@/utils/propTypes'; + import { PageHeader } from 'ant-design-vue'; + import { omit, debounce } from 'lodash-es'; + import { useElementSize } from '@vueuse/core'; import { CSSProperties, PropType, - provide, - defineComponent, computed, - watch, + provide, ref, unref, + useAttrs, + useSlots, + watch, } from 'vue'; - import PageFooter from './PageFooter.vue'; - import { useDesign } from '/@/hooks/web/useDesign'; - import { propTypes } from '/@/utils/propTypes'; - import { omit } from 'lodash-es'; - import { PageHeader } from 'ant-design-vue'; - import { useContentHeight } from '/@/hooks/web/useContentHeight'; - import { PageWrapperFixedHeightKey } from '/@/enums/pageEnum'; - - export default defineComponent({ + defineOptions({ name: 'PageWrapper', - components: { PageFooter, PageHeader }, inheritAttrs: false, - props: { - title: propTypes.string, - dense: propTypes.bool, - ghost: propTypes.bool, - content: propTypes.string, - contentStyle: { - type: Object as PropType<CSSProperties>, + }); + + const props = defineProps({ + title: propTypes.string, + dense: propTypes.bool, + ghost: propTypes.bool, + headerSticky: propTypes.bool, + headerStyle: Object as PropType<CSSProperties>, + content: propTypes.string, + contentStyle: { + type: Object as PropType<CSSProperties>, + }, + contentBackground: propTypes.bool, + contentFullHeight: propTypes.bool.def(false), + contentClass: propTypes.string, + fixedHeight: propTypes.bool, + upwardSpace: propTypes.oneOfType([propTypes.number, propTypes.string]).def(0), + }); + + const attrs = useAttrs(); + const slots = useSlots(); + + const wrapperRef = ref(null); + const headerRef = ref(null); + const contentRef = ref(null); + const footerRef = ref(null); + + const { height } = useElementSize(wrapperRef); + + const { prefixCls } = useDesign('page-wrapper'); + + provide( + PageWrapperFixedHeightKey, + computed(() => props.fixedHeight), + ); + + const getIsContentFullHeight = computed(() => { + return props.contentFullHeight; + }); + + const getUpwardSpace = computed(() => props.upwardSpace); + const { redoHeight, setCompensation, contentHeight } = useContentHeight( + getIsContentFullHeight, + wrapperRef, + [headerRef, footerRef], + [contentRef], + getUpwardSpace, + ); + const debounceRedoHeight = debounce(redoHeight, 50); + setCompensation({ useLayoutFooter: true, elements: [footerRef] }); + + const getClass = computed(() => { + return [ + prefixCls, + { + [`${prefixCls}--dense`]: props.dense, }, - contentBackground: propTypes.bool, - contentFullHeight: propTypes.bool, - contentClass: propTypes.string, - fixedHeight: propTypes.bool, - upwardSpace: propTypes.oneOfType([propTypes.number, propTypes.string]).def(0), + attrs.class ?? {}, + ]; + }); + + const getStyle = computed(() => { + const { contentFullHeight, fixedHeight } = props; + return { + ...(contentFullHeight && fixedHeight ? { height: '100%' } : {}), + }; + }); + + const getHeaderStyle = computed((): CSSProperties => { + const { headerSticky } = props; + if (!headerSticky) { + return {}; + } + + return { + position: 'sticky', + top: 0, + zIndex: 99, + ...props.headerStyle, + }; + }); + + const getShowHeader = computed( + () => props.content || slots?.headerContent || props.title || getHeaderSlots.value.length, + ); + + const getShowFooter = computed(() => slots?.leftFooter || slots?.rightFooter); + + const getHeaderSlots = computed(() => { + return Object.keys(omit(slots, 'default', 'leftFooter', 'rightFooter', 'headerContent')); + }); + + const getContentStyle = computed((): CSSProperties => { + const { contentFullHeight, contentStyle, fixedHeight } = props; + if (!contentFullHeight) { + return { ...contentStyle }; + } + + const height = `${unref(contentHeight)}px`; + return { + ...contentStyle, + minHeight: height, + ...(fixedHeight ? { height } : {}), + }; + }); + + const getContentClass = computed(() => { + const { contentBackground, contentClass } = props; + return [ + `${prefixCls}-content`, + contentClass, + { + [`${prefixCls}-content-bg`]: contentBackground, + }, + ]; + }); + + watch( + () => [getShowFooter.value], + () => { + redoHeight(); }, - setup(props, { slots, attrs }) { - const wrapperRef = ref(null); - const headerRef = ref(null); - const contentRef = ref(null); - const footerRef = ref(null); - const { prefixCls } = useDesign('page-wrapper'); - - provide( - PageWrapperFixedHeightKey, - computed(() => props.fixedHeight), - ); - - const getIsContentFullHeight = computed(() => { - return props.contentFullHeight; - }); - - const getUpwardSpace = computed(() => props.upwardSpace); - const { redoHeight, setCompensation, contentHeight } = useContentHeight( - getIsContentFullHeight, - wrapperRef, - [headerRef, footerRef], - [contentRef], - getUpwardSpace, - ); - setCompensation({ useLayoutFooter: true, elements: [footerRef] }); - - const getClass = computed(() => { - return [ - prefixCls, - { - [`${prefixCls}--dense`]: props.dense, - }, - attrs.class ?? {}, - ]; - }); - - const getShowHeader = computed( - () => props.content || slots?.headerContent || props.title || getHeaderSlots.value.length, - ); - - const getShowFooter = computed(() => slots?.leftFooter || slots?.rightFooter); - - const getHeaderSlots = computed(() => { - return Object.keys(omit(slots, 'default', 'leftFooter', 'rightFooter', 'headerContent')); - }); - - const getContentStyle = computed((): CSSProperties => { - const { contentFullHeight, contentStyle, fixedHeight } = props; - if (!contentFullHeight) { - return { ...contentStyle }; - } - - const height = `${unref(contentHeight)}px`; - return { - ...contentStyle, - minHeight: height, - ...(fixedHeight ? { height } : {}), - }; - }); - - const getContentClass = computed(() => { - const { contentBackground, contentClass } = props; - return [ - `${prefixCls}-content`, - contentClass, - { - [`${prefixCls}-content-bg`]: contentBackground, - }, - ]; - }); - - watch( - () => [getShowFooter.value], - () => { - redoHeight(); - }, - { - flush: 'post', - immediate: true, - }, - ); - - return { - getContentStyle, - wrapperRef, - headerRef, - contentRef, - footerRef, - getClass, - getHeaderSlots, - prefixCls, - getShowHeader, - getShowFooter, - omit, - getContentClass, - }; + { + flush: 'post', + immediate: true, }, + ); + + watch(height, () => { + const { contentFullHeight, fixedHeight } = props; + contentFullHeight && fixedHeight && debounceRedoHeight(); }); </script> <style lang="less"> -- Gitblit v1.9.3