ant tree 排序功能

这篇博客介绍了如何使用Vue.js和Ant Design Vue库创建一个可拖拽排序的组织树形结构。通过监听拖拽事件,动态调整树节点顺序,并在拖放操作完成后,调用后端接口更新排序。文章详细展示了组件代码和后台处理排序的Java方法。
<template>
  <a-modal
    :title="title"
    :mask-closable="true"
    :confirm-loading="confirmLoading"
    :width="drawerWidth"
    :zIndex="1001"
    :visible="visible"
    @close="close"
    @ok="handleSubmit"
    @cancel="handleCancel"
  >
<!--    <a-form>-->
      <a-form-item>
        <a-tree
          class="draggable-tree"
          :default-expanded-keys="expandedKeys"
          draggable
          :tree-data="gData"
          :replace-fields="{
            key:'orderNo',
            title:'fullName',
            id:'id',
            pid:'pid',
          }"
          @dragenter="onDragEnter"
          @drop="onDrop"
        />
      </a-form-item>
  </a-modal>
</template>

<script>
import { findOrgTree } from '@/filters'

export default {
  data() {
    return {
      gData:[],
      title:'机构排序',
      visible:false,
      drawerWidth:'900px',
      expandedKeys: ['0-0', '0-0-0', '0-0-0-0'],
      loading: false,
      confirmLoading: false,
    };
  },
  methods: {
    show(dataSourceInfo) {
      let data = dataSourceInfo
      findOrgTree(data)
      this.gData = data
      this.visible = true
    },
    onDragEnter(info) {
      console.log(info);
      // expandedKeys 需要受控时设置
      // this.expandedKeys = info.expandedKeys
    },
     //拖拽后,自动形成新的树格式的数据 ,然后去后台sortNo设置
    onDrop(info) {
      console.log(info);
      const dropKey = info.node.eventKey;
      const dragKey = info.dragNode.eventKey;
      const dropPos = info.node.pos.split('-');
      const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
      const loop = (data, key, callback) => {
        data.forEach((item, index, arr) => {
          if (item.key === key) {
            return callback(item, index, arr);
          }
          if (item.children) {
            return loop(item.children, key, callback);
          }
        });
      };
      const data = [...this.gData];

      // Find dragObject
      let dragObj;
      loop(data, dragKey, (item, index, arr) => {
        arr.splice(index, 1);
        dragObj = item;
      });
      if (!info.dropToGap) {
        // Drop on the content
        loop(data, dropKey, item => {
          item.children = item.children || [];
          // where to insert 示例添加到尾部,可以是随意位置
          item.children.push(dragObj);
        });
      } else if (
        (info.node.children || []).length > 0 && // Has children
        info.node.expanded && // Is expanded
        dropPosition === 1 // On the bottom gap
      ) {
        loop(data, dropKey, item => {
          item.children = item.children || [];
          // where to insert 示例添加到尾部,可以是随意位置
          item.children.unshift(dragObj);
        });
      } else {
        let ar;
        let i;
        loop(data, dropKey, (item, index, arr) => {
          ar = arr;
          i = index;
        });
        if (dropPosition === -1) {
          ar.splice(i, 0, dragObj);
        } else {
          ar.splice(i + 1, 0, dragObj);
        }
      }
      this.gData = data;
      console.log("this.gData=================",this.gData);
    },
    //提交
    handleSubmit(){
      this.confirmLoading = true
      console.log("this.gData",this.gData)
      this.$fetch.postAction('/gbOrg/saveOrgOrder', this.gData,
        { headers: { 'Content-Type': 'application/json;charset=UTF-8' } }).then(res => {
        if (res.code === 200) {
          this.$message.success('操作成功')
          this.confirmLoading = false
          this.visible = false
          this.$emit('ok')
        }else{
          this.$message.success('操作失败')
        }
      })

    },
    handleCancel(){
      this.visible = false
    },
    handleOk () {
      this.visible = false
      this.confirmLoading = false
    },
    close() {
      this.visible = false
    },
  },
};
</script>

//后台设置,递归设置排序字段

public List<GbOrgTreeVo> saveOrgOrderPidList(List<GbOrgTreeVo> gbOrgTreeVos,String level,String pid,String topId) {
    if(gbOrgTreeVos != null && gbOrgTreeVos.size()>0){
        for (int i = 0; i < gbOrgTreeVos.size(); i++) {
            if(gbOrgTreeVos.get(i) != null){
                if("1".equals(level)){
                    topId = gbOrgTreeVos.get(i).getId();
                }
                gbOrgTreeVos.get(i).setTopPid(topId);
                gbOrgTreeVos.get(i).setPid(pid);
                String level1 = level+"-"+i;
                gbOrgTreeVos.get(i).setOrderNo(level1);// 0-0
                gbOrgTreeVos.get(i).setSortNo(i);// 0-0
                if(gbOrgTreeVos.get(i).getChildren() != null && gbOrgTreeVos.get(i).getChildren().size()>0){
                    saveOrgOrderPidList(gbOrgTreeVos.get(i).getChildren(),level1,gbOrgTreeVos.get(i).getId(),topId);
                }
            }
        }
    }
    return gbOrgTreeVos;
}
### 回答1: Ant Design Vue Tree是一个基于Vue.js框架的树形控件,它提供了丰富的功能和灵活的配置选项,可以用于展示层级结构数据,支持异步加载数据拖拽排序、复选框选择等功能。Ant Design Vue Tree还提供了丰富的主题样式和自定义选项,可以满足不同场景下的需求。 ### 回答2: Ant Design Vue Tree是一款基于Vue框架的树形结构组件库。它提供了一组适用于树形结构的组件,可以为用户提供丰富的交互体验和更好的界面展示。Ant Design Vue Tree不仅支持基本的树形结构功能,还提供了一系列高级功能,如拖拽、搜索、过滤等,可以满足不同需求。 该组件的主要功能分为三个部分:数据管理、交互及可定制化。 数据管理部分:Ant Design Vue Tree支持不同来源的数据,如静态数据、动态数据、异步数据等,同时支持多层级树结构的显示,可以满足不同的需求。 交互部分:Ant Design Vue Tree提供了一系列交互功能,如节点的展开/收起、节点的选中、拖拽节点等。这些交互功能可以让用户更轻松、快速地查找到需要的节点。 可定制化部分:Ant Design Vue Tree提供了一些自定义选项,如自定义节点样式、节点过滤器、节点搜索等。用户可以根据自己的需求进行自定义定制,增加了组件的灵活性。 综上所述,Ant Design Vue Tree是一款非常实用的树形结构组件库,可以用于构建复杂的树形结构界面。它提供了丰富的交互功能和可定制化选项,满足不同场景的需求。如果你正在寻找一款优秀的树形结构组件库,不妨试试Ant Design Vue Tree。 ### 回答3: Ant Design Vue是一个由蚂蚁金服公司基于Vue开发的UI组件库,它可以帮助开发者更快速地构建Web应用程序界面。Ant Design Vue提供了许多常用的组件,其中包括树形结构控件。Ant Design Vue Tree组件是一个非常实用的树状列表组件,可以支持多种数据结构,例如带复选框的树、可拖拽排序的树、懒加载的树等等。 Ant Design Vue Tree组件提供了丰富的属性和方法,可以满足各种需求。首先,它支持多种数据结构的加载,包括异步数据获取、本地数据等。其次,它能够实现树形结构的增加、删除、修改、移动、复制等操作。在展示上,Ant Design Vue Tree支持三角箭头的展开、折叠功能,并且可以通过自定义图标和样式来美化树形结构的外观。另外,Ant Design Vue Tree还支持对节点的搜索和筛选功能,可以更好地提高用户的使用体验,在大量数据情况下,更方便用户快速找到所需的节点。 需要注意的是,使用Ant Design Vue Tree时需要注意数据结构的正确性,以及各项属性和方法的调用合理性,这是保证Ant Design Vue Tree组件正常使用的关键。如果数据与组件的性质不符,可能会导致组件无法正常显示。因此,熟悉数据结构和学习如何正确调用Ant Design Vue Tree的属性和方法是很重要的。 总的来说,Ant Design Vue Tree是一个非常实用的树形列表控件,可以方便地管理大量的层级数据,同时也提高了用户的使用体验,是值得学习和使用的Vue组件之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值