最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 使用vue3自定义指令实现一个拖拽指令

    正文概述 掘金(啥都不会的小前端)   2021-07-12   921

    自定义指令-拖拽

    前言

    vue3正式版已经发布大半年了,咱也得紧跟时代潮流,vue3带来的很多改变,使用ts重写代码,在兼容vue2语法的基础上,增加了很多新语法,比如新增了组合api,也移除了一些旧语法

    什么是自定义指令

    vue提供了很多内置的指令例如 v-model,v-show,v-for 等,这些指令极大的帮助我们提示开发效率,除了这些内置指令,vue也允许我们自定义自己的指令,vue3升级后,为了更好的与组件生命周期保持一致,指令的钩子函数被重命名了

    2.x语法

    • bind - 指令绑定到元素后发生。只发生一次。
    • inserted - 元素插入父 DOM 后发生。
    • update - 当元素更新,但子元素尚未更新时,将调用此钩子。
    • componentUpdated - 一旦组件和子级被更新,就会调用这个钩子。
    • unbind - 一旦指令被移除,就会调用这个钩子。也只调用一次。

    3.x语法

    • created - 新的!在元素的 attribute 或事件侦听器应用之前调用。
    • bind → beforeMount
    • inserted → mounted
    • beforeUpdate:新的!这是在元素本身更新之前调用的,很像组件生命周期钩子。
    • update → 移除!有太多的相似之处要更新,所以这是多余的,请改用 updated。
    • componentUpdated → updated
    • beforeUnmount:新的!与组件生命周期钩子类似,它将在卸载元素之前调用。
    • unbind -> unmounted

    实现一个拖拽指令

    先创建一个vue项目,根据自己喜好配置项目,我选择的是ts

    npm install -g @vue/cli
    vue create my-project
    

    先创建一个需要拖拽的小方块

    import { defineComponent } from "vue";
    import "./style.scss";
    export default defineComponent({
      name: "Drag",
      render() {
        return <div class="rect"></div>;
      },
    });
    
    

    样式scss

    .rect {
      width: 100px;
      height: 100px;
      background-color:peru;
      position: absolute;
    }
    

    使用vue3自定义指令实现一个拖拽指令

    clientX,clientY,offsetLeft,offsetTop

    实现拖拽需要用到以下属性

    • clientX和clientY是一个只读属性,可以获取当前鼠标在客户端的水平坐标 (与页面坐标不同),如点击页面左上角为0,无论是否出现滚动条
    • offsetLeft.offsetTop 只读属性,返回当前元素相对于 HTMLElement.offsetParent 节点的左边界偏移的像素值

    自定义指令局部注册

    可以在当前实例上添加directives属性来实现自定义指令,先初始化一个drag指令,这样我们就可以在vue里使用v-drag

      name: "Drag",
      directives: {
        drag: {
        },
      },
    

    因为需要操作dom实例,所以我们使用mounted这个钩子函数,并给当前el添加鼠标按下事件,并记录当前鼠标按下坐标mouseXStart,mouseYStart和当前滑块距离当前父节点的偏移量rectLeft,rectTop,再按下后,我们给document添加鼠标移动事件,每次移动记录当前鼠标坐标,滑块移动的距离就是mouseXEnd - mouseXStart + rectLeft和mouseYEnd - mouseYStart + rectTop,在鼠标抬起后,将move事件清空,不然会一直移动(这里要注意的是我给document添加监听事件,是因为如果给滑块添加事件,当鼠标移动过快,鼠标移出el会出现计算错误)

    export default defineComponent({
      name: "Drag",
      directives: {
        drag: {
          mounted(el: HTMLDivElement) {
            el.onmousedown = (ev) => {
              console.log(ev);
              // 鼠标按下的位置
              const mouseXStart = ev.clientX;
              const mouseYStart = ev.clientY;
              console.log("按下开始", mouseXStart, mouseYStart);
              // 当前滑块位置
              const rectLeft = el.offsetLeft;
              const ,rectTop = el.offsetTop;
              document.onmousemove = (e) => {
                // 鼠标移动的位置
                const mouseXEnd = e.clientX;
                const mouseYEnd = e.clientY;
                const moveX = mouseXEnd - mouseXStart + rectLeft;
                const moveY = mouseYEnd - mouseYStart + rectTop;
                console.log(rectLeft, rectTop);
                el.style["top"] = moveY + "px";
                el.style["left"] = moveX + "px";
              };
              document.onmouseup = () => {
                console.log("鼠标抬起");
                // 取消事件
                document.onmousemove = null;
              };
            };
          },
        },
      },
      render() {
        return <div class="rect" v-drag></div>;
      },
    });
    

    这样就实现了一个简单的拖拽指令

    第一次写文章,大佬们轻点喷


    起源地下载网 » 使用vue3自定义指令实现一个拖拽指令

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元