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

vue使用Element的Tree樹形控件實(shí)現(xiàn)拖動(dòng)改變節(jié)點(diǎn)順序方式

 更新時(shí)間:2023年12月06日 11:01:30   作者:hhtSeeTheWorld  
這篇文章主要介紹了vue使用Element的Tree樹形控件實(shí)現(xiàn)拖動(dòng)改變節(jié)點(diǎn)順序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

項(xiàng)目完成后,產(chǎn)品又提新需求,

通過拖動(dòng)能夠改變下面的組織順序,又給我增加了好大的工作量!

先吐槽產(chǎn)品一波,怎么早先不想好呢!

首先要想實(shí)現(xiàn)拖動(dòng)改變順序,那我從后端查詢得來的數(shù)據(jù)

treeList

首先就必須有順序,

后端為了實(shí)現(xiàn)節(jié)點(diǎn)有順序—在實(shí)體類中又增加了一個(gè)字段

原先類實(shí)體

public class OrgNode {
    private String id;
    private String name;
    private String parentId;
}

增加了一個(gè)brotherId

當(dāng)前類實(shí)體

public class OrgNode {
    private String id;
    private String name;
    private String parentId;
    private String brotherId;
}

后端

1.新增節(jié)點(diǎn)

每當(dāng)我新增一個(gè)節(jié)點(diǎn)時(shí),就把他的brotherId設(shè)為 “-1”,

如果新增節(jié)點(diǎn)所在的層級(jí)之前沒有節(jié)點(diǎn),那不需要處理;

如果新增節(jié)點(diǎn)所在的層級(jí)之前有節(jié)點(diǎn),那么把之前brotherId為-1的節(jié)點(diǎn)的brotherId改為新增節(jié)點(diǎn)的id

2.刪除節(jié)點(diǎn)

當(dāng)刪除節(jié)點(diǎn)時(shí),為保證順序,需要把 被刪節(jié)點(diǎn) 后一個(gè)節(jié)點(diǎn)的brotherId 改為 被刪節(jié)點(diǎn)的 brotherId,

這樣這一層級(jí)的節(jié)點(diǎn)順序才不會(huì)出錯(cuò)

以上寫了一點(diǎn)后端的做法,下面來詳細(xì)講解前端實(shí)現(xiàn)

屬性結(jié)構(gòu)的代碼

   <el-tree :draggable="true" @node-drop="testTrop" :allow-drop="dropPosition" :data="organization" node-key="id" :current-node-key="currentNode" :default-expanded-keys="keys" :expand-on-click-node="false"
        @node-click="nodeClick" :props="defaultProps" ref='treeOrg' :filter-node-method='filterNode' highlight-current>
        <span class="custom-tree-node" slot-scope="{ node, data }">
          <el-tooltip v-if="node.label.length>10" :content='node.label' placement="top-start" effect="dark"
            popper-class="atooltip">
            <span>{{node.label | showTreeName}}</span>
          </el-tooltip>
          <span v-else>{{ node.label }}</span>
          <span v-if="node.data.id==selectId">
            <el-button type="text" icon="el-icon-edit" size="mini" @click.stop=" () => updateOrganization(data)"></el-button>
            <el-button type="text" icon="el-icon-delete" size="mini" @click.stop="() => remove(node, data)"></el-button>
          </span>
        </span>
      </el-tree>

該組織樹的使用

1.draggabl.是否開.拖拽功能

2.allow-dro.拖拽時(shí)判定目標(biāo)節(jié)點(diǎn)能否被放置。

3.node-dro.拖拽成功觸發(fā)的事.  主要是我們 把數(shù)據(jù)發(fā).后端

4.dat.我們要展示的數(shù). 從后端獲取. treeList

5.node-ke.每個(gè)樹節(jié)點(diǎn)用來作為唯一標(biāo)識(shí)的屬性,整棵樹應(yīng)該是唯一的

6.current-node-ke.當(dāng)前選中的節(jié)點(diǎn)

7.default-expanded-key.默認(rèn)展開的節(jié)點(diǎn).key 的數(shù)..  就是我們 想展開節(jié)點(diǎn).id 數(shù)組

8.expand-on-click-nod. 是否在點(diǎn)擊節(jié)點(diǎn)的時(shí)候展開或者收縮節(jié)點(diǎn), 默認(rèn)值為 true,如果為 false,則只有點(diǎn)箭頭圖標(biāo)的時(shí)候才會(huì)展開或者收縮節(jié)點(diǎn)。

9.node-clic.節(jié)點(diǎn)被點(diǎn)擊時(shí)的回.. 節(jié)點(diǎn)被點(diǎn)擊.我們想做什么. 一般是查詢

10.prop...主要用.指定 我們想展示節(jié)點(diǎn).的那兩個(gè)屬. 屬性.必須和 從后端得到數(shù)據(jù).屬性名 相對(duì)應(yīng)

11.re..ref被用來給元素或子組. 注. 引用信息.引用信息將會(huì)注冊(cè)在父組件的 $refs對(duì)象上。

12.filter-node-metho. 對(duì)樹節(jié)點(diǎn)進(jìn)行篩選時(shí)執(zhí)行的方法,返回 true 表示這個(gè)節(jié)點(diǎn)可以顯示,返回 false 則表示這個(gè)節(jié)點(diǎn)會(huì)被隱藏

13.highlight-curren.  是否高亮當(dāng)前選中節(jié)點(diǎn),默認(rèn)值是 false。

14.el-toolti. 文字提. 用法 <el-tooltip> 要展示的內(nèi).</el-tooltip.  給這個(gè) 內(nèi)容 做一些提示

. 當(dāng)前我們前端要達(dá)到的效果.如果文字過. 很后面以省略號(hào)結(jié).  但是有必須 讓用.看.該條數(shù)據(jù)的全部內(nèi).所以.文字提示.方法去達(dá)到目的

. 當(dāng)前這個(gè)文字提. 已經(jīng)添..v-i.判斷字?jǐn)?shù)大于1.才會(huì)生效

........... v-els.  就顯示原本的字?jǐn)?shù) 

這里主要講解拖拽的兩個(gè)屬性,一個(gè)事件

  • 屬性 draggable 是否開啟 拖拽功能
  • 屬性 allow-drop 拖拽時(shí)判定目標(biāo)節(jié)點(diǎn)能否被放置。
  • 事件 node-drop 拖拽成功觸發(fā)的事件 主要是我們 把數(shù)據(jù)發(fā)給 后端

第一個(gè)draggable沒什么好講的

第三個(gè)node-drop用法也簡單

本人主要是

我被該屬性卡住了

因?yàn)槲业氖怯幸粋€(gè)限制,同級(jí)中不能有同名組織,

所以需要判定 被拖組織 能否置于 目標(biāo)組織 前面,后面,或者內(nèi)部

dropPosition(draggingNode, dropNode, type) {
        console.log(draggingNode);
        console.log(dropNode);
        console.log(type);
        //這三個(gè)參數(shù)  是我們?cè)陧撁嫱蟿?dòng)時(shí)   我們停止拖動(dòng)時(shí)   會(huì)自動(dòng)生成的參數(shù)三個(gè)參數(shù)
        // 轉(zhuǎn)移節(jié)點(diǎn)draggingNode  目標(biāo)節(jié)點(diǎn)dropNode   置于目標(biāo)節(jié)點(diǎn)的位置  type='prev'、'inner' 和 'next'  三個(gè)中其中一個(gè)
        if (type === "inner") {
          checkOrganizationName(draggingNode.data.id, draggingNode.data.name, dropNode.data.id).then(data => {
            if (data.data.data === true) {
              //說明目標(biāo)節(jié)點(diǎn)內(nèi)部存在  與轉(zhuǎn)移節(jié)點(diǎn)  相同名稱的  節(jié)點(diǎn),不能轉(zhuǎn)入
              //那我們不設(shè)返回值  就不會(huì)觸發(fā)移動(dòng)事件
            } else {
              return "inner";
            }
          });
        } else if (type === "prev" || type === "next") {
          //判斷轉(zhuǎn)移節(jié)點(diǎn)   能否放置于  目標(biāo)節(jié)點(diǎn)的  前面或者后面
          checkOrganizationName(draggingNode.data.id, draggingNode.data.name, dropNode.data.parentId).then(data => {
            if (data.data.data === true) {
              //說明 前后不能放
              //那我們也不設(shè)返回值  就不會(huì)觸發(fā)移動(dòng)事件
            } else {
              return type;
            }
          });

        }
      },

所以不能通過向后端發(fā)請(qǐng)求的方式,判斷能否放于 目標(biāo)位置

應(yīng)該通過比較前端已經(jīng)有的數(shù)據(jù),判斷能否放于目標(biāo)位置

 processDataTree(data) {
        for (let index in data) {
          let obj = data[index];
          this.organizationTemp.push({id: obj.id, name: obj.name, parentId: obj.parentId});
          if (obj.children !== null && obj.children.length > 0) {
            this.processDataTree(obj.children);
          }
        }
      },
      getOrganizationTemp() {
        getOrganization().then(data => {
          this.organizationAfterMove = data.data.data;
          this.organizationTemp = [];
          this.processDataTree(this.organizationAfterMove);
        });
      },
      dropPosition(draggingNode, dropNode, type) {
        //這三個(gè)參數(shù)  是我們?cè)陧撁嫱蟿?dòng)時(shí)   我們停止拖動(dòng)時(shí)   會(huì)自動(dòng)生成的參數(shù)三個(gè)參數(shù)
        // 轉(zhuǎn)移節(jié)點(diǎn)draggingNode  目標(biāo)節(jié)點(diǎn)dropNode   置于目標(biāo)節(jié)點(diǎn)的位置  type='prev'、'inner' 和 'next'  三個(gè)中其中一個(gè)
        if (type === "inner") {
          if (dropNode.data.children===null){
            //目標(biāo)節(jié)點(diǎn)沒有子節(jié)點(diǎn)  可以直接放入
            return "inner"
          }else {
            let childArray=dropNode.data.children;
            for (let i = 0; i < childArray.length; i++) {
              if (childArray[i].name===draggingNode.data.name){
                return
              }
            }
            return "inner"
          }
        } else if (type === "prev" || type === "next") {
          let existObj;
          for (let i = 0; i <this.organizationTemp.length; i++) {
            let obj = this.organizationTemp[i];
            if(obj.parentId === dropNode.data.parentId && obj.name === draggingNode.data.name && obj.id!==draggingNode.data.id){
               existObj=obj;
            }
          }
          if (existObj) {

          } else {
            return type;
          }
        }
      },

        testTrop(before,after,inner,event){
            changeParentOrg(before.data.id,after.data.id,inner,this.$getCookie().getUserName());
            setTimeout(()=>{this.getOrganizationTemp()},500);
        },

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue基于el-breadcrumb實(shí)現(xiàn)面包屑功能(操作代碼)

    Vue基于el-breadcrumb實(shí)現(xiàn)面包屑功能(操作代碼)

    這篇文章主要介紹了Vue基于el-breadcrumb實(shí)現(xiàn)面包屑功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Vue前端開發(fā)規(guī)范整理(推薦)

    Vue前端開發(fā)規(guī)范整理(推薦)

    本文是基于vue官方風(fēng)格指南整理的關(guān)于Vue前端開發(fā)規(guī)范(推薦),非常不錯(cuò),具有參考借鑒借鑒價(jià)值,需要的朋友可以參考下
    2018-04-04
  • vue+SSM實(shí)現(xiàn)驗(yàn)證碼功能

    vue+SSM實(shí)現(xiàn)驗(yàn)證碼功能

    這篇文章主要介紹了vue+SSM實(shí)現(xiàn)驗(yàn)證碼功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-12-12
  • 解決elementui上傳組件el-upload無法第二次上傳問題

    解決elementui上傳組件el-upload無法第二次上傳問題

    這篇文章主要介紹了解決elementui上傳組件el-upload無法第二次上傳問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 關(guān)于vue-tree-chart簡單的使用

    關(guān)于vue-tree-chart簡單的使用

    這篇文章主要介紹了關(guān)于vue-tree-chart簡單的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Spring boot 和Vue開發(fā)中CORS跨域問題解決

    Spring boot 和Vue開發(fā)中CORS跨域問題解決

    這篇文章主要介紹了Spring boot 和Vue開發(fā)中CORS跨域問題解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • Vue.js中關(guān)于“{{}}”的用法

    Vue.js中關(guān)于“{{}}”的用法

    這篇文章主要介紹了Vue.js中關(guān)于“{{}}”的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue打包優(yōu)化時(shí)配置webpack的8大方案小結(jié)

    vue打包優(yōu)化時(shí)配置webpack的8大方案小結(jié)

    vue-cli?生成的項(xiàng)目通常集成Webpack?,在打包的時(shí)候,需要webpack來做一些事情,這里我們希望它可以壓縮代碼體積,提高運(yùn)行效率,本文為大家整理了8大webpack配置方案,希望對(duì)大家有所幫助
    2024-02-02
  • vue快速入門基礎(chǔ)知識(shí)教程

    vue快速入門基礎(chǔ)知識(shí)教程

    VUE是一套前端框架,免除了原生JavaScript中的DOM操作,簡化書寫。VUE基于MVVM(Model-View_ViewModel)思想,實(shí)現(xiàn)數(shù)據(jù)雙向綁定。Vue的核心庫只關(guān)注圖層.響應(yīng)式數(shù)據(jù)綁定和組件化開發(fā)是其兩大特點(diǎn)。
    2023-01-01
  • vue中input標(biāo)簽上傳本地文件或圖片后獲取完整路徑的解決方法

    vue中input標(biāo)簽上傳本地文件或圖片后獲取完整路徑的解決方法

    本文給大家介紹vue中input標(biāo)簽上傳本地文件或圖片后獲取完整路徑,如E:\medicineOfCH\stageImage\xxx.jpg,本文給大家分享完美解決方案,感興趣的朋友跟隨小編一起看看吧
    2023-04-04

最新評(píng)論

雷波县| 酉阳| 娄底市| 东阿县| 清远市| 瑞金市| 永丰县| 安丘市| 南昌县| 定远县| 河东区| 汉沽区| 黄龙县| 彝良县| 资中县| 永仁县| 宁津县| 府谷县| 奉贤区| 太仆寺旗| 客服| 灵石县| 泸水县| 灌云县| 山阳县| 吉水县| 宜君县| 永顺县| 通辽市| 乐昌市| 昌江| 栾川县| 安康市| 商丘市| 会宁县| 南雄市| 富宁县| 山丹县| 伽师县| 济源市| 凤凰县|