Vue El-Tree 拖拽排序方法(通用)

最近在把舊版本的ztree部門排序完成后,詳情見 zTree通用拖拽排序
尋思著把新版本的el-tree也給加入排序功能仔雷,畢竟一碗水要端平(功能都是自己寫的屋匕。封豪。。)炒瘟,由于二者表結(jié)構(gòu)也類似,核心也還是那幾個(gè)字段 id第步、pid疮装、order缘琅,就看了下ElementUI官網(wǎng)的文檔,便有了這么一篇廓推,原則上還是以盡可能的少改動(dòng)數(shù)據(jù)為優(yōu)先

首先我們的Vue文件聲明如下(由于文件內(nèi)容多刷袍,只貼關(guān)鍵代碼),主要加入了draggable屬性和node-drop事件樊展,支持拖拽

<el-tree
  :data="deptTree"
  :props="defaultProps"
  :expand-on-click-node="false"
  :filter-node-method="filterNode"
  highlight-current
  node-key="id"
  ref="tree"
  default-expand-all
  @node-click="handleNodeClick"
  @node-drop="handleDrop"
  draggable
>

在vue mounted中添加handleDrop方法呻纹,通過對(duì)draggingNodedropNode多次分析數(shù)據(jù)結(jié)構(gòu)后专缠,發(fā)現(xiàn)規(guī)律以及和ztree的不同

  • el-tree的level規(guī)則判定和ztree不一樣雷酪,ztree能肉眼可見的第一層級(jí)level為0,el-tree則為1
  • ztree的第一層級(jí)的penart為null涝婉,el-tree第一層級(jí)還能向上哥力,得到level為0的節(jié)點(diǎn)
  • ztree的源節(jié)點(diǎn)在拖拽后自動(dòng)會(huì)變更該節(jié)點(diǎn)的pId和parentTid,這是ztree自己的屬性墩弯,而非我們自己的pid吩跋,我們自己的pid在拖拽完成后是不變的,原來的父節(jié)點(diǎn)還是原來的父節(jié)點(diǎn)(仔細(xì)看pId和pid是有區(qū)別的)

具體實(shí)現(xiàn)如下渔工,具體實(shí)現(xiàn)思路在注釋中注明:

    // 拖拽事件 參數(shù)依次為:被拖拽節(jié)點(diǎn)對(duì)應(yīng)的 Node锌钮、結(jié)束拖拽時(shí)最后進(jìn)入的節(jié)點(diǎn)、被拖拽節(jié)點(diǎn)的放置位置(before引矩、after梁丘、inner)、event
    handleDrop: async function(draggingNode, dropNode, dropType, ev) {
          var paramData = [];
          // 當(dāng)拖拽類型不為inner,說明只是同級(jí)或者跨級(jí)排序脓魏,只需要尋找目標(biāo)節(jié)點(diǎn)的父ID兰吟,獲取其對(duì)象以及所有的子節(jié)點(diǎn),并為子節(jié)點(diǎn)設(shè)置當(dāng)前對(duì)象的ID為父ID即可
          // 當(dāng)拖拽類型為inner茂翔,說明拖拽節(jié)點(diǎn)成為了目標(biāo)節(jié)點(diǎn)的子節(jié)點(diǎn)混蔼,只需要獲取目標(biāo)節(jié)點(diǎn)對(duì)象即可
          var data = dropType != "inner" ? dropNode.parent.data : dropNode.data;
          var nodeData = dropNode.level == 1 && dropType != "inner" ? data : data.children;
          // 設(shè)置父ID,當(dāng)level為1說明在第一級(jí),pid為空
          nodeData.forEach(element => {
            element.pid = dropNode.level == 1 ? "" : data.id;
          });
          nodeData.forEach((element, i) => {
            var dept = {
              deptId: element.id,
              parentDeptId: element.pid,
              order: i
            };
            paramData.push(dept);
          });
        
          this.loading = true;
          // 得到這次操作需要變更的數(shù)據(jù)范圍珊燎,請(qǐng)求后臺(tái)批量處理即可...
          DeptAPI.updateDeptTreeOrder(JSON.stringify(paramData)).then(res => {
            console.log(res);
            //自行邏輯惭嚣,可以加提示框message
            this.loading = false;
          });
    },

把DeptAPI也貼出來吧,是我引入的dept.js文件

/**
 * 部門排序
 * @param {*} data
 */
const updateDeptTreeOrder = data => {
  return request({
    url: '...',
    method: "POST",
    headers: {
      'Content-Type': 'application/json;charset=UTF-8'
    },
    data: data
  })
}
export default {
  updateDeptTreeOrder
};

后端Controller層使用@RequestBody接收List<Dept>對(duì)象悔政,具體可以見文章SpringBoot 接收List<Bean>參數(shù)問題(POST請(qǐng)求方式)

注意需要設(shè)置axios的Content-Typeapplication/json;charset=UTF-8

在這里插入圖片描述

下期見

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晚吞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谋国,更是在濱河造成了極大的恐慌槽地,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捌蚊,居然都是意外死亡集畅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門缅糟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挺智,“玉大人,你說我怎么就攤上這事窗宦∩馄模” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵赴涵,是天一觀的道長媒怯。 經(jīng)常有香客問我,道長句占,這世上最難降的妖魔是什么沪摄? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮纱烘,結(jié)果婚禮上杨拐,老公的妹妹穿的比我還像新娘。我一直安慰自己擂啥,他們只是感情好哄陶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哺壶,像睡著了一般屋吨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上山宾,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天至扰,我揣著相機(jī)與錄音,去河邊找鬼资锰。 笑死敢课,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绷杜。 我是一名探鬼主播直秆,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鞭盟!你這毒婦竟也來了圾结?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤齿诉,失蹤者是張志新(化名)和其女友劉穎筝野,沒想到半個(gè)月后晌姚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遗座,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年舀凛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片途蒋。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖馋记,靈堂內(nèi)的尸體忽然破棺而出号坡,到底是詐尸還是另有隱情,我是刑警寧澤梯醒,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布宽堆,位于F島的核電站,受9級(jí)特大地震影響茸习,放射性物質(zhì)發(fā)生泄漏畜隶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一号胚、第九天 我趴在偏房一處隱蔽的房頂上張望籽慢。 院中可真熱鬧,春花似錦猫胁、人聲如沸箱亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽届惋。三九已至,卻和暖如春菠赚,著一層夾襖步出監(jiān)牢的瞬間脑豹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工衡查, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘩欺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓峡捡,卻偏偏與公主長得像击碗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子们拙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348