应当指出,antd 是有 ztree 组件的,但是太简单,无法满足复杂的业务需求。

所以我还是决定使用zTree.

  1. 用 npm | cnpm 或者 yarn | tyarn 安装,这一步略。
  2. 在 jsx 文件最上面引入。
    import $$ from '@/utils/jquery-vendor.js'
    import zTree from 'zTree';
    //样式文件一定不要忘了引入,不然会没有样式
    import 'ztree/css/zTreeStyle/zTreeStyle.css';

    注意这个 jquery-vendor.js。它是让 zTree 可以正常工作的代码。
    因为 zTree 并没有考虑到 node 环境的问题——它假定 jQuery 一定在 window 对象下。
    jquery-vendor.js:

    import $ from 'jquery'
    window.$ = $
    window.jQuery = $
    export default $
  3. 在合适的生命周期中渲染它。
    let ZtreeObject
    
    let self
        componentWillMount() {
    self = this dispatch({
    type: 'personalWorkBranch/fetchZSKFL_Tree',
    payload: {
    ...userInfo,
    zsfl_id: 'all'
    },
    }).then(() => {
    const { ZSFLTreeData } = this.props
    if (Array.isArray(ZSFLTreeData) && ZSFLTreeData.length > 0) {
    this.initZtree(ZSFLTreeData)
    }
    }); }

    无关代码都删除掉了。
    self 需要在 react 类的之外声明一下。
    当然也需要在结束时的声明周期销毁。

        componentWillUnmount() {
    
          self = null
    
          if (ZtreeObject) {
    ZtreeObject.destroy()
    }
    }

    当然,最关键的是抽出来的渲染方法。

    // ztree 初始化方法
    initZtree = (zNodes) => { var setting = {
    view: {
    showLine: true,
    fontCss: {color:"#666"},
    expandSpeed: "",
    addHoverDom: this.addHoverDom,
    removeHoverDom: removeHoverDom,
    selectedMulti: false
    },
    edit: {
    enable: true,
    renameTitle: '类目修改',
    removeTitle: '类目删除'
    },
    callback: {
    // before 执行之前
    beforeRemove: this.beforeRemove,
    beforeRename: this.beforeRename,
    beforeClick: this.ztnBeforeClick,
    // on 执行之后
    onClick: this.ztnOnClick
    }
    }; // var zNodes = [
    // { id:1, pId:0, name:"父节点1 - 展开"},
    // { id:11, pId:1, name:"父节点11 - 折叠"},
    // { id:111, pId:11, name:"叶子节点111"},
    // { id:112, pId:11, name:"叶子节点112"},
    // { id:113, pId:11, name:"叶子节点113"},
    // ];
    // var zNodes = [
    // {
    // id: 1,
    // name: "父节点1 - 展开",
    // children: [
    // {
    // id: 11,
    // name: "父节点11 - 折叠",
    // children: [
    // {
    // id: 111,
    // name: "叶子节点111"
    // },
    // {
    // id: 112,
    // name: "叶子节点112"
    // },
    // {
    // id: 113,
    // name: "叶子节点113"
    // }
    // ]
    // }
    // ]
    // }
    // ];
    // var zNodes = [
    // {
    // id: 1,
    // name: "父节点1 - 展开"
    // }
    // ]; ZtreeObject = $$.fn.zTree.init($("#tree"), setting, zNodes);
    }

到这里其实就可以了。

但是我们可能会需要一些增删改查的方法。

  • this.addHoverDom
    
    // ztree 添加节点
    addHoverDom = function (treeId, treeNode) { var sObj = $("#" + treeNode.tId + "_span");
    if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
    var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
    + "' title='类目新增' onfocus='this.blur();'></span>";
    sObj.after(addStr);
    var btn = $("#addBtn_"+treeNode.tId);
    if (btn) btn.bind("click", function(){ const { dispatch } = self.props
    dispatch({
    type: 'personalWorkBranch/fetchaddZSKFL',
    payload: {
    ...userInfo,
    fjzskfl_id: treeNode.id,
    flmc: '新节点'
    }
    }).then(() => {
    const { newTreeDataAfterAdd, commonStatus, commonMessage } = self.props
    const $ = $$ // console.log(newTreeDataAfterAdd)
    // console.log(commonStatus)
    // console.log(commonMessage) if (commonStatus == 201) {
    var zTree = $.fn.zTree.getZTreeObj(ztreeId);
    zTree.addNodes(treeNode, {
    id: newTreeDataAfterAdd.id,
    pId:treeNode.id,
    name: newTreeDataAfterAdd.name
    });
    return false;
    } else if (commonStatus == 401) {
    message.error(commonMessage)
    return false;
    } else {
    return false;
    }
    }) // alert("?")
    // var zTree = $.fn.zTree.getZTreeObj("treeDemo");
    // zTree.addNodes(treeNode, {id:(100 + newCount), pId:treeNode.id, name:"new node" + (newCount++)});
    // return false;
    });
    };
  • removeHoverDom
    
    const removeHoverDom = function (treeId, treeNode) {
    $("#addBtn_"+treeNode.tId).unbind().remove();
    };
  • this.beforeRemove
    
    // ztree 删除节点
    beforeRemove = (treeId, treeNode) => {
    // var zTree = $.fn.zTree.getZTreeObj("treeDemo");
    // zTree.selectNode(treeNode); const zskfl_id = treeNode.id
    const fjzskfl_id = treeNode.getParentNode().id const { dispatch } = self.props
    dispatch({
    type: 'personalWorkBranch/fetchdelZSKFL',
    payload: {
    ...userInfo,
    fjzskfl_id: fjzskfl_id,
    zskfl_id: zskfl_id
    }
    }).then(() => {
    const { commonStatus, commonMessage } = self.props // console.log(commonStatus)
    // console.log(commonMessage) const $ = $$
    var zTree = $.fn.zTree.getZTreeObj(ztreeId); if (commonStatus == 201) {
    zTree.removeNode(treeNode) message.success(commonMessage)
    return false;
    } else if (commonStatus == 401) {
    message.error(commonMessage)
    return false;
    } else {
    return false
    }
    }) return false
    }
  • this.beforeRename
    
    // ztree 编辑节点
    beforeRename = (treeId, treeNode, newName) => {
    if (newName.length == 0) {
    setTimeout(function() {
    const $ = $$
    var zTree = $.fn.zTree.getZTreeObj(ztreeId);
    zTree.cancelEditName();
    message.warning("节点名称不能为空.");
    }, 0);
    return false;
    } const oldName = treeNode.name
    const zskfl_id = treeNode.id
    const zskfl_name = newName const { dispatch } = self.props
    dispatch({
    type: 'personalWorkBranch/fetchupdateZSKFL',
    payload: {
    ...userInfo,
    zskfl_name: zskfl_name,
    zskfl_id: zskfl_id
    }
    }).then(() => {
    const { commonStatus, commonMessage } = self.props const $ = $$
    var zTree = $.fn.zTree.getZTreeObj(ztreeId); // zTree.cancelSelectedNode(treeNode)
    // var node = zTree.getNodesByParam("key", zskfl_id, null) if (commonStatus == 201) {
    if (oldName === newName) {
    } else {
    message.success(commonMessage)
    } return false; // node.name = zskfl_name
    // zTree.updateNode(node) } else if (commonStatus == 401) {
    zTree.cancelEditName() message.error(commonMessage)
    return false;
    } else {
    zTree.cancelEditName() return false
    }
    }) return true
    }
  • this.ztnBeforeClick
    
    // ztree 点击
    ztnBeforeClick = (treeId, treeNode, clickFlag) => {
    return true
    }
  • this.ztnOnClick
    
    //
    ztnOnClick = (e, treeId, treeNode, clickFlag) => {
    // console.log(treeNode)
    if (treeNode.isParent) { const { dispatch } = this.props;
    dispatch({
    type: 'dicData/fetchDataZSFL',
    payload: {
    zsfl_id: treeNode.id ? treeNode.id : 'all'
    },
    }) }
    }

ant design pro 实战 : 使用 ztree的更多相关文章

  1. Ant Design Pro+Electron+electron-builder实现React应用脱离浏览器,桌面安装运行

    ant-design-pro ----> version :2.3.1 由于网上Ant Design Pro+Electron的资料太少,我就贡献一点经验   最近需要讲AntD Pro项目(以 ...

  2. 阿里开源项目之Ant Design Pro

    本篇文章主要包含的内容有三个方面. 第一.Ant Design Pro简介; 第二.Ant Design Pro能做什么; 第三.初步使用; 我相信通过这三个方面的讲解能让你大概知道Ant Desig ...

  3. ant design pro (十五)advanced 使用 API 文档工具

    一.概述 原文地址:https://pro.ant.design/docs/api-doc-cn 在日常开发中,往往是前后端分离的,这个时候约定好一套接口标准,前后端各自独立开发,就不会被对方的技术难 ...

  4. ant design pro (十四)advanced 使用 CLI 工具

    一.概述 原文地址:https://pro.ant.design/docs/cli-cn 为了更好以及高效的开发效率,我们提供了配套的 ant-design-pro-cli 工具. pro cli 提 ...

  5. ant design pro (十三)advanced 错误处理

    一.概述 原文地址:https://pro.ant.design/docs/error-cn 二.详细 2.1.页面级报错 2.1.1.应用场景 路由直接引导到报错页面,比如你输入的网址没有匹配到任何 ...

  6. ant design pro (十二)advanced UI 测试

    一.概述 原文地址:https://pro.ant.design/docs/ui-test-cn UI 测试是项目研发流程中的重要一环,有效的测试用例可以梳理业务需求,保证研发的质量和进度,让工程师可 ...

  7. ant design pro (十一)advanced Mock 和联调

    一.概述 原文地址:https://pro.ant.design/docs/mock-api-cn Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路.通过预先跟服务器端约定好的 ...

  8. ant design pro (十)advanced 图表

    一.概述 原文地址:https://pro.ant.design/docs/graph-cn Ant Design Pro 提供了由设计师精心设计抽象的图表类型,是在 BizCharts 图表库基础上 ...

  9. ant design pro (八)构建和发布

    一.概述 原文地址:https://pro.ant.design/docs/deploy-cn 二.详细 2.1.构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: npm run buil ...

随机推荐

  1. jmeter的beanshell

    [beanshell] 简单介绍beanshell,小型的java源代码解释器 运行下beanshell [常用命令] print() 输出内容到命令行中 (1)也可以在beanshell中自定义 [ ...

  2. Python多核编程mpi4py实践及并行计算-环境搭建篇

    1.安装python,这个没什好说的,直接装就行 2.做并行计算.数据挖掘,机器学习等一般都要用的numpy,这个在Windows版本上安装有点问题,安装比较麻烦,建议在linux上搭建环境 3.安装 ...

  3. JVM生命周期与运行过程

    1. Java虚拟机的生命周期 Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会 ...

  4. android 中使用自定义权限

    1.如果在一个进程中启动另外一个进程的activity <?xml version="1.0" encoding="utf-8"?> <man ...

  5. jvm基础知识—垃圾回收机制

    1.首先类的实例化.static.父类构造函数执行顺序 我们来看下面的程序代码: public class A { int a1 = 8; { int a3 = 9; System.out.print ...

  6. bug和测试报告思维导图

    Bug定义: 1.不符合需求的 2.程序本身的报错 3.不符合用户使用习惯的 Bug生命周期: 当我们测试人员提交一个bug的时候,自始bug就有它的生命周期,从开始到结束, 把测试的过程和结果写成文 ...

  7. 谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert

    反应式编程在客户端编程当中的应用相当广泛,而当前在服务端中的应用相对被提及较少.本篇将介绍如何在服务端编程中应用响应时编程来改进数据库操作的性能. 开篇就是结论 接续上一篇<谈反应式编程在服务端 ...

  8. SpringBoot之入门教程-SpringBoot项目搭建

    SpringBoot大大的简化了Spring的配置,把Spring从配置炼狱中解救出来了,以前天天配置Spring和Mybatis,Springmvc,Hibernate等整合在一起,感觉用起来还是挺 ...

  9. HTML重构与网页常用工具

    下面这张思维导图,是我对全书大体内容的一个概括性总结: 工具 本书推荐的工具主要包含的是自动化测试,但是我觉得现行的开发环节当中实际用到的会比较少.这里就推荐一下其他方面的优秀工具: 1. YSlow ...

  10. Unable to load configuration. - action - file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%209.0/webapps/Teacher04/WEB-INF/classes/struts.xml:9:54

    发布一个struts2项目的时候tomcat显示下面这个错误,我的本能感觉就是我的struts.xml或者web.xml写错了,可是我字母找都没发现,于是百度一番,可是我对那些人的回答表示怀疑,感觉应 ...