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

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

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

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

Vue遞歸組件

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

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

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

drag事件

首先在需要在拖動(dòng)的元素上綁定draggable屬性,除了<a>和<img>標(biāo)簽設(shè)默認(rèn)為true,其他元素都需要設(shè)置下

然后是三個(gè)事件dragend、dragover、drop(用Vue寫(xiě)的,就不在事件前加on了)

注意dragover需要去除默認(rèn)行為,在事件中給上$event.preventDefault(),否則拖曳時(shí)鼠標(biāo)會(huì)有🚫標(biāo)志,使拖動(dòng)無(wú)效。

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

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

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

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

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

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

export default busEvent

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

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

ifFatherDragToSon(dragObj,dropObj){//判斷是否父節(jié)點(diǎn)移動(dòng)到了子節(jié)點(diǎn)
      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;
    }

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

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

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

代碼連接

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

相關(guān)文章

  • Vue.js下拉菜單組件使用方法詳解

    Vue.js下拉菜單組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue.js下拉菜單組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • vue中項(xiàng)目頁(yè)面空白但不報(bào)錯(cuò)產(chǎn)生的原因及分析

    vue中項(xiàng)目頁(yè)面空白但不報(bào)錯(cuò)產(chǎn)生的原因及分析

    這篇文章主要介紹了vue中項(xiàng)目頁(yè)面空白但不報(bào)錯(cuò)產(chǎn)生的原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue中使用AJAX實(shí)現(xiàn)讀取來(lái)自XML文件的信息

    vue中使用AJAX實(shí)現(xiàn)讀取來(lái)自XML文件的信息

    這篇文章主要為大家詳細(xì)介紹了vue中如何使用AJAX實(shí)現(xiàn)讀取來(lái)自XML文件的信息,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考下
    2023-12-12
  • vue全局?jǐn)?shù)據(jù)管理示例詳解

    vue全局?jǐn)?shù)據(jù)管理示例詳解

    這篇文章主要為大家介紹了vue全局?jǐn)?shù)據(jù)管理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • vue3項(xiàng)目keepAlive使用方法詳解

    vue3項(xiàng)目keepAlive使用方法詳解

    keepalive是Vue的內(nèi)置組件,作用是將組件緩存在內(nèi)存當(dāng)中,防止重復(fù)渲染DOM,屬于消耗內(nèi)存獲取速度,這篇文章主要介紹了vue3項(xiàng)目keepAlive使用方法,主要將keepaliev在vue3.0中的用法,需要的朋友可以參考下
    2024-03-03
  • vue+elementui實(shí)現(xiàn)動(dòng)態(tài)控制表格列的顯示和隱藏

    vue+elementui實(shí)現(xiàn)動(dòng)態(tài)控制表格列的顯示和隱藏

    這篇文章主要介紹了vue+elementui實(shí)現(xiàn)動(dòng)態(tài)控制表格列的顯示和隱藏,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • ElementUI中el-dropdown-item點(diǎn)擊事件無(wú)效問(wèn)題

    ElementUI中el-dropdown-item點(diǎn)擊事件無(wú)效問(wèn)題

    這篇文章主要介紹了ElementUI中el-dropdown-item點(diǎn)擊事件無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue實(shí)現(xiàn)子組件向父組件傳遞多個(gè)參數(shù)的方法

    Vue實(shí)現(xiàn)子組件向父組件傳遞多個(gè)參數(shù)的方法

    在Vue框架中,組件間的通信是一個(gè)常見(jiàn)的需求,特別是在子組件需要向父組件傳遞多個(gè)參數(shù)時(shí),合理的通信方式可以顯著提升代碼的可讀性和可維護(hù)性,本文將詳細(xì)介紹如何在Vue中實(shí)現(xiàn)子組件向父組件傳遞多個(gè)參數(shù),需要的朋友可以參考下
    2024-10-10
  • Vue 3 的<Teleport>功能與用法詳解

    Vue 3 的<Teleport>功能與用法詳解

    <Teleport> 是 Vue 3 的一個(gè)內(nèi)置組件,允許將組件的內(nèi)容渲染到 DOM 中的任意位置,而不改變其邏輯結(jié)構(gòu),這篇文章主要介紹了Vue 3 的<Teleport>功能與用法詳解,需要的朋友可以參考下
    2025-04-04
  • 在vue中封裝方法以及多處引用該方法詳解

    在vue中封裝方法以及多處引用該方法詳解

    這篇文章主要介紹了在vue中封裝方法以及多處引用該方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08

最新評(píng)論

芜湖市| 泉州市| 康马县| 四平市| 华容县| 富平县| 吉木萨尔县| 青河县| 阿瓦提县| 八宿县| 陕西省| 吴旗县| 温宿县| 台南市| 贺兰县| 鹤庆县| 资兴市| 咸丰县| 永泰县| 灵石县| 墨玉县| 贺兰县| 上虞市| 建平县| 孟村| 达孜县| 五台县| 新建县| 寻乌县| 漾濞| 海丰县| 井陉县| 怀集县| 河间市| 宜都市| 岢岚县| 柘城县| 额敏县| 邹城市| 达日县| 古丈县|