1. 程式人生 > 實用技巧 >vue-directive自定義指令實現拖拽

vue-directive自定義指令實現拖拽

vue擁用很多強大的指令,但有些邏輯無法實現,所以vue提供了directive自定義指令由開發者任意擴充套件,本文自定義一個拖拽功能的指令

一、效果圖如下

指令的使用:自定義拖拽的初始位置(left,top),不傳參預設為0,即在左上角


二、思路詳解

1、首先需要清楚指令裡面有哪些引數,第一個引數el是繫結元素

2、第二個引數一個物件(包含指令name,value,argument等),繫結指令那裡傳參,這裡接收引數並寫邏輯

三、附上具體實現程式碼

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 120px;
            height: 120px;
            background-color: #eee;
        }
    </style>
</head>

<body>
</body>
<div id="app">
    <button v-drag>點選</button>
    <div class="box" v-drag:[place]></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>

    Vue.directive('drag', {
        inserted: function (el, bancing) {
            console.log(bancing)**
            if (bancing.arg) {
                **l = bancing.arg.left;
                t = bancing.arg.top;
            } else {**
                l = t = 0;**
            }**
            el.style.position = 'absolute';
            **el.style.left = l + 'px';
            el.style.top = t + 'px';
            el.onmousedown = function (e) {
                var x = e.offsetX;
                var y = e.offsetY;
                document.onmousemove = function (eve) {
                    var left = eve.clientX - x;
                    var top = eve.clientY - y;
                    el.style.left = left + 'px';
                    **el.style.top = top + 'px';**
                }
                document.onmouseup = function (eve) {**
                    document.onmousemove = null;**
                    document.onmouseup = null;**
                }
            }
        }
    })
    new Vue({
        el: '#app',
        data: {
            place: {
                left: 100,
                top: 100
            }
        }
    })
</script>

</html>