From d5a75f887d3ff5e94529b50728b5ac64956b920a Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 7 Aug 2025 14:22:00 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=8A=BD=E5=B1=89?= =?UTF-8?q?=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/components/DrawerOverlay/index.vue | 132 +++++--- .../js/components/DrawerOverlay/view.vue | 18 +- .../sass/components/drawer-overlay.scss | 312 ++++++++++-------- resources/assets/sass/pages/common.scss | 25 -- 4 files changed, 273 insertions(+), 214 deletions(-) diff --git a/resources/assets/js/components/DrawerOverlay/index.vue b/resources/assets/js/components/DrawerOverlay/index.vue index ce16be45c..c11893a83 100644 --- a/resources/assets/js/components/DrawerOverlay/index.vue +++ b/resources/assets/js/components/DrawerOverlay/index.vue @@ -3,24 +3,28 @@ ref="modal" v-model="show" :closable="escClosable" - :mask="!isFullscreen" + :mask="finalMask" :mask-closable="maskClosable" :footer-hide="true" - :transition-names="transitionNames" - :beforeClose="beforeClose" - :class-name="className" - fullscreen> -
- -
+ :fullscreen="true" + :class-name="finalClassName" + :transition-names="finalTransitionNames" + :before-close="beforeClose"> - + + + @@ -36,46 +40,55 @@ export default { type: Boolean, default: false }, + // 是否显示遮罩,留空自动判断 + mask: { + default: null + }, + // 允许点击遮罩关闭 maskClosable: { type: Boolean, default: true }, + // 允许按下 ESC 键关闭 escClosable: { type: Boolean, default: true }, + // 是否全屏,留空自动判断屏幕宽度小于 768px 时自动变为全屏模式 + fullscreen: { + default: null + }, + // 抽屉放置位置,可选 'right' 或 'bottom' + // 在全屏模式下无效,强制为 'bottom' placement: { validator(value) { return ['right', 'bottom'].includes(value) }, default: 'bottom' }, - forceFullscreen: { - type: Boolean, - default: false - }, - transitions: { - type: Array, - default: () => [] - }, + // 抽屉的大小,可以是百分比或像素值,默认 100% + // 在全屏模式下无效 size: { type: [Number, String], default: "100%" }, + // 抽屉的最小大小,单位为像素,默认 300px + // 在全屏模式下无效 minSize: { type: Number, default: 300 }, + // 允许调整大小,默认为 true + // 在全屏模式下无效 resize: { type: Boolean, default: true }, - drawerClass: { - type: String - }, - modalClass: { + // 自定义类名 + className: { type: String }, + // 拦截关闭事件的函数 beforeClose: Function }, data() { @@ -92,34 +105,55 @@ export default { }, }, computed: { - isFullscreen() { - return this.forceFullscreen || (this.windowWidth < 500 && this.placement != 'bottom') - }, - placementName() { - return this.isFullscreen ? 'bottom' : this.placement - }, - transitionNames() { - if (this.transitions.length > 0) { - return this.transitions + finalFullscreen() { + if (typeof this.fullscreen === 'boolean') { + return this.fullscreen } - return [`drawer-slide-${this.placementName}`, ''] + return this.windowWidth < 768 }, - className() { - const array = [] - if (this.isFullscreen) { - array.push("common-drawer-modal") - if (this.modalClass) { - array.push(this.modalClass) - } - } else { - array.push("common-drawer-overlay") - if (this.drawerClass) { - array.push(this.drawerClass) - } - array.push(this.placementName) + finalMask() { + if (typeof this.mask === 'boolean') { + return this.mask + } + return !this.finalFullscreen + }, + finalClassName() { + const array = [ + "common-drawer", + `drawer-${this.finalPlacement}` + ]; + if (this.finalFullscreen) { + array.push("drawer-fullscreen") + } + if (this.className) { + array.push(this.className) } return array.join(" "); }, + finalTransitionNames() { + return [`drawer-animation-${this.finalPlacement}`, 'drawer-animation-fade'] + }, + finalPlacement() { + return this.finalFullscreen ? 'bottom' : this.placement + }, + finalSize() { + if (this.finalFullscreen) { + return "100%" + } + return this.size + }, + finalMinSize() { + if (this.finalFullscreen) { + return 0 + } + return this.minSize + }, + finalResize() { + if (this.finalFullscreen) { + return false + } + return this.resize + } }, methods: { close() { diff --git a/resources/assets/js/components/DrawerOverlay/view.vue b/resources/assets/js/components/DrawerOverlay/view.vue index 02e2edaac..9ef2c6be9 100644 --- a/resources/assets/js/components/DrawerOverlay/view.vue +++ b/resources/assets/js/components/DrawerOverlay/view.vue @@ -1,11 +1,9 @@