亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue 實現(xiàn)可拖曳的樹狀結(jié)構(gòu)圖

 更新時間:2021年04月12日 10:25:35   作者:YouKnow_HRT  
這篇文章主要介紹了vue 實現(xiàn)可拖曳的樹狀結(jié)構(gòu)圖,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下

最近用vue做了一個小項目--可拖曳的樹狀結(jié)構(gòu)圖。

Vue遞歸組件

結(jié)構(gòu)通過Vue的遞歸組件實現(xiàn)

布局使用flex,結(jié)構(gòu)線由CSS偽類實現(xiàn)

需要注意的是居中布局,當X軸元素過多導致子元素寬度超出視圖,元素居中后雖然有滾動條,但只能到達右邊的內(nèi)容,左邊的內(nèi)容會無法訪問,可以把父元素設置為inline-flex,寬度設置為auto。當然,如果是上述的結(jié)構(gòu)則不會有這個問題,但遇到大數(shù)據(jù)渲染,還是困擾我了一下午。

drag事件

首先在需要在拖動的元素上綁定draggable屬性,除了<a>和<img>標簽設默認為true,其他元素都需要設置下

然后是三個事件dragenddragover、drop(用Vue寫的,就不在事件前加on了)

注意dragover需要去除默認行為,在事件中給上$event.preventDefault(),否則拖曳時鼠標會有🚫標志,使拖動無效。

drag的元素把值傳到drop的位置,需要使用$event.dataTransfer.setData("node", transNodeData)

"node"是相當于傳遞數(shù)據(jù)的變量名,需要先JSON.stringify()

methods:{
    dragstart(e,nodeObj){
      console.log('🐉drag移動的點位',nodeObj.name,);
      let transData=JSON.stringify(nodeObj)//拖曳傳遞過去的數(shù)據(jù)先轉(zhuǎn)為JSON格式
      e.dataTransfer.setData("node",transData)
    },
    dragover(e){
      e.preventDefault()
    },
    drop(e,nodeObj){
      console.log('🐉drop到的點位',nodeObj.name);
      let getData=JSON.parse( e.dataTransfer.getData("node"))
      console.log('獲取了數(shù)據(jù)',getData);
    }
  }

了解了這一點,接下來要做的就是把獲取的拖曳點位數(shù)據(jù)放到放置點位的children數(shù)組中,并在dragend事件中把拖曳點位在父節(jié)點children數(shù)組中刪除,節(jié)點的索引在dragstart事件觸發(fā)時就獲取,并通過eventBus這一組件通信方式傳遞給dragend(也可以使用Vuex)。

創(chuàng)建bus文件夾,新建index.js文件

import Vue from "vue"
const busEvent= new Vue({
  data(){
    return{
      dragNodeIndex:-1,//拖曳節(jié)點在父節(jié)點children數(shù)組中的index
    }
  },
  created(){
    this.$on("transDragNodeIndex", res=>{//通過$on來監(jiān)聽$emit,需要確保自定義事件在觸發(fā)前被監(jiān)聽,也就是訂閱先于發(fā)布,否則無法監(jiān)聽到數(shù)據(jù),我eventBus沒怎么用過,這算是個坑
      this.dragNodeIndex=res
    })
  }
})

export default busEvent

在組件中引入eventBus,此時在dragstart中通過$emit觸發(fā)自定義事件后,$on就可以接收到這個數(shù)據(jù),在dragend中,可以通過eventBus獲取這一索引,然后在數(shù)組中刪除

接下來就是做一些邏輯判斷,例如父節(jié)點不能拖曳到子節(jié)點,先通過遞歸方式把父節(jié)點上所有子節(jié)點的name遍歷進一個數(shù)組,如果drop位置的name在數(shù)組中就表明父到子了,設置狀態(tài)為true,

ifFatherDragToSon(dragObj,dropObj){//判斷是否父節(jié)點移動到了子節(jié)點
      if (dragObj.children.length === 0) return false;
      let newArr = [];
      function getAllName(dragObj) {
        newArr.push(...dragObj.children);
        if (dragObj.children.length === 0) {
          return;
        } else {
          for (let i = 0; i < dragObj.children.length; i++) {
            getAllName(dragObj.children[i]);
          }
        }
      }
      getAllName(dragObj);
      if (newArr.includes(dropObj)) {
        return true;
      }
      return false;
    }

通過eventBusdragend事件獲取狀態(tài),為true直接return

拖曳到自身也不行,直接return。特意在拎壺沖點位下加了個子節(jié)點,主要就是為了驗證通過節(jié)點在棧中的地址來判斷,而不是依據(jù)name屬性

再一個就是提一下drag事件中的$event.dataTransfer.dropEffect,可以獲取的值為movecopy、nonelink,下圖中當dropEffect為🚫時拖曳點位消失了,其實就是執(zhí)行了dragend事件中的代碼,而drop事件中的代碼未執(zhí)行,所以這一步需要先做流程控制。另外說明,不同瀏覽器的默認dropEffect也是不同的,比如360瀏覽器。

代碼連接

以上就是vue 實現(xiàn)可拖曳的樹狀結(jié)構(gòu)圖的詳細內(nèi)容,更多關于vue 實現(xiàn)樹狀結(jié)構(gòu)圖的資料請關注腳本之家其它相關文章!

相關文章

  • 基于vue2.0動態(tài)組件及render詳解

    基于vue2.0動態(tài)組件及render詳解

    下面小編就為大家分享一篇基于vue2.0動態(tài)組件及render詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue大型項目之分模塊運行/打包的實現(xiàn)

    vue大型項目之分模塊運行/打包的實現(xiàn)

    這篇文章主要介紹了vue大型項目之分模塊運行/打包的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 關閉eslint檢查和ts檢查的簡單步驟記錄

    關閉eslint檢查和ts檢查的簡單步驟記錄

    這篇文章主要給大家介紹了關于關閉eslint檢查和ts檢查的相關資料,eslint是一個JavaScript的校驗插件,通常用來校驗語法或代碼的書寫風格,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Vuex中getters和actions的使用補充說明

    Vuex中getters和actions的使用補充說明

    這篇文章主要介紹了在Vuex中關于getters和actions使用的補充作了簡要說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-09-09
  • 從零搭建一個vite+vue3+ts規(guī)范基礎項目(搭建過程問題小結(jié))

    從零搭建一個vite+vue3+ts規(guī)范基礎項目(搭建過程問題小結(jié))

    這篇文章主要介紹了從零搭建一個vite+vue3+ts規(guī)范基礎項目,本項目已vite開始,所以按照vite官方的命令開始,對vite+vue3+ts項目搭建過程感興趣的朋友一起看看吧
    2022-05-05
  • vue完成項目后,打包成靜態(tài)文件的方法

    vue完成項目后,打包成靜態(tài)文件的方法

    今天小編就為大家分享一篇vue完成項目后,打包成靜態(tài)文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue單頁應用在頁面刷新時保留狀態(tài)數(shù)據(jù)的方法

    vue單頁應用在頁面刷新時保留狀態(tài)數(shù)據(jù)的方法

    今天小編就為大家分享一篇vue單頁應用在頁面刷新時保留狀態(tài)數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • 3分鐘讀懂移動端rem使用方法(推薦)

    3分鐘讀懂移動端rem使用方法(推薦)

    這篇文章主要介紹了rem使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • vue3利用keepAlive緩存頁面實例詳解

    vue3利用keepAlive緩存頁面實例詳解

    <keep-alive> 是一個抽象組件,它自身不會渲染一個DOM元素,也不會出現(xiàn)在組件的父組件鏈中,下面這篇文章主要給大家介紹了關于vue3利用keepAlive緩存頁面的相關資料,需要的朋友可以參考下
    2022-11-11
  • vue使用js-audio-recorder實現(xiàn)錄音功能

    vue使用js-audio-recorder實現(xiàn)錄音功能

    這篇文章主要為大家詳細介紹了vue如何使用js-audio-recorder實現(xiàn)錄音功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12

最新評論