vue 自定义指令,vue中使用拖拽事件

19 篇文章 0 订阅

记录一下自己学习vue中书写项目中遇到的问题。
由于项目需求需要写拖拽事件(需求,是一个按钮,可以在页面上自由拖拽点击),自己定义后,最开始想到的是利用ref获取div标签,在对其进行dom操作,发现不行。在查看官方文档发现了自定义指令(自己学习的时候漏掉的知识点),但是一直有个问题,就是拖拽后点击事件也触发了。
这是因为两个原因:

  • 拖拽事件放在了点击事件外
//最初的代码
<div v-drag>
	<el-button @click="clickButton">点击</el-button>
</div>
//js
directives: {
    drag: {
      // 指令的定义
      inserted: function(el, binding) {
        // el.drag();
        // 获取元素
        let x = 0
        let y = 0
        let l = 0
        let t = 0
        let isDown = false
        // 鼠标按下事件
        el.onmousedown = function(e) {
          // 获取x坐标和y坐标
          x = e.clientX
          y = e.clientY
          // 获取左部和顶部的偏移量
          l = el.offsetLeft
          t = el.offsetTop
          // 开关打开
          isDown = true
          // 设置样式
          el.style.cursor = 'move'
          // 鼠标移动
          el.onmousemove = function(e) {
            if (isDown == false) {
              return
            }
            // 获取x和y
            const nx = e.clientX
            const ny = e.clientY
            // 计算移动后的左偏移量和顶部的偏移量
            const nl = nx - (x - l)
            const nt = ny - (y - t)
            this.dragX = nl
            el.style.left = nl + 'px'
            el.style.top = nt + 'px'
            // 获取鼠标移动
            this.dragOnmousemove = false
          }
        }
        // 鼠标抬起事件
        el.onmouseup = function() {
          // 开关关闭
          isDown = false
          // moveClick = false
          el.style.cursor = 'default'
          return
        }
      }
    }
  },

这样就是每次移动后就执行了button按钮中的点击事件,随后更改,把点击事件放入div中,直接用自定义指令操作,定义一个变量来记录

el.onclick = function() {
          console.log(moveClick)
          if (moveClick) {
            moveClick = false
            return
          }
        }

这样也有问题,就是获取不到我需要的参数,在之定义指令获取不到data(){}中的值并且去改变他
这个时候我们需要借助函数拿去数据.

  • 完整获取代码
<div
      ref="div"
      v-drag="{ set: set }"
      :style="{
        width: dragWidth + 'px',
        height: dragHeight + 'px',
        right: dragRight + 'px',
        top: dragTop + 'px',
        position: 'absolute'
      }"
    >
      <el-button
        size="medium"
        type="success"
        class="button_quality"
        circle
      >质检</el-button>
    </div>

// 中间函数执行
set(dragVisible) {
//dragVisible   是从自定义函数中出过来的值
      this.dragVisible = dragVisible
    },
// 自定义函数
 // 自定义指令指向鼠标拖动按钮
  directives: {
    drag: {
      // 指令的定义   el 是指的dom元素  binding是一个对象
      inserted: function(el, binding) {
      
        // el.drag();
        // 获取元素
        let x = 0
        let y = 0
        let l = 0
        let t = 0
        let isDown = false
        let moveClick = false
        // 鼠标按下事件
        el.onmousedown = function(e) {
          // 获取x坐标和y坐标
          x = e.clientX
          y = e.clientY
          // 获取左部和顶部的偏移量
          l = el.offsetLeft
          t = el.offsetTop
          // 开关打开
          isDown = true
          // 设置样式
          el.style.cursor = 'move'
          // 鼠标移动
          el.onmousemove = function(e) {
            // 记录鼠标事件
            moveClick = true
            if (isDown == false) {
              return
            }
            // 获取x和y
            const nx = e.clientX
            const ny = e.clientY
            // 计算移动后的左偏移量和顶部的偏移量
            const nl = nx - (x - l)
            const nt = ny - (y - t)
            this.dragX = nl
            el.style.left = nl + 'px'
            el.style.top = nt + 'px'
            // 获取鼠标移动
            this.dragOnmousemove = false
          }
        }
        // 鼠标抬起事件
        el.onmouseup = function() {
          // 开关关闭
          isDown = false
          // moveClick = false
          el.onmousemove = null
          el.style.cursor = 'default'
          return
        }

        el.onclick = function() {
          console.log(moveClick)
          if (moveClick) {
            moveClick = false
            return
          }
          console.log('++++++++++++++')
          // 调用set函数传值
          binding.value.set(true)
        }
      }
    }
  },

vue只能给定义指令官网:https://cn.vuejs.org/v2/guide/custom-directive.html
博主个人小博客:嘿嘿
本篇文章:点击

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值