首页 > 其他分享 >sortable.js el-table 树形表 拖拽

sortable.js el-table 树形表 拖拽

时间:2024-01-24 18:55:58浏览次数:30  
标签:el sortable children delData id 节点 js 拖拽 const

image

实现的功能:

  1. 该树形表只有一级子节点
  2. 该子节点只能在当前父节点中拖拽, 不能跨父节点拖拽
  3. 同时只能展开一个父节点, 其他父节点闭合

实现的关键点:

  1. mounted 挂载 初始化sortable
  2. 拖拽完onEnd方法返回的index是整个列表的排序,要扁平化数组
    调用该方法getTable()
  3. 后台多返回一个kid,和id的值一样,用来更新tableData
  4. 拖拽完成要把el-table中的row-key对应的kid重新生成,父节点和子节点绑定的kid都要重新生成,让el-table局部刷新,不然会出现父节点移除,子节点还是在原有的位置,但是tableData中已经是最新的数据
  5. 拖拽完成之后调用接口保存当前排序
    参数格式:如果拖拽父节点,只传父节点排序 convertMap对象
    如果拖拽子节点,传子节点排序 convertMapChild对象
    image
    image
//树形数组扁平化
    getTable(data) {
      data.forEach(d => {
        const obj = {
          ...d,
          cid: [],
        }
        delete obj.children
        this.tempData.push(obj)
        if (d.children && d.children.length > 0) {
          d.children.forEach(c => {
            obj.cid.push(c.id)
          })
          this.getTable(d.children)
        }
      })
    },

mounted时调用的方法

rowDrop() {
      const tb = document.querySelector('tbody')
      Sortable.create(tb, {
        handle: '.drop', 
        animation: 180,
        delay: 0,
        onEnd: ({ newIndex, oldIndex }) => {
          this.idIndexMap()
          this.newIndex = newIndex
          this.oldIndex = oldIndex
          this.tempData = []
          this.getTable(this.tableData)
          const newData = this.tempData.at(newIndex)
          const delData = this.tempData.at(oldIndex)
          //第一层级移动,删除拖拽节点,包括拖拽节点的子节点,更新convertMap,id对应的索引
          if (delData.cid && delData.cid.length > 0 || delData.parentId === 0) {
            const delTdIndex = this.convertMap[delData.id]
            const newTdIndex = this.convertMap[newData.id]
            const [dd] = this.tableData.splice(delTdIndex, 1)

            dd.kid = this.getUuid()

            dd.children.map(d => {
              d.kid = this.getUuid()
              return d
            })

            this.tableData.splice(newTdIndex, 0, dd)
            this.idIndexMap()
          } else if (newData.parentId === delData.parentId) {
            //子层级移动 重新生成convertMapChild,更新id对应的索引
            const parentIndex = this.convertMap[newData.parentId]
            const parentData = this.tableData[parentIndex]
            const children = parentData.children
            this.generateIdToIndexChild(children)
            children.splice(this.convertMapChild[delData.id], 1)
            children.splice(this.convertMapChild[newData.id], 0, delData)
            this.generateIdToIndexChild(children)
          }
        },
        //选择的时候记住拖拽节点的索引
        onChoose: ({ oldIndex }) => {
          this.oldIndex = oldIndex
        },
        onMove: (customEvent, dragEvent) => {
        //移动到新节点会有新节点的索引,和拖拽节点的父id进行
       //比较,如果不一致,不让拖拽,返回false
          this.tempData = []
          this.getTable(this.tableData)
          this.newIndex = customEvent.related.rowIndex
          const newData = this.tempData.at(this.newIndex)
          const delData = this.tempData.at(this.oldIndex)
          if (newData.parentId !== delData.parentId) {
            return false
          }
        }
      })
    },

拖拽一级节点先转化为 id--index的对应关系

    idIndexMap() {
      this.convertMap = this.tableData.reduce((acc, cur, index) => {
        return {
          ...acc,
          [cur.id] : index
        }
      }, {})
    },

拖拽子节点生成Map id--index的对应关系

    generateIdToIndexChild(children) {
      console.log(children);
      this.convertMapChild = children.reduce((acc, cur, index) => {
        return {
          ...acc,
          [cur.id] : index
        }
      }, {})
    },

标签:el,sortable,children,delData,id,节点,js,拖拽,const
From: https://www.cnblogs.com/tangshidedabenniao/p/17985503

相关文章

  • Python处理Excel表格的终极指南
    案例学Python(进阶篇)源代码.zip 链接:https://pan.quark.cn/s/c00aefe52fdc案例学Python(基础篇)源代码.zip 链接:https://pan.quark.cn/s/15c0b553b6b8引言Excel表格在数据处理和日常办公中扮演着不可或缺的角色。本文将详细介绍如何使用Python中的openpyxl库来处理Excel文件,......
  • 用 UNPKG/CDNJS 国内镜像优化网页加载速度
    unpkg.com和cdnjs.cloudflare.com这两个官方域名的加载速度实在令人汗颜。抽了一下午找了些国内能用的高速稳定镜像,批量更换一下就能加速访问了。unpkg用Zstatic的镜像,把原来的unpkg.com换成s4.zstatic.net/npmcdnjs用360或者Zstatic的镜像,把原来的cdnjs.cloudfl......
  • Understanding the linux kernel Chapter3 Processes
    ProcessDescriptorHowProcessesAreOrganizedtheprocessinstate:TASK_RUNNINGorganizedinrunqueuelistgroupTASK_STROPPED\EXIT_ZOMBIE\EXIT_DEADThereisnoneedtogroupprocessesinanyofthesethreestates,becausestopped,zombie,andd......
  • JS中的扩展运算符(...)和剩余运算符(...)
    一、概念在JS中,扩展运算符(spread)是三个点 (...) ,剩余运算符(rest)也是三个点 (...)二、扩展运算符(1)基本使用:扩展运算符的主要作用是将一个数组转为用逗号分隔的参数序列,它好比rest的逆运算//传递数据代替多个字符串的形式functiontest(a,b,c){console.log(a);//1......
  • JS复制JPG图片到剪切板
    HTML代码:<buttonid="button"type="primary"class="ui-button">复制JPG图片</button><imgid="image"width="150"src="./mybook.jpg">JS代码:constdoCopyImg2Clipboard=async(image,suc......
  • PgSql 行转列的使用 jsonb_each与row_to_json
    PgSql行转列的使用jsonb_each与row_to_json1:正常的几行数据2:转换后3:code(以commodity来分组)select"Id","JabilPn","Brand","PricelnUsd","Commodity"from"Eme_Materials"emwhere"Id"<=3s......
  • idea中启动web、jsp项目
    1.idea打开项目选择要打开的项目的根目录2.项目配置配置jdkmodules配置添加web添加依赖删除爆红的依赖添加依赖目录或者jar配置web.xml配置lib如果没有生成则添加项目所需依赖facets配置和web配置一样配置artifacts3.配置tomcat......
  • js/ts中Date类的ref响应式 -- VUE3
    现象:Date对象无法响应式原因:Date是个深层对象,外面那层可以响应,但是更改里面的层,则不会被侦测到改动解决:强制触发副作用即可参考文档:https://cn.vuejs.org/api/reactivity-advanced.html#triggerref<template><divclass="cnblogs_yucloud">{{DateTime}}</div>......
  • 数据挖掘||利用SQL Server 2012或者Excel 2013采用聚类和时序挖掘模型和算法,对自行车
    1.实验要求 利用SQLServer2012或者Excel2013(二者选择其一即可)进行数据挖掘实验,采用聚类和时序挖掘模型和算法,可以对附件中给定的excel数据进行聚类和时序挖掘实验,也可以采用自己采集的数据(如采用自选请说明数据来源)。 2.实验环境 操作系统:windows11;软件:Excel2019;SQLServer......
  • js 旧 IE 中的 innerHTML
    在所有现代浏览器中,通过innerHTML插入的<script>标签是不会执行的。而在IE8及之前的版本中,只要这样插入的<script>元素指定了defer属性,且<script>之前是“受控元素”(scopedelement),那就是可以执行的。<script>元素与<style>或注释一样,都是“非受控元素”(NoScopeelement)......