vue 使用自定義指令實現(xiàn)元素拖拽

1.在項目src目錄下可以新建一個文件夾 ,取名為 directive ,在該目錄中創(chuàng)建drag.js , 代碼如下:

/**
 * @file 自定義拖拽命令
 */

import Vue from 'vue';
 
export default   {
            bind(el: any) {
                el.style.position = 'absolute';
                el.style.zIndex = el.style.zIndex || '3000';
            },

            inserted(el: any) {
                // 設置元素初始位置
                const boundingClientRect = el.getBoundingClientRect();
                el.style.left = boundingClientRect.x + 'px';
                el.style.top = boundingClientRect.y + 'px';
                // 將拖拽元素置于body子元素,防止被relative的父元素遮擋
                document.body.appendChild(el);

                let originX: number;
                let originY: number;
                const mouseDownHandler = (evt: MouseEvent) => {
                    originX = evt.clientX - el.offsetLeft;
                    originY = evt.clientY - el.offsetTop;
                    el.style.cursor = 'pointer';
                };
                const mouseMoveHandler = (evt: MouseEvent) => {
                    if (evt.buttons === 1 && originX && originY) {
                        el.style.left = evt.clientX - originX + 'px';
                        el.style.top = evt.clientY - originY + 'px';
                    }
                };
                const mouseUpHandler = () => {
                    el.style.cursor = 'default';
                };
                el.addEventListener('mousedown', mouseDownHandler);
                el.addEventListener('mousemove', mouseMoveHandler);
                el.addEventListener('mouseup', mouseUpHandler);
                el.__mouseDownHandler__ = mouseDownHandler;
                el.__mouseMoveHandler__ = mouseMoveHandler;
                el.__mouseUpHandler__ = mouseUpHandler;
            },

            unbind(el: any) {
                el.removeEventListener('mousedown', el.__mouseDownHandler__);
                el.removeEventListener('mousemove', el.__mouseMoveHandler__);
                el.removeEventListener('mouseup', el.__mouseUpHandler__);
                // 當父組件銷毀觸發(fā)unbind的時候需要手動刪除這個節(jié)點,不然會一直存留在body中
                el.parentNode.removeChild(el);
            }
}

2.在當前文件夾里新建index.js

import drag from "./drag .js";

var xhDirective = {
    drag :drag ,
}

const install = function(Vue) {
    Object.keys(xhDirective).forEach(key => {
        Vue.directive(key, xhDirective[key]);
    });
    
};

const API = {
    install,
    ...xhDirective
};

export default API;

3.在項目的主文件mian.js中引入,使用vue.use()來注冊系統(tǒng) 的公共指令(部分代碼)

import Vue from 'vue';
import directive from "./directive"
Vue.use(directive)

注:拖拽效果實現(xiàn)代碼原文鏈接:https://blog.csdn.net/csu_passer/article/details/105709661

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容