123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- <template>
- <div>
- <!-- 正常弹窗 -->
- <el-dialog
- v-show="!minimized"
- :visible.sync="visibleSync"
- :title="title"
- v-bind="$attrs"
- v-on="$listeners"
- :before-close="handleClose"
- >
- <template #title>
- <span>{{ title }}</span>
- <i
- class="el-icon-minus"
- style="cursor:pointer;float:right;margin-right:35px;"
- @click.stop="minimize"
- ></i>
- </template>
- <slot />
- <template #footer>
- <slot name="footer" />
- </template>
- </el-dialog>
- <!-- 最小化悬浮卡片 -->
- <div
- v-show="minimized"
- class="minimized-dialog"
- ref="minCard"
- @click="restore"
- >
- <i :class="minIcon"></i>
- <span>{{ minTitle || title }}</span>
- </div>
- </div>
- </template>
- <script>
- export default {
- name: "MinimizableDialog",
- props: {
- visible: {
- type: Boolean,
- required: true
- },
- title: {
- type: String,
- default: ""
- },
- minTitle: {
- type: String,
- default: ""
- },
- minIcon: {
- type: String,
- default: "el-icon-files"
- }
- },
- data() {
- return {
- minimized: false,
- visibleSync: this.visible
- };
- },
- watch: {
- visible(val) {
- this.visibleSync = val;
- if (val) this.minimized = false;
- },
- visibleSync(val) {
- this.$emit("update:visible", val);
- }
- },
- mounted() {
- this.moveMinCardToBody();
- },
- beforeDestroy() {
- this.removeMinCardFromBody();
- },
- methods: {
- moveMinCardToBody() {
- if (this.$refs.minCard && typeof window !== 'undefined') {
- document.body.appendChild(this.$refs.minCard);
- }
- },
- removeMinCardFromBody() {
- if (this.$refs.minCard && this.$refs.minCard.parentNode) {
- this.$refs.minCard.parentNode.removeChild(this.$refs.minCard);
- }
- },
- minimize() {
- this.minimized = true;
- this.visibleSync = false;
- this.$emit("minimize");
- },
- restore() {
- this.minimized = false;
- this.visibleSync = true;
- this.$emit("restore");
- },
- handleClose(done) {
- this.$emit("close");
- done();
- }
- }
- };
- </script>
- <style scoped>
- .minimized-dialog {
- position: fixed;
- right: 30px;
- bottom: 30px;
- background: #409EFF;
- color: #fff;
- padding: 10px 18px;
- border-radius: 20px;
- box-shadow: 0 2px 8px rgba(0,0,0,0.15);
- cursor: pointer;
- z-index: 1000;
- display: flex;
- align-items: center;
- font-size: 15px;
- }
- .minimized-dialog:hover {
- box-shadow: 0 4px 16px rgba(0,0,0,0.25);
- }
- .minimized-dialog i {
- margin-right: 8px;
- font-size: 18px;
- }
- </style>
|