亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Vue使用自定義指令實(shí)現(xiàn)拖拽行為實(shí)例分析

瀏覽:46日期:2023-01-15 09:37:28

本文實(shí)例講述了Vue使用自定義指令實(shí)現(xiàn)拖拽行為。分享給大家供大家參考,具體如下:

需求

通過(guò)自定義指令的方式實(shí)現(xiàn)拖拽效果,預(yù)期的使用方式為:

<div v-drag> XXXX</div>

更重要的一個(gè)需求點(diǎn):

拖拽元素內(nèi)部的子元素可以自行阻止拖拽行為

比如:

<div v-drag> <el-button @mousedown.native.stop>test</el-button></div>

曾經(jīng)使用過(guò)vue-resizable,由于該組件是通過(guò)事件捕獲的方式實(shí)現(xiàn)的,拖拽元素的子元素也會(huì)觸發(fā)拖拽行為,不符合開發(fā)需求,所以自行實(shí)現(xiàn)了拖拽指令,相關(guān)源碼如下。

無(wú)任何依賴,復(fù)制即可使用

源碼

/** * @file 自定義拖拽命令 */import Vue from ’vue’;const Drag = { install(Vue: any) { // 如需禁止拖拽元素內(nèi)部某些元素觸發(fā)拖拽,在內(nèi)部不可觸發(fā)拖拽元素上添加@mousedown.native.stop即可 Vue.directive(’drag’, { bind(el: any) {el.style.position = ’absolute’;el.style.zIndex = el.style.zIndex || ’3000’; }, inserted(el: any) {// 設(shè)置元素初始位置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__);// 當(dāng)父組件銷毀觸發(fā)unbind的時(shí)候需要手動(dòng)刪除這個(gè)節(jié)點(diǎn),不然會(huì)一直存留在body中el.parentNode.removeChild(el); } }); }};Vue.use(Drag);export default Drag;

希望本文所述對(duì)大家vue.js程序設(shè)計(jì)有所幫助。

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 欧美高清一区二区三 | 成人综合国产乱在线 | 最近韩国日本免费免费版 | 成年人免费在线视频网站 | 欧美特黄高清免费观看的 | 婷婷国产成人久久精品激情 | 老人久久www免费人成看片 | 国产精品v在线播放观看 | 男人桶女人暴爽的视频 | 人久热欧美在线观看量量 | 国产精品高清一区二区 | 成人免费网站在线观看 | 亚洲毛片在线观看 | 国产成人在线网址 | 日韩久久久精品首页 | 手机看黄av免费网址 | 亚洲国产精品综合久久网络 | 亚洲va久久久噜噜噜久久狠狠 | 国产农村乱 | 国产99精品在线观看 | 成人a毛片在线看免费全部播放 | 欧美一级视频在线观看 | 成人a视频| 99在线观看巨臀大臀视频 | 久久91视频 | 成人a毛片视频免费看 | 久久成人18免费网站 | 草草久久97超级碰碰碰免费 | 欧美成人影院免费观 | 国产日韩欧美在线一二三四 | 自拍视频啪 | 日本一极毛片兔费看 | 国产欧美成人不卡视频 | 99热热久久这里只有精品166 | 国产一区中文字幕在线观看 | 91不卡在线精品国产 | 在线观看免费国产成人软件 | 国产精品一级毛片不收费 | 性刺激欧美三级在线现看中文 | 国产成人啪一区二区 | 拍真实国产伦偷精品 |