zoukankan      html  css  js  c++  java
  • vue3 写一个简单的拖拽指令

    vue3 的指令对比vue 2的变更,官方给出两点总结(目前)

    • API 已重命名,以便更好地与组件生命周期保持一致
    • 自定义指令将由子组件通过 v-bind="$attrs

    1. vue3 指令的最终api 

    const MyDirective = {
      beforeMount(el, binding, vnode, prevVnode) {},
      mounted() {},
      beforeUpdate() {},
      updated() {},
      beforeUnmount() {}, //
      unmounted() {}
    }

    2. 基于面向对象写的拖拽

     1 class Drap{
     2     static zIndex = 1;
     3     constructor(el,option={}){
     4         this.el = el;
     5         this.x=0;
     6         this.y=0;
     7         this.option = option;
     8         this.init();
     9     }
    10     init(){
    11         this.setEleStyle(this.option||{});
    12         this.el.onmousedown =(e)=>{
    13             this.onMouseDown(e)
    14             this.el.setCapture&&this.el.setCapture() //全局捕获
    15             return false
    16         }
    17        
    18     }
    19     //样式设置
    20     setEleStyle(option){
    21         for (const key in option) {
    22             this.el.style[key] = option[key]
    23         }
    24     }
    25 
    26     //按下ele
    27     onMouseDown(e){
    28         let zIndex = getComputedStyle(this.el).getPropertyValue('z-index');
    29         zIndex=isNaN(zIndex)?1:zIndex
    30         Drap.zIndex =Drap.zIndex>zIndex?Number(Drap.zIndex)+1:Number(zIndex)+1
    31         this.setEleStyle({"zIndex":Drap.zIndex,position:'fixed','cursor': 'move'})
    32         this.x = e.clientX-this.el.offsetLeft;
    33         this.y= e.clientY-this.el.offsetTop;
    34         document.onmousemove=(e)=>this.onMouseMove(e);
    35         document.onmouseup = (e)=>this.onMouseUp(e)
    36     }
    37     //移动move
    38     onMouseMove(e){
    39         let X = e.clientX-this.x
    40         let Y = e.clientY-this.y;
    41         if(X<10-this.el.offsetWidth){
    42             X=10-this.el.offsetWidth
    43         }else if(X>document.documentElement.clientWidth-10){
    44             X =document.documentElement.clientWidth-10
    45         }
    46         if(Y<10-this.el.clientHeight){
    47             Y=10-this.el.clientHeight
    48         }else if(Y>document.documentElement.clientHeight-10){
    49             Y =document.documentElement.clientHeight-10
    50         }
    51         this.el.style.left = X+'px'
    52         this.el.style.top = Y+'px'
    53     }
    54     //释放
    55     onMouseUp(e){
    56         document.onmousemove = null
    57         document.onmouseup =null
    58         this.setEleStyle({'cursor': 'pointer'})
    59         this.el.setCapture&&this.el.setCapture() //释放全局捕获
    60 
    61     } 
    62 }

    3. 将封装好的拖拽整合在指令上

    //src/directive/drag.js
    export const  drag = {
        mounted(el, binding) { 
            new Drap(el,binding.value||{})
        }
    }

    4.  导入注册在当前app 实例

    //src/main.js
    import {drag} from  "./directive/drag"
    app.directive('drag', drag)
    app.mount('#app')

    5. 在组件中用

    <template>
        <div>
            <div class="box" v-drag="{'zIndex':100}">1</div>
             <div class="box" v-drag>2</div>
        </div>
    </template>
    <style scoped>
    .box{
         100px;
        height: 100px;
        background: red;
    }
    </style>
  • 相关阅读:
    媒体格式分析之flv -- 基于FFMPEG
    x264源代码分析-转
    比特币的相关问题整理(详细的)
    比特币价格首超黄金 年涨幅超7600%
    比特币不是虚拟货币,这是一个真实世界----李笑来
    比特币投机者嘲笑称比特币为泡沫的人原因
    比特币:一个让投资人为之疯狂的神奇货币
    比特币沉浮录
    比特币淘金热席卷中国专业“挖矿机”受疯抢
    国内首起比特币交易平台诈骗案涉案人被捕
  • 原文地址:https://www.cnblogs.com/beyonds/p/13908289.html
Copyright © 2011-2022 走看看