好的,以下是如何在 Vue 3 中使用 hook 写一个 drag 的示例:
import { ref, onUnmounted, onMounted, onUpdated } from 'vue'
export default function useDrag() {
const x = ref(0)
const y = ref(0)
let isDragging = false
let currentX
let currentY
let initialX
let initialY
let xOffset = 0
let yOffset = 0
const dragStart = (e) => {
initialX = e.clientX - xOffset
initialY = e.clientY - yOffset
if (e.target === e.currentTarget) {
isDragging = true
currentX = e.clientX
currentY = e.clientY
e.preventDefault()
}
}
const dragEnd = (e) => {
initialX = currentX
initialY = currentY
isDragging = false
}
const drag = (e) => {
if (isDragging) {
e.preventDefault()
xOffset = e.clientX - initialX
yOffset = e.clientY - initialY
x.value = xOffset
y.value = yOffset
}
}
onMounted(() => {
window.addEventListener('mousedown', dragStart)
window.addEventListener('mouseup', dragEnd)
window.addEventListener('mousemove', drag)
})
onUpdated(() => {
if (!isDragging) {
xOffset = 0
yOffset = 0
}
})
onUnmounted(() => {
window.removeEventListener('mousedown', dragStart)
window.removeEventListener('mouseup', dragEnd)
window.removeEventListener('mousemove', drag)
})
return { x, y }
}