ant design pro 实战 : 使用 ztree
应当指出,antd 是有 ztree 组件的,但是太简单,无法满足复杂的业务需求。
所以我还是决定使用zTree.
- 用 npm | cnpm 或者 yarn | tyarn 安装,这一步略。
- 在 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 $ - 在合适的生命周期中渲染它。
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的更多相关文章
- Ant Design Pro+Electron+electron-builder实现React应用脱离浏览器,桌面安装运行
ant-design-pro ----> version :2.3.1 由于网上Ant Design Pro+Electron的资料太少,我就贡献一点经验 最近需要讲AntD Pro项目(以 ...
- 阿里开源项目之Ant Design Pro
本篇文章主要包含的内容有三个方面. 第一.Ant Design Pro简介; 第二.Ant Design Pro能做什么; 第三.初步使用; 我相信通过这三个方面的讲解能让你大概知道Ant Desig ...
- ant design pro (十五)advanced 使用 API 文档工具
一.概述 原文地址:https://pro.ant.design/docs/api-doc-cn 在日常开发中,往往是前后端分离的,这个时候约定好一套接口标准,前后端各自独立开发,就不会被对方的技术难 ...
- ant design pro (十四)advanced 使用 CLI 工具
一.概述 原文地址:https://pro.ant.design/docs/cli-cn 为了更好以及高效的开发效率,我们提供了配套的 ant-design-pro-cli 工具. pro cli 提 ...
- ant design pro (十三)advanced 错误处理
一.概述 原文地址:https://pro.ant.design/docs/error-cn 二.详细 2.1.页面级报错 2.1.1.应用场景 路由直接引导到报错页面,比如你输入的网址没有匹配到任何 ...
- ant design pro (十二)advanced UI 测试
一.概述 原文地址:https://pro.ant.design/docs/ui-test-cn UI 测试是项目研发流程中的重要一环,有效的测试用例可以梳理业务需求,保证研发的质量和进度,让工程师可 ...
- ant design pro (十一)advanced Mock 和联调
一.概述 原文地址:https://pro.ant.design/docs/mock-api-cn Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路.通过预先跟服务器端约定好的 ...
- ant design pro (十)advanced 图表
一.概述 原文地址:https://pro.ant.design/docs/graph-cn Ant Design Pro 提供了由设计师精心设计抽象的图表类型,是在 BizCharts 图表库基础上 ...
- ant design pro (八)构建和发布
一.概述 原文地址:https://pro.ant.design/docs/deploy-cn 二.详细 2.1.构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: npm run buil ...
随机推荐
- DNS bind使用
概念介绍 DNS的分类 主DNS:配置管理,不提供服务,只用来编辑配置信息,给从DNS提供同步数据 从DNS:从主DNS上同步数据信息,对外提供服务 缓存DNS:在主DNS和从DNS之间,用来递归解析 ...
- C++ vector迭代器访问二维数组
#include<iostream> #include<vector> int main(){ std::vector<int> arr(); // 创建一维数组 ...
- 尚硅谷ajax视频教程2
7.7. 尚硅谷_佟刚_Ajax_典型应用_验证用户名是否可用 整个项目的目录路径如下所示 我们首先新建立一个web工程,在webroot下面新建立一个script的文件夹,导入jquer文件 接下来 ...
- 一起玩转微服务(12)——揭密starter
介绍 Spring Boot的starter主要用来简化依赖用的,对于企业级开发中的与第三方的集成,可以通过一段简单的配置来完成,这样开发人员无需再对包依赖的问题头疼.Spring Boot为我们提供 ...
- CentOS 7 Nacos 集群搭建
环境 CentOS 7.4 MySQL 5.7 nacos-server-1.1.2 本次安装的软件全部在 /home/javateam 目录下. MySQL 安装 首先下载 rpm 安装包,地址:h ...
- node+ajax实战案例(3)
3.用户注册实现 3.1.注册用户功能的实现逻辑 1 用户在表单上输入注册信息 2 点击注册后,收集用户在表单上输入的注册信息并且发送给后台 3 后台接收用户发送过来的注册信息 4 后台需要处理数据并 ...
- 记一次服务器被植入挖矿木马cpu飙升200%解决过程
线上服务器用的是某讯云的,欢快的完美运行着Tomcat,MySQL,MongoDB,ActiveMQ等程序.突然一则噩耗从前线传来:网站不能访问了. 此项目是我负责,我以150+的手速立即打开了服务器 ...
- 感知融合 awesome list
感知融合 awesome list 雷达聚类 雷达处理杂波滤除 CFAR (Constant False Alarm Rate):Lee, Jae-Eun, et al. "Harmonic ...
- Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
译者前言:相信凡是用过 zip() 内置函数的人,都会赞同它很有用,但是,它的最大问题是可能会产生出非预期的结果.PEP-618 提出给它增加一个参数,可以有效地解决大家的痛点. 这是 Python ...
- HTTPS 和 SSL/TLS 协议:密钥交换(密钥协商)算法及其原理
转自:https://blog.csdn.net/andylau00j/article/details/54583769 本系列的前一篇,咱们聊了“密钥交换的难点”以及“证书体系”的必要性.今天这篇来 ...