2022-01-06 08:08:53 +00:00
|
|
|
<docs>
|
|
|
|
---
|
|
|
|
order: 13
|
|
|
|
title:
|
|
|
|
zh-CN: 自定义渲染对话框
|
|
|
|
en-US: Custom modal content render
|
|
|
|
---
|
|
|
|
|
|
|
|
## zh-CN
|
|
|
|
|
2022-04-23 09:19:48 +00:00
|
|
|
自定义渲染对话框, 可通过 `vueuse` 来实现拖拽。
|
2022-01-06 08:08:53 +00:00
|
|
|
|
|
|
|
## en-US
|
|
|
|
|
2022-04-23 09:19:48 +00:00
|
|
|
Custom modal content render. use `vueuse` implements draggable.
|
2022-01-06 08:08:53 +00:00
|
|
|
|
|
|
|
</docs>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<div>
|
2022-04-23 09:19:48 +00:00
|
|
|
<a-button type="primary" @click="showModal">Open Modal</a-button>
|
|
|
|
<a-modal ref="modalRef" v-model:visible="visible" @ok="handleOk">
|
|
|
|
<p>Some contents...</p>
|
|
|
|
<p>Some contents...</p>
|
|
|
|
<p>Some contents...</p>
|
2022-01-06 08:08:53 +00:00
|
|
|
<template #title>
|
2022-04-23 09:19:48 +00:00
|
|
|
<div ref="modalTitleRef" style="width: 100%; cursor: move">Draggable Modal</div>
|
2022-01-06 08:08:53 +00:00
|
|
|
</template>
|
|
|
|
<template #modalRender="{ originVNode }">
|
2022-04-23 09:19:48 +00:00
|
|
|
<div :style="transformStyle">
|
|
|
|
<component :is="originVNode" />
|
|
|
|
</div>
|
2022-01-06 08:08:53 +00:00
|
|
|
</template>
|
|
|
|
</a-modal>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<script lang="ts">
|
2022-04-23 09:19:48 +00:00
|
|
|
import { defineComponent, ref, computed, CSSProperties, watch, watchEffect } from 'vue';
|
|
|
|
import { useDraggable } from '@vueuse/core';
|
2022-01-06 08:08:53 +00:00
|
|
|
export default defineComponent({
|
|
|
|
setup() {
|
|
|
|
const visible = ref<boolean>(false);
|
2022-04-23 09:19:48 +00:00
|
|
|
const modalTitleRef = ref<HTMLElement>(null);
|
2022-01-06 08:08:53 +00:00
|
|
|
const showModal = () => {
|
|
|
|
visible.value = true;
|
|
|
|
};
|
2022-04-23 09:19:48 +00:00
|
|
|
const { x, y, isDragging } = useDraggable(modalTitleRef);
|
2022-01-06 08:08:53 +00:00
|
|
|
const handleOk = (e: MouseEvent) => {
|
|
|
|
console.log(e);
|
|
|
|
visible.value = false;
|
|
|
|
};
|
2022-04-23 09:19:48 +00:00
|
|
|
const startX = ref<number>(0);
|
|
|
|
const startY = ref<number>(0);
|
2022-04-24 01:59:09 +00:00
|
|
|
const startedDrag = ref(false);
|
2022-04-23 09:19:48 +00:00
|
|
|
const transformX = ref(0);
|
|
|
|
const transformY = ref(0);
|
|
|
|
const preTransformX = ref(0);
|
|
|
|
const preTransformY = ref(0);
|
2022-04-24 01:59:09 +00:00
|
|
|
watch([x, y], () => {
|
|
|
|
if (!startedDrag.value) {
|
|
|
|
startX.value = x.value;
|
|
|
|
startY.value = y.value;
|
|
|
|
preTransformX.value = transformX.value;
|
|
|
|
preTransformY.value = transformY.value;
|
|
|
|
}
|
|
|
|
startedDrag.value = true;
|
|
|
|
});
|
2022-04-23 09:19:48 +00:00
|
|
|
watch(isDragging, () => {
|
2022-04-24 01:59:09 +00:00
|
|
|
if (!isDragging) {
|
|
|
|
startedDrag.value = false;
|
|
|
|
}
|
2022-04-23 09:19:48 +00:00
|
|
|
});
|
2022-01-06 08:08:53 +00:00
|
|
|
|
2022-04-23 09:19:48 +00:00
|
|
|
watchEffect(() => {
|
2022-04-24 01:59:09 +00:00
|
|
|
if (startedDrag.value) {
|
2022-04-23 09:19:48 +00:00
|
|
|
transformX.value = preTransformX.value + x.value - startX.value;
|
|
|
|
transformY.value = preTransformY.value + y.value - startY.value;
|
2022-01-06 08:08:53 +00:00
|
|
|
}
|
2022-04-23 09:19:48 +00:00
|
|
|
});
|
|
|
|
const transformStyle = computed<CSSProperties>(() => {
|
|
|
|
return {
|
|
|
|
transform: `translate(${transformX.value}px, ${transformY.value}px)`,
|
2022-01-06 08:08:53 +00:00
|
|
|
};
|
2022-04-23 09:19:48 +00:00
|
|
|
});
|
2022-01-06 08:08:53 +00:00
|
|
|
return {
|
|
|
|
visible,
|
|
|
|
showModal,
|
|
|
|
handleOk,
|
2022-04-23 09:19:48 +00:00
|
|
|
modalTitleRef,
|
|
|
|
transformStyle,
|
2022-01-06 08:08:53 +00:00
|
|
|
};
|
|
|
|
},
|
|
|
|
});
|
|
|
|
</script>
|