树形图拖拽插件tree-drag | 开源项目推荐

简介: 树形图拖拽插件tree-drag | 开源项目推荐


前言


好多天前,领导让我实现一个树形图拖拽插件,这个插件用来描述各部门领导与员工之间的关系,每个父节点显示其子结点数量,拖拽任意一个叶结点上的人到另一个结点,他们之间的关系发生改变,树形图重新渲染。用户操作都完成后,点击保存根据树形图生成JSON,将JSON发送给后端,后端根据JSON修改数据库中的人员对应关系。


接下来就跟大家下分享下我实现的这个插件,欢迎各位感兴趣的开发者阅读本文。



难点分析


  • 实现可拖拽树形图 可拖拽树形图的实现,也是本插件的核心功能,根据dom的特定规则构建树,实现拖拽功能,拖拽功能我使用的是JQueryUI提供的方法,获取当前拖拽结点和目标结点的原始dom,重新构建树。


这一部分的实现代码位置: 「plugins/treeDrag/js/jquery.treeDrag.js」


需要生成的dom规则如下:


<li data-id="1000"><p>中国</p>
    <ul>
        <li data-id="1001"><p>广东</p>
            <ul>
                <li data-id="1002"><p>广州</p>
                    <ul>
                        <li data-id="1003"><p>天河区</p></li>
                    </ul>
                </li>
                <li data-id="1007"><p>深圳</p>
                    <ul>
                        <li data-id="1008"><p>福田区</p></li>
                    </ul>
                </li>
            </ul>
        </li>
        <li data-id="1011"><p>陕西</p>
            <ul>
                <li data-id="1017"><p>商洛</p>
                    <ul>
                        <li data-id="1018"><p>洛南</p></li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>


  • 实现JSON转DOM解析器 由于后台返回的是树形json结构数据,渲染拖拽树需要特定的dom结点,我们需要根据dom结点规则,将json数据渲染成我们需要的dom结点。


这一部分的实现代码位置:「plugins/treeDrag/js/JsonToDomParser.js」


json规则如下:

{
  "name":"国家",
  "value":"中国",
  "id": "1000",
  "children":[
    {
      "name":"省份",
      "value":"广东",
      "id": "1001",
      "children": [
        {
          "name":"城市",
          "value": "深圳",
          "id": "1007",
          "children": [
            {
              "name":"行政区",
              "value": "福田区",
              "id": "1008"
            }
          ]
        }
      ]
    },
    {
      "name":"省份",
      "value":"陕西",
      "id": "1011",
      "children": [
        {
          "name":"城市",
          "value": "西安",
          "id": "1012",
          "children": [
            {
              "name":"行政区",
              "value": "莲湖区",
              "id": "1013"
            }
          ]
        }
      ]
    }
  ]
}


  • 实现DOM转JSON,将树形图转换为JSON数据 用户拖拽完树形图后,我们需要将当前树形图中的人员对应关系发给后端,后端只能解析json数据,所以我们需要将dom重新转回json。


这一部分的实现代码位置:「plugins/treeDrag/js/JsonToDomParser.js」


JSON转DOM的解析器,我搞了好久没弄出来,最后求助了一个网友,成功解决了这个问题,感谢 @安慕希 提供的解决方案。


项目目录



  • plugins 插件目录
  • jquery 存放jquery相关文件
  • jqueryui 存放jqueryui相关文件
  • treeDrag 树形拖拽插件实现相关文件
  • src
  • treeDragData.json 渲染树形结构的json数据
  • css 插件内用到的css文件
  • js 插件内用到的js文件
  • assets 静态资源存放目录
  • config 树形结构渲染需要的文件
  • index.html 树形拖拽插件演示DEMO文件


如何使用


  • 在要使用插件的html文件里引入下述依赖


<!--树形拖拽插件样式文件-->
   <link rel="stylesheet" href="plugins/treeDrag/css/jquery.treeDrag.css">
   <link rel="stylesheet" href="src/assets/css/custom.css">
   <!--JQuery依赖-->
   <script src="plugins/jquery/1.7.1/jquery.min.js"></script>
   <script src="plugins/jqueryui/1.8.16/jquery-ui.min.js"></script>
   <!--树形拖拽插件-->
   <script src="plugins/treeDrag/js/jquery.treeDrag.js"></script>
   <!--JSON转DOM解析器-->
   <script type="text/javascript" src="plugins/treeDrag/js/JsonToDomParser.js"></script>
   <!--业务逻辑-->
   <script type="text/javascript" src="src/assets/js/index.js"></script>
   <link rel="stylesheet" href="src/assets/css/index.css">


  • 在html的body里添加容器,用于接受树形图的渲染结果
<!--渲染树形拖拽的容器-->
<div id="chart" class="orgChart"></div>
<!--生成JSON按钮-->
<div class="btn-panel">
    <button type="button" class="btn" onclick="generateJSON()">
        <span>生成JSON</span>
    </button>
</div>


  • 编写js代码,渲染don结构为树形拖拽控件
/**
 * 渲染页面
 * @param dataTree 需要渲染的树形JSON
 * @param DomNode 接收渲染结果的dom结点
 * @param isDrag
 */
const renderPage = function(dataTree={},DomNode="#chart",isDrag=true){
    // Dom字符串转Dom对象
    const org = $(JsonToDomParser(dataTree));
    // 渲染页面
    return org.treeDrag({
        chartElement: DomNode,
        dragAndDrop: isDrag
    });
};
let treeData = {};
let treeDom = {};
// 生成json数据
const generateJSON = function(){
    const jsonTree = new DomToJsonParser(treeDom);
    console.log(jsonTree);
    alert("json已生成,请在控制台查看");
};
jQuery(document).ready(function () {
    $.ajax({
        url:"src/config/treeDragData.json",
        type:"get",
        dataType:"JSON",
        success:(res)=>{
            treeData = res;
            // 渲染页面
            treeDom = renderPage(treeData);
        }
    })
});


至此,插件的使用介绍就完成了。


项目地址


「GitHub地址」: tree-drag

「在线体验地址」: tree-drag-demo


写在最后


  • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
  • 本文首发于掘金,未经许可禁止转载💌
相关文章
|
10月前
|
容器
layui框架实战案例(14):tabs选项卡切换时echarts拉伸变形无法正常显示的解决方案
layui框架实战案例(14):tabs选项卡切换时echarts拉伸变形无法正常显示的解决方案
104 0
|
5月前
el-tree饿了么elementUI tree树结构插件设置全部展开折叠
el-tree饿了么elementUI tree树结构插件设置全部展开折叠
|
5月前
|
C++ 索引
C++ Qt开发:Tab与Tree组件实现分页菜单
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`tabWidget`选择夹组件与`TreeWidget`树形选择组件,的常用方法及灵活运用。
59 0
C++ Qt开发:Tab与Tree组件实现分页菜单
|
5月前
|
XML JavaScript 小程序
使用jquery treetable 实现树形表格拖拽
这里记录一下使用jquery treetable时遇到的坑。 我这里的需求是做一个树形表格,并且可拖拽。 最后要实现的效果大概是这样的:(文末有实例)
28 0
|
6月前
|
JSON JavaScript 前端开发
Elementui Tree 树形控件删除功能
Elementui Tree 树形控件删除功能
30 0
Elementui Tree 树形控件删除功能
|
7月前
47zTree - Awesome 风格的左侧菜单
47zTree - Awesome 风格的左侧菜单
39 0
|
11月前
|
前端开发 JavaScript
ElementUI el-tree一键折叠或展开
ElementUI el-tree一键折叠或展开
304 0
ElementUI el-tree一键折叠或展开
|
12月前
|
前端开发 JavaScript API
Concis组件库封装——TreeView树形控件
Concis组件库封装——TreeView树形控件组件封装
78 1
Concis组件库封装——TreeView树形控件
|
12月前
|
前端开发 JavaScript API
Concis组件库封装——Popover气泡卡片
Concis组件库封装——Popover气泡卡片组件记录
114 1
|
开发工具 Android开发 iOS开发
如何使用 Draggable 和 DragTarget 在 Flutter 中创建拖放 UI 元素?
如何使用 Draggable 和 DragTarget 在 Flutter 中创建拖放 UI 元素?
363 0