基于VUE+ElementUI中el-tree组件实现数据拖拽

最近遇见一个这样的需求:树形数据结构需要支持拖拽移动。该方案简单便捷,基于ElementU就可以完成,无需第三方插件,废话少说,上源码!

  • 静态效果图
    在这里插入图片描述

  • 动态效果图
    在这里插入图片描述

  • 实现源码(HTML)

    <el-tree
      ref="momdelTree"
      v-loading="moddleLoading"
      :highlight-current="true"
      :data="moddleTreeList"
      :filter-node-method="filterNode"
      node-key="id"
      default-expand-all
      :props="{ label: 'menuName', children: 'children' }"
      draggable
      :allow-drop="allowDrop"
      @node-click="selectNode"
      @node-drop="nodeDrop"
    >
    </el-tree>
  • 实现源码(JS)
    allowDrop(draggingNode, dropNode, type) {
      return (
        type !== 'inner' &&
        draggingNode.data.parentMenuId === dropNode.data.parentMenuId
      )
    },
    async nodeDrop(draggingNode, dropNode, type, event) {
      this.moddleLoading = true
      try {
        const res = await Promise.all(
          dropNode.parent.childNodes.map((item, index) => {
            if (draggingNode.data.parentMenuId) {
              return NemuManageApi.setSort({
                id: item.data.id,
                menuOrder: index,
                opUser: this.$store.state.user.userLoginName,
              })
            } else {
              return NemuManageApi.setSort({
                id: item.data.id,
                menuOrder: index,
                opUser: this.$store.state.user.userLoginName,
              })
            }
          })
        )
        this.$message({ type: 'success', message: '数据更新成功' })
      } catch (error) {
        this.$message.error('数据更新失败', error)
      } finally {
        this.moddleLoading = false
      }
    }
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以通过修改数据实现同级上下移动的功能。 首先,需要监听el-tree的node-drop事件,该事件会在拖动节点到目标节点后触发,可以获取到拖动节点和目标节点的信息。根据这些信息,可以修改数据实现节点的移动。 下面是一个简单的实现demo: ```html <template> <el-tree :data="data" :props="defaultProps" @node-drop="handleNodeDrop" ></el-tree> </template> <script> export default { data() { return { data: [ { label: '一级 1', children: [ { label: '二级 1-1' }, { label: '二级 1-2' } ] }, { label: '一级 2', children: [ { label: '二级 2-1' }, { label: '二级 2-2' } ] } ], defaultProps: { children: 'children', label: 'label' } } }, methods: { handleNodeDrop(draggingNode, dropNode, dropType) { // 获取拖动节点的父节点 const draggingNodeParent = draggingNode.parent; // 获取拖动节点在父节点的位置 const draggingNodeIndex = draggingNodeParent.data.indexOf(draggingNode.data); // 获取目标节点的父节点 const dropNodeParent = dropNode.parent; // 获取目标节点在父节点的位置 const dropNodeIndex = dropNodeParent.data.indexOf(dropNode.data); // 判断拖动节点和目标节点是否在同一级别 if (draggingNodeParent === dropNodeParent) { // 在同一级别内,交换位置即可 draggingNodeParent.data.splice(draggingNodeIndex, 1); draggingNodeParent.data.splice(dropNodeIndex, 0, draggingNode.data); } else { // 不在同一级别内,需要将拖动节点从原父节点删除,然后添加到目标父节点 draggingNodeParent.data.splice(draggingNodeIndex, 1); dropNodeParent.data.splice(dropNodeIndex, 0, draggingNode.data); } } } } </script> ``` 在该demo,我们监听了el-tree的node-drop事件,然后在事件处理函数,根据拖动节点和目标节点的信息来修改数据。具体来说,我们获取了拖动节点和目标节点的父节点以及在父节点的位置,然后判断它们是否在同一级别内,如果是,则直接交换位置即可;否则,需要将拖动节点从原父节点删除,然后添加到目标父节点。 这样就实现了一个简单的同级上下移动的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值