Skip to content

Commit dd69527

Browse files
committed
doc: add drag modal
1 parent 38d7408 commit dd69527

File tree

4 files changed

+53
-54
lines changed

4 files changed

+53
-54
lines changed

components/modal/__tests__/__snapshots__/demo.test.js.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ exports[`renders ./components/modal/demo/manual.vue correctly 1`] = `
112112

113113
exports[`renders ./components/modal/demo/modal-render.vue correctly 1`] = `
114114
<div><button class="ant-btn ant-btn-primary" type="button">
115-
<!----><span>Open Draggable Modal</span>
115+
<!----><span>Open Modal</span>
116116
</button>
117117
<!---->
118118
</div>

components/modal/demo/index.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<width />
1414
<button-props />
1515
<fullscreen />
16+
<modalRenderVue />
1617
</demo-sort>
1718
</template>
1819
<script lang="ts">
@@ -29,6 +30,7 @@ import ConfirmPromise from './confirm-promise.vue';
2930
import Width from './width.vue';
3031
import Fullscreen from './fullscreen.vue';
3132
import ButtonProps from './button-props.vue';
33+
import modalRenderVue from './modal-render.vue';
3234
import CN from '../index.zh-CN.md';
3335
import US from '../index.en-US.md';
3436
import { defineComponent } from 'vue';
@@ -49,6 +51,7 @@ export default defineComponent({
4951
Width,
5052
ButtonProps,
5153
Fullscreen,
54+
modalRenderVue,
5255
},
5356
setup() {
5457
return {};

components/modal/demo/modal-render.vue

Lines changed: 48 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,96 +4,91 @@ order: 13
44
title:
55
zh-CN: 自定义渲染对话框
66
en-US: Custom modal content render
7-
debugger: true
87
---
98

109
## zh-CN
1110

12-
自定义渲染对话框, 可通过 `react-draggable` 来实现拖拽。
11+
自定义渲染对话框, 可通过 `vueuse` 来实现拖拽。
1312

1413
## en-US
1514

16-
Custom modal content render. use `react-draggable` implements draggable.
15+
Custom modal content render. use `vueuse` implements draggable.
1716

1817
</docs>
1918

2019
<template>
2120
<div>
22-
<a-button type="primary" @click="showModal">Open Draggable Modal</a-button>
23-
<a-modal v-model:visible="visible" @ok="handleOk">
21+
<a-button type="primary" @click="showModal">Open Modal</a-button>
22+
<a-modal ref="modalRef" v-model:visible="visible" @ok="handleOk">
23+
<p>Some contents...</p>
24+
<p>Some contents...</p>
25+
<p>Some contents...</p>
2426
<template #title>
25-
<div
26-
class="drag"
27-
style="width: 100%; cursor: move"
28-
@mouseover="handleMouseover"
29-
@mouseout="handleMouseout"
30-
@focus="() => {}"
31-
@blur="() => {}"
32-
>
33-
Draggable Modal
34-
</div>
27+
<div ref="modalTitleRef" style="width: 100%; cursor: move">Draggable Modal</div>
3528
</template>
36-
<p>
37-
Just don&apos;t learn physics at school and your life will be full of magic and miracles.
38-
</p>
39-
<br />
40-
<p>Day before yesterday I saw a rabbit, and yesterday a deer, and today, you.</p>
4129
<template #modalRender="{ originVNode }">
42-
<VueDragResize is-active drag-handle=".drag" :is-resizable="false">
43-
<component :is="originVNode"></component>
44-
</VueDragResize>
30+
<div :style="transformStyle">
31+
<component :is="originVNode" />
32+
</div>
4533
</template>
4634
</a-modal>
4735
</div>
4836
</template>
4937
<script lang="ts">
50-
import { defineComponent, ref } from 'vue';
51-
import type { CSSProperties } from 'vue';
52-
import VueDragResize from 'vue-drag-resize';
38+
import { defineComponent, ref, computed, CSSProperties, watch, watchEffect } from 'vue';
39+
import { useDraggable } from '@vueuse/core';
5340
export default defineComponent({
54-
components: {
55-
VueDragResize,
56-
},
5741
setup() {
5842
const visible = ref<boolean>(false);
59-
const draggleRef = ref();
60-
const disabled = ref(true);
61-
const bounds = ref<CSSProperties>({ left: 0, top: 0, width: 520, height: 0 });
43+
const modalTitleRef = ref<HTMLElement>(null);
6244
const showModal = () => {
6345
visible.value = true;
6446
};
65-
47+
const { x, y, isDragging } = useDraggable(modalTitleRef);
6648
const handleOk = (e: MouseEvent) => {
6749
console.log(e);
6850
visible.value = false;
6951
};
52+
const startX = ref<number>(0);
53+
const startY = ref<number>(0);
54+
const startUpdatePos = ref(false);
55+
const transformX = ref(0);
56+
const transformY = ref(0);
57+
const preTransformX = ref(0);
58+
const preTransformY = ref(0);
59+
let timeoutId;
60+
watch(isDragging, () => {
61+
clearTimeout(timeoutId);
62+
timeoutId = setTimeout(() => {
63+
if (isDragging.value) {
64+
startX.value = x.value;
65+
startY.value = y.value;
66+
preTransformX.value = transformX.value;
67+
preTransformY.value = transformY.value;
68+
startUpdatePos.value = true;
69+
} else {
70+
startUpdatePos.value = false;
71+
}
72+
});
73+
});
7074
71-
const onStart = (_event, uiData) => {
72-
const { clientWidth, clientHeight } = window.document.documentElement;
73-
const targetRect = draggleRef.value?.getBoundingClientRect();
74-
if (!targetRect) {
75-
return;
75+
watchEffect(() => {
76+
if (startUpdatePos.value) {
77+
transformX.value = preTransformX.value + x.value - startX.value;
78+
transformY.value = preTransformY.value + y.value - startY.value;
7679
}
77-
bounds.value = {
78-
left: `${-targetRect.left + uiData.x}px`,
79-
right: `${clientWidth - (targetRect.right - uiData.x)}`,
80-
top: `${-targetRect.top + uiData.y}`,
81-
bottom: `${clientHeight - (targetRect.bottom - uiData.y)}`,
80+
});
81+
const transformStyle = computed<CSSProperties>(() => {
82+
return {
83+
transform: `translate(${transformX.value}px, ${transformY.value}px)`,
8284
};
83-
};
85+
});
8486
return {
8587
visible,
8688
showModal,
8789
handleOk,
88-
onStart,
89-
handleMouseover() {
90-
if (disabled.value) {
91-
disabled.value = false;
92-
}
93-
},
94-
handleMouseout() {
95-
disabled.value = true;
96-
},
90+
modalTitleRef,
91+
transformStyle,
9792
};
9893
},
9994
});

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
"@vue/eslint-config-prettier": "^6.0.0",
127127
"@vue/eslint-config-typescript": "^9.0.0",
128128
"@vue/test-utils": "^2.0.0-0",
129+
"@vueuse/core": "^8.3.1",
129130
"@webpack-cli/serve": "^1.3.1",
130131
"acorn": "^8.0.0",
131132
"ali-oss": "^6.16.0",

0 commit comments

Comments
 (0)