最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年06月06日 10:49:09   作者:csu_zipple  
這篇文章主要介紹了Vue使用自定義指令實(shí)現(xiàn)拖拽行為,結(jié)合實(shí)例形式分析了Vue使用自定義指令實(shí)現(xiàn)拖拽行為具體步驟、原理與操作注意事項(xiàng),需要的朋友可以參考下

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

需求

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

<div style="background: #f00; width: 200px; height: 200px;" v-drag>
  XXXX
</div>

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

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

比如:

<div style="background: #f00; width: 200px; height: 200px;" 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ì)有所幫助。

相關(guān)文章

  • vue基于element-china-area-data插件實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng)

    vue基于element-china-area-data插件實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng)

    省市區(qū)聯(lián)動(dòng)在日常開發(fā)中用的非常多,本文就介紹一下vue基于element-china-area-data插件實(shí)現(xiàn)省市區(qū)聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • 詳解vue組件基礎(chǔ)

    詳解vue組件基礎(chǔ)

    本篇文章給大家總結(jié)了vue組件基礎(chǔ)的相關(guān)知識(shí)點(diǎn)以及代碼實(shí)例,有需要的朋友可以學(xué)習(xí)參考下。
    2018-05-05
  • 基于Vue3.0開發(fā)輕量級(jí)手機(jī)端彈框組件V3Popup的場(chǎng)景分析

    基于Vue3.0開發(fā)輕量級(jí)手機(jī)端彈框組件V3Popup的場(chǎng)景分析

    這篇文章主要介紹了基于Vue3.0開發(fā)輕量級(jí)手機(jī)端彈框組件V3Popup,本文通過(guò)場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • vue里面v-bind和Props 利用props綁定動(dòng)態(tài)數(shù)據(jù)的方法

    vue里面v-bind和Props 利用props綁定動(dòng)態(tài)數(shù)據(jù)的方法

    今天小編就為大家分享一篇vue里面v-bind和Props 利用props綁定動(dòng)態(tài)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Vue3.0之引入Element-plus ui樣式的兩種方法

    Vue3.0之引入Element-plus ui樣式的兩種方法

    本文主要介紹了Vue3.0之引入Element-plus ui樣式的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 通過(guò)命令行創(chuàng)建vue項(xiàng)目的方法

    通過(guò)命令行創(chuàng)建vue項(xiàng)目的方法

    這篇文章主要介紹了通過(guò)命令創(chuàng)建vue項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Vue中原生template標(biāo)簽失效如何解決

    Vue中原生template標(biāo)簽失效如何解決

    這篇文章主要介紹了Vue中原生template標(biāo)簽失效如何解決,找了整一天也沒找著這事件為什么觸發(fā)不了,第二天意識(shí)到原生代碼里的template可能有問(wèn)題,在原生環(huán)境中template標(biāo)簽內(nèi)部的東西是不會(huì)渲染出來(lái)的,雖然解析器在加載頁(yè)面的時(shí)候確實(shí)會(huì)處理這部分代碼片段
    2023-02-02
  • Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局

    Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局

    這篇文章主要介紹了Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局,工作中難免遇到需要對(duì)頁(yè)面布局進(jìn)行拖拽然后改變布局,保存布局,下面文章就圍繞Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局的相關(guān)資料展開詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • vue3項(xiàng)目打包成apk(android)詳細(xì)圖文教程

    vue3項(xiàng)目打包成apk(android)詳細(xì)圖文教程

    Vue本身是一個(gè)構(gòu)建用戶界面的漸進(jìn)式框架,不能直接打包成APK文件,但是你可以使用工具將Vue應(yīng)用打包成一個(gè)可以在Android設(shè)備上安裝的APK文件,這篇文章主要給大家介紹了關(guān)于vue3項(xiàng)目打包成apk(android)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • vue實(shí)現(xiàn)圖書管理demo詳解

    vue實(shí)現(xiàn)圖書管理demo詳解

    這篇文章主要介紹了vue實(shí)現(xiàn)圖書管理,分享了圖書管理demo用的知識(shí)點(diǎn),以及遇到問(wèn)題的總結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

永顺县| 宁波市| 泰安市| 无锡市| 隆昌县| 东乌| 衢州市| 平武县| 托里县| 田林县| 静乐县| 花莲县| 密山市| 东乌珠穆沁旗| 肇源县| 南昌市| 缙云县| 延寿县| 南丹县| 府谷县| 华容县| 泰和县| 托克托县| 仪征市| 满城县| 青川县| 夏津县| 济南市| 高平市| 和田市| 南陵县| 嵩明县| 新邵县| 军事| 长白| 青岛市| 工布江达县| 文安县| 肇东市| 紫金县| 兴安盟|