优化DrawerOverlay组件

This commit is contained in:
kuaifan 2022-01-14 23:59:10 +08:00
parent b019d40009
commit 0c2e56271b
5 changed files with 50 additions and 14 deletions

View File

@ -64,7 +64,7 @@
"stylus-loader": "^6.2.0", "stylus-loader": "^6.2.0",
"tinymce": "^5.10.2", "tinymce": "^5.10.2",
"tui-calendar-hi": "^1.15.1-5", "tui-calendar-hi": "^1.15.1-5",
"view-design-hi": "^4.7.0-5", "view-design-hi": "^4.7.0-7",
"vue": "^2.6.14", "vue": "^2.6.14",
"vue-clipboard2": "^0.3.3", "vue-clipboard2": "^0.3.3",
"vue-emoji-picker": "^1.0.3", "vue-emoji-picker": "^1.0.3",

View File

@ -1,5 +1,9 @@
<template> <template>
<div :class="['drawer-overlay', placement, value ? 'overlay-visible' : 'overlay-hide']"> <div
v-transfer-dom
:data-transfer="transfer"
:class="['drawer-overlay', placement, value ? 'overlay-visible' : 'overlay-hide']"
:style="overlayStyle">
<div class="overlay-mask" @click="mask"></div> <div class="overlay-mask" @click="mask"></div>
<div class="overlay-body" :style="bodyStyle"> <div class="overlay-body" :style="bodyStyle">
<div class="overlay-close"> <div class="overlay-close">
@ -9,7 +13,7 @@
</svg> </svg>
</a> </a>
</div> </div>
<ResizeLine v-if="resize" class="overlay-resize" v-model="width" :max-width="0"/> <ResizeLine v-if="resize && placement == 'right'" class="overlay-resize" v-model="width" :min-width="100" :max-width="0" reverse/>
<div class="overlay-content"><slot/></div> <div class="overlay-content"><slot/></div>
</div> </div>
</div> </div>
@ -17,9 +21,13 @@
<script> <script>
import ResizeLine from "./ResizeLine"; import ResizeLine from "./ResizeLine";
import TransferDom from '../directives/transfer-dom';
import {mapState} from "vuex";
export default { export default {
name: 'DrawerOverlay', name: 'DrawerOverlay',
components: {ResizeLine}, components: {ResizeLine},
directives: { TransferDom },
props: { props: {
value: { value: {
type: Boolean, type: Boolean,
@ -43,15 +51,20 @@
type: [Number, String], type: [Number, String],
default: "100%" default: "100%"
}, },
resize: { resize: { // only placement:right
type: Boolean, type: Boolean,
default: true default: true
}, },
transfer: {
type: Boolean,
default: false
},
}, },
data() { data() {
return { return {
width: 0 width: 0,
zIndex: 0,
} }
}, },
@ -64,6 +77,14 @@
}, },
computed: { computed: {
...mapState(['cacheDrawerIndex']),
overlayStyle() {
return {
zIndex: 1000 + this.zIndex
}
},
bodyStyle() { bodyStyle() {
let size = this.width; let size = this.width;
size = size <= 100 ? `${size}%` : `${size}px` size = size <= 100 ? `${size}%` : `${size}px`
@ -95,6 +116,12 @@
this.$store.state.cacheDrawerOverlay.splice(index, 1); this.$store.state.cacheDrawerOverlay.splice(index, 1);
} }
} }
//
if (val) {
this.zIndex = this.$store.state.cacheDrawerIndex++;
} else if (this.$store.state.cacheDrawerOverlay.length === 0) {
this.$store.state.cacheDrawerIndex = 0;
}
}, },
size: { size: {
handler(val) { handler(val) {
@ -111,17 +138,19 @@
} }
}, },
close() { close() {
this.$emit("input", !this.value) this.$emit("input", false)
}, },
escClose(e) { escClose(e) {
if (this.value && this.escClosable) { if (this.value && this.escClosable) {
if (e.keyCode === 27) { if (e.keyCode === 27) {
let show = false; if (this.$Modal.visibles().length > 0) {
$A(".ivu-modal").each((i, e) => { return;
show = $(e).is(":visible"); }
return !show; const list = this.$store.state.cacheDrawerOverlay;
}) if (list.length > 0) {
!show && this.close() const $Drawer = list[list.length - 1]
$Drawer.close();
}
} }
} }
} }

View File

@ -36,6 +36,10 @@
type: Number, type: Number,
default: 600, default: 600,
}, },
reverse: {
type: Boolean,
default: false
}
}, },
data() { data() {
@ -79,7 +83,7 @@
let diffX = (e.pageX || e.clientX + document.documentElement.scrollLeft) - this.mouseX; let diffX = (e.pageX || e.clientX + document.documentElement.scrollLeft) - this.mouseX;
let diffY = (e.pageY || e.clientY + document.documentElement.scrollTop) - this.mouseY; let diffY = (e.pageY || e.clientY + document.documentElement.scrollTop) - this.mouseY;
if (typeof this.tmpWidth === 'number') { if (typeof this.tmpWidth === 'number') {
let value = this.tmpWidth + diffX; let value = this.reverse ? (this.tmpWidth - diffX) : (this.tmpWidth + diffX);
if (this.minWidth > 0) { if (this.minWidth > 0) {
value = Math.max(this.minWidth, value); value = Math.max(this.minWidth, value);
} }

View File

@ -8,6 +8,9 @@ state.windowMax768 = window.innerWidth <= 768;
// 数据缓存 // 数据缓存
state.cacheLoading = {}; state.cacheLoading = {};
// DrawerOverlay
state.cacheDrawerIndex = 0;
state.cacheDrawerOverlay = []; state.cacheDrawerOverlay = [];
// User // User

View File

@ -7,7 +7,7 @@
z-index: 1000; z-index: 1000;
box-sizing: border-box; box-sizing: border-box;
pointer-events: none; pointer-events: none;
background: rgba(0, 0, 0, 0.76); background: rgba(10, 10, 10, 0.76);
outline: none; outline: none;
opacity: 0; opacity: 0;
display: flex; display: flex;