From c0394bb9ac87a2df49afd6c3b487f3f949526dad Mon Sep 17 00:00:00 2001 From: imguolao Date: Sat, 27 Aug 2022 01:28:41 +0800 Subject: [PATCH] feat(useDraggable): Support trigger handle --- packages/core/useDraggable/component.ts | 1 + packages/core/useDraggable/demo.vue | 21 +++++++++++++++++++++ packages/core/useDraggable/index.ts | 20 ++++++++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/core/useDraggable/component.ts b/packages/core/useDraggable/component.ts index d2d35669ead..897c97d34f8 100644 --- a/packages/core/useDraggable/component.ts +++ b/packages/core/useDraggable/component.ts @@ -29,6 +29,7 @@ export const UseDraggable = defineComponent({ 'stopPropagation', 'pointerTypes', 'as', + 'handle', ] as unknown as undefined, setup(props, { slots }) { const target = ref() diff --git a/packages/core/useDraggable/demo.vue b/packages/core/useDraggable/demo.vue index ea09d11f02f..a0f1ba97f3c 100644 --- a/packages/core/useDraggable/demo.vue +++ b/packages/core/useDraggable/demo.vue @@ -53,5 +53,26 @@ const { x, y, style } = useDraggable(el, { {{ Math.round(x) }}, {{ Math.round(y) }} + + +
+ 👋 Drag here! +
+
+ Handle that triggers the drag event +
+
+ I am at {{ Math.round(x) }}, {{ Math.round(y) }} +
+
diff --git a/packages/core/useDraggable/index.ts b/packages/core/useDraggable/index.ts index 606955c95d4..cef531fecef 100644 --- a/packages/core/useDraggable/index.ts +++ b/packages/core/useDraggable/index.ts @@ -1,6 +1,6 @@ import { computed, ref } from 'vue-demi' import type { MaybeComputedRef } from '@vueuse/shared' -import { isClient, resolveUnref, toRefs } from '@vueuse/shared' +import { isClient, isString, resolveUnref, toRefs, tryOnMounted } from '@vueuse/shared' import { useEventListener } from '../useEventListener' import type { PointerType, Position } from '../types' import { defaultWindow } from '../_configurable' @@ -34,6 +34,11 @@ export interface UseDraggableOptions { */ draggingElement?: MaybeComputedRef + /** + * Handle that triggers the drag event + */ + handle?: MaybeComputedRef + /** * Pointer types that listen to. * @@ -64,6 +69,16 @@ export interface UseDraggableOptions { onEnd?: (position: Position, event: PointerEvent) => void } +function normalizeHandle(handle: UseDraggableOptions['handle']) { + const unrefHandle = resolveUnref(handle) + if (isString(unrefHandle)) { + const newHandle = ref(null) + tryOnMounted(() => newHandle.value = document.querySelector(unrefHandle)) + return newHandle + } + return handle as MaybeComputedRef +} + /** * Make elements draggable. * @@ -73,6 +88,7 @@ export interface UseDraggableOptions { */ export function useDraggable(target: MaybeComputedRef, options: UseDraggableOptions = {}) { const draggingElement = options.draggingElement ?? defaultWindow + const draggingHandle = normalizeHandle(options.handle) ?? target const position = ref(resolveUnref(options.initialValue) ?? { x: 0, y: 0 }) const pressedDelta = ref() @@ -127,7 +143,7 @@ export function useDraggable(target: MaybeComputedRef