vue3 写一个drag的hook

该文章提供了一个在Vue3中使用自定义hook实现元素拖动功能的代码示例,主要涉及ref绑定变量、事件处理(dragStart,dragEnd,drag)以及组件生命周期钩子(onMounted,onUpdated,onUnmounted)的应用,用于管理拖动过程中的坐标和状态。
摘要由CSDN通过智能技术生成

好的,以下是如何在 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 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值