【el-tree】树形结构拖拽,修改分组

这篇具有很好参考价值的文章主要介绍了【el-tree】树形结构拖拽,修改分组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:

项目中有个左侧菜单,并且各级菜单中的元素是可以拖拽到别的菜单中去,也就是树形结构拖拽修改分组,下面我介绍我项目中使用el-tree进行拖拽分组的方式.

效果:

拖拽到某个节点的前后

首先我们使用的是饿了么组件中的[el-tree]组件,他本身是自带拖拽功能的,只需要加上一个属性:

draggable//是否开启拖拽节点功能,默认为false

去掉部分无关代码后的组件:

  <el-tree :data="groupList"
      node-key="id"
     :default-expanded-keys='defaultexpande' //默认展开所有节点 
     :props="defaultProps" @node-drop="handleDrop"
     draggable                         //开启可拖拽属性
     @node-drop="handleDrop"      //拖拽完成时触发的事件
     ref='tree'>
         
   </el-tree>

其中我的业务处理会放在@node-drop="handleDrop" ,拖拽结束事件中:

拖拽完成时触发的事件 参数依次为:被拖拽节点、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event :

我的业务处理逻辑是:

因为节点被拖动后触发的事件能够告诉我们:

  1. 被拖拽节点的信息                      draggingNode
  2. 被拖拽节点进入的节点信息        dropNode
  3. 被拖拽节点的放置类型:               dropType
  4. 表示拖拽事件对象,包含了拖拽操作的相关信息,如拖拽起始位置、拖拽结束位置等。event    

两种情况

一种是拖拽到某个节点的内部:

拖拽到分组内部

另外一种情况是拖拽到某个节点的前后

拖拽到某个节点的前后

可能你会觉得这不也是拖拽到分组1的内部吗 ? 其实也没错,但是这种情况el-tree组件的拖拽事件识别的逻辑就是拖拽到了某个节点的前后,然后事件返回的参数会告诉你具体被拖拽到了哪个节点的前后.

注意:拖拽到节点内部的判定必须是直接将被拖拽节点拖拽到分组的上方 !如果是拖拽到某个分组中的某个位置的话,这种就属于被拖拽到了某个节点的前后了。

业务部分:

我的项目中,树形结构的分层是通过parentid的.而分组内部的顺序是通过每一项的sortCode来决定的. 而el-tree在拖拽完成后,el-tree所绑定的数组会自动的和视图同步,我们可以省去了操作这个数据移动的步骤,我们需要关心的就是拖拽后,如果节点的层级改变了,那么需要将被拖拽节点的pid修改成改变后的父节点的id,以及更新进入的那个分组的里面所有元素的Sortcode.

拖拽到某个节点的内部的情况:

【el-tree】树形结构拖拽,修改分组,elementui,前端,javascript

 下面进入代码:

 handleDrop(draggingNode, dropNode, dropType, ev) {

 if (dropType == 'inner') {
  //如果是进入了某个分组的内部
 draggingNode.data.parentId = dropNode.data.id //修改被拖拽节点的pid
//遍历修改SortCode
for (let i = 0; i < dropNode.children.length; i++) {
          const element = dropNode.children[i];
          element.sortCode = i
          this.ModifyMenu(element)  //发请求保存修改sortCode后的分组
        }

}

}

解析:

在拖拽后我们可以通过dropType知道这个被拖拽的节点是被拖到了draggingNode的前后还是某个节点的里面,所以如果dropType ==‘inner’说明被拖拽节点是被拖拽到了目标节点的内部,那么,我们需要将被拖拽节点的pid设置成目标节点的id: 然后修改进入的那个分组里面的所有子元素的SortCode. 然后发请求保存修改pid和SortCode后的节点. 这里根据后端接口设计不同会有不同 !

拖拽节点到某个分组前后的情况: 

【el-tree】树形结构拖拽,修改分组,elementui,前端,javascript

下面进入代码:

 handleDrop(draggingNode, dropNode, dropType, ev) {
 ........
      else {
        // 放到了某个节点的前后,那么pid也相同
        draggingNode.data.parentId = dropNode.data.parentId

        // 如果是放到了某个节点的前后,判断其有没有父节点
        if (dropNode.data.parentId && dropNode.data.parentId !== '-1') {
         //有父节点,说明是放到了某个分组中的某个节点的前后
          //修改整个分组的sortCode
          const activeiTemParent = this.findItemById(this.groupList, draggingNode.data.parentId)  //这里手写了一个通过id找数据的方法,通过被移动节点的pid可以找到它的父元素,于是遍历它的父元素,修改所有它父元素的子节点的SortCode
          for (let i = 0; i < activeiTemParent.children.length; i++) {
            const element = activeiTemParent.children[i];
            element.sortCode = i
            this.ModifyMenu(element)  //发请求保存修改后的数据
          }
        } else {
          // 没有父节点,说明是第一层分组  直接遍历整个数组修改第一层数据的SortCode即可
          for (let i = 0; i < this.groupList.length; i++) {
            const element = this.groupList[i];
            element.sortCode = i
            this.ModifyMenu(element)  //发请求保存修改后的数据
          }
        }
      }


    },
 // 找出Id对应的项
    findItemById(arr, id) {
      for (let i = 0; i < arr.length; i++) {
        const item = arr[i];
        if (item.id === id) {
          return item;
        } else if (item.children) {
          const result = this.findItemById(item.children, id);
          if (result) {
            return result;
          }
        }
      }
      return null;
    },

解析:

在拖拽后,进入我们的代码中的else说明节点是被拖拽到了某个节点的前后,说明被拖拽节点(draggingNode)与目标节点(dropNode)是同级的,也就是pid相同,那么,我们需要将被拖拽节点的pid设置成目标节点的pid , 然后这里我手写了一个通过id找元素的方法,因为我们有了被拖拽节点的pid,我们需要找到这个pid对应的数据,然后遍历它修改里面所有子元素的SortCode值. 然后发请求保存修改pid和SortCode后的节点. 这里根据后端接口设计不同会有不同 !

allowDrop(draggingNode, dropNode, ev) {
      // 如果放置的节点不是分组,那么就return false
      if (dropNode.data.type !== 1 && ev == "inner") {
        return false;
      }
      return true;
    },

以上就是我实现使用el-tree完成拖拽修改分组的整个过程啦 ! 对你有用的话可以点个赞支持下哦 !

el-tree组件图标的自定义https://blog.csdn.net/weixin_64530670/article/details/132418884文章来源地址https://www.toymoban.com/news/detail-661725.html

到了这里,关于【el-tree】树形结构拖拽,修改分组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elemet-ui el-tree树形结构,子级选择框不显示,只选择父级

    如下图: elemet-ui如下: :check-strictly=“true” 设置为父级子级不关联。 Js修改显示样式:

    2024年02月07日
    浏览(30)
  • vue2 - 详细介绍element UI中在el-select嵌套el-tree树形控件实现下拉选择树型结构数据的效果实例(组件封装)

    在项目上常用使用到 el-select 和 el-tree 组合实现,记录下两者结合的实现过程。(代码以及注释清晰明了,代码直接使用即可) 要求根据项目接口提供的数据,el-tree 里的数据是一次性返回来的,点击最后一层级时,请求接口,在点击层级下方追加数据追加的数据要显示勾

    2024年04月15日
    浏览(43)
  • 【el-tree】树形组件图标的自定义

    饿了么树形组件的图标自定义 默认样式:  可以看到el-tree组件左侧自带展开与收起图标,咱们可以把它 隐藏 :: 我的全部代码 其中自定义左侧图标的方法:  我的每条数据都自带icon属性,你没有的话也可以在数据拿到之后手动遍历添加一条icon属性进去,然后再el-tree中使用: 如果需

    2024年02月11日
    浏览(29)
  • element-ui树形控件el-tree详解

    概述 这里我利用element-ui开发一个vue的树形组件 引入element-ui 安装element-plus 安装按需导入 修改vite.config.js配置按需加载 tree树形控件详解 属性名 说明 类型 可选值 默认值 data 展示数据 array — — empty-text 内容为空的时候展示的文本 string — — node-key 每个树节点用来作为唯一标

    2024年02月07日
    浏览(40)
  • 【element ui】el-tree拖拽增加样式效果

    el-tree的可拖拽效果太不明显,产品需要添加可拖拽的效果,弄了个阴影。 项目需求是只能同级拖拽,无法跨级拖拽。点击层级的切换顺序的按钮,出现拖拽效果。 css代码必须去掉scoped才能实现

    2024年02月12日
    浏览(33)
  • vue2+element-ui el-tree树形控件封装

    1.封装 根据官网配置项封装了下el-tree 方便维护和复用,有用的话点赞收藏叭~ 2.使用 如若要对不同的一级二级节点设置不同的样式可以参考这样:

    2024年02月12日
    浏览(40)
  • ElementUI中el-tree获取每个节点点击的选中状态

    有时候需要获取el-tree每个节点的点击状态,可以通过以下方式,其中isCheck类型为布尔值 1.绑定@check事件,我这里是getCurrentNode,函数名自己随便写 2.绑定ref

    2024年02月11日
    浏览(37)
  • element plus 可选择树形组件(el-tree) 怎样一键展开/收起?实现方法详解

    实现代码: 按钮: 组件:  在ref中绑定folderTreeRef  展开收起: 效果: 实现原理: 打印上面的   folderTreeRef ,可以从原型链的 store 中找到 _getAllNodes 属性 官方文档好像没有描述关于此属性的内容,查了好多资料,搜了多篇文章,可以发现 store 原型中有 _getAllNodes 这个属性

    2024年01月20日
    浏览(32)
  • 自定义el-tree复选框选中状态vue elementUI

    :check-strictly属性:该属性默认false,表示严格遵循父子相互关联。父子相互关联(即选中父节点其所有子节点全部选中,取消选中父节点其子节点全部取消,且折叠、展开状态都一样)。 Attributes属性 参数 说明 类型 可选值 默认值 check-strictly 在显示复选框的情况下,是否严格

    2023年04月09日
    浏览(26)
  • 在Vue3+ElementPlus项目中使用具有懒加载的el-tree树形控件

    有时遇到一些需求就是在使用树形控件时,服务端并没有一次性返回所有数据,而是返回首层节点列表。然后点击展开首层节点中的某个节点,再去请求该节点的子节点列表,那么就得用上懒加载的机制了。在此以ElementPlus的树形控件为例,实现一个具有懒加载的树形控件的

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包