关闭ant的tree_Ant Design的可编辑Tree的实现操作

本文介绍了如何基于Ant Design的Tree组件实现一个可编辑的树形结构,包括增加、删除和编辑子节点功能。文章详细展示了数据结构设计、组件实现及遇到的展开Bug的解决方案,并提供GitHub代码地址。
摘要由CSDN通过智能技术生成

前言

最近在用Ant Design写一个后台,遇到的需求就是实现一个可动态增减和编辑子节点的Tree。GitHub上看了一圈,没好用和合适的。索性就基于Ant Design中的Tree组件写一个。

实现的效果如下:

可以增加子节点

可以删除子节点

可以编辑子节点信息

可以取消编辑信息

具体的效果图如下:

主要的就是借助 TreeNode 的 title 属性,它的类型是string|ReactNode。

正文

经过分析,一个节点的数据结构应该是

{

value: 'Root', // 显示的信息

defaultValue: 'Root', // 当某一节点进入编辑状态,然后点击close按钮,节点的信息应该恢复原始状态,

key: '0-1', // 节点的Key,全局唯一

parentKey: '0', // 父节点的Key

isEditable: false // 是否处于可编辑状态

children:[] // 子节点

}

通过数据结构组装TreeNode的代码如下:

data= [

{

value: 'Root',

defaultValue: 'Root',

key: '0-1',

parentKey: '0',

isEditable: false

}

];

state={

data: this.data

}

renderTreeNodes = data => data.map((item) => {

if (item.isEditable) { // 编辑状态下

item.title = (

onChange={(e) => this.onChange(e, item.key)}/>

this.onClose(item.key, item.defaultValue)}/>

this.onSave(item.key)}/>

);

} else {

item.title = (

{item.value}

this.onEdit(item.key)} />

this.onAdd(item.key)} />

{item.parentKey === '0' ? null : ( this.onDelete(item.key)} />)} // 根节点没有删除按钮

)

}

if (item.children) {

return (

{this.renderTreeNodes(item.children)}

);

}

return ;

})

...

// 渲染界面

render() {

return (

{this.renderTreeNodes(this.state.data)}

)

}

之后所有的增删修改等都是先修改data这个数组中的数据,然后使用this.setState({ data: this.data })更新界面,具体的看下代码就成,很简单。

最后优化这个组件的时候,遇到一个比较坑的。本来想是当在某节点上增加子节点时,父节点自动展开,代码逻辑上没有问题,但是必须手动执行过一次展开或者搜索的操作,所写的逻辑才能生效。

后来没办法,只能在生命周期函数中DOM加载完毕后主动触发下:

componentDidMount() {

this.onExpand([]); // 手动触发,否则会遇到第一次添加子节点不展开的Bug

}

代码放在GitHub上了,地址是 react-editable-tree,欢迎有同样需要的小伙伴参考,star和fork 也是极好的。

补充知识:关于antd Select 限制选择个数的解决方案

应用场景描述:

Select 被form 所包裹,且被getFieldDecorator修饰。所以值的改变应该通过form的setFieldsValue方法。

Select模式肯定会是multiple。且以最多三个值举例。

解决思路如下:

1 起初是想在Select的onchange事件中判断values的数量,数量大于三个的时候来重新setFieldsValue;且把最后的选项值替换成刚刚选择的值。

后来发现setFieldsValue方法不起作用,Select的值会一直增加。后来想想可能是 setFieldsValue与onchange 冲突,通过setFieldsValue 无法改变onchange后的值。

2 最后通过重新查看文档。发现还有一个方法可用,即 validator。验证值,通过验证所选值的数量是否大于三个,然后重新setFieldsValue ;发现此法可行。从而解决该疑难杂症。

好,最后附上代码供参考:

changeValues = (rule ,value , callback)=> {

const { setFieldsValue } = this.props.form ;

let newArr ;

if (value.length > 3){

newArr = [].concat(value.slice(0,2), value.slice(-1) ) ;

setFieldsValue({

"languages" : newArr ,

})

callback('最多选择三种语言')

} else {

newArr = value ;

callback()

}

}

{getFieldDecorator('languages', {

rules:[{required: true,message : '请选择三种语言',

validator : changeValues

}],

validateTrigger : 'onChange',

})(

1

2

3

4

5

)}

以上这篇Ant Design的可编辑Tree的实现操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant Design Tree 组件提供了一个 `treeData` 属性,通过这个属性可以渲染出一棵树形结构。要实现编辑的菜单树,需要在这个属性的基础上进行一些扩展。 首先,需要为每个节点添加一个可编辑的标识,用来表示该节点是否可以编辑。可以在 `treeData` 中为每个节点添加一个 `editable` 属性。 其次,当用户点击一个节点时,需要判断该节点是否可编辑,如果可编辑,则将该节点的文本内容转换成一个可编辑的文本框,让用户进行编辑。 最后,当用户完成编辑后,需要将编辑后的值保存到该节点中,并且将文本框转换回文本内容。 下面是一个简单的示例代码: ```jsx import { Tree, Input } from 'antd'; import { useState } from 'react'; const { TreeNode } = Tree; const treeData = [ { title: 'Node 1', key: '1', editable: true, children: [ { title: 'Child Node 1', key: '1-1', editable: true, }, { title: 'Child Node 2', key: '1-2', editable: true, }, ], }, { title: 'Node 2', key: '2', editable: true, }, ]; const EditableTree = () => { const [editingKey, setEditingKey] = useState(''); const onDoubleClick = (event, node) => { if (node.editable) { setEditingKey(node.key); } }; const onBlur = (event, node) => { setEditingKey(''); node.title = event.target.value; }; const renderTreeNode = (node) => { const { title, key, editable, children } = node; if (editingKey === key) { return ( <TreeNode title={<Input defaultValue={title} onBlur={(event) => onBlur(event, node)} />} key={key} /> ); } return ( <TreeNode title={title} key={key} editable={editable}> {children && children.map(renderTreeNode)} </TreeNode> ); }; return ( <Tree showLine defaultExpandAll onDoubleClick={onDoubleClick}> {treeData.map(renderTreeNode)} </Tree> ); }; export default EditableTree; ``` 这段代码中,我们使用了 Ant Design 的 `Tree` 和 `Input` 组件,使用 `useState` 钩子保存了当前正在编辑的节点的 `key` 值。在双击事件中,如果该节点可编辑,则将该节点的 `key` 值保存到 `editingKey` 中,这样就可以将该节点的文本内容转换成一个可编辑的文本框。在失去焦点事件中,将编辑后的值保存到该节点中,并将文本框转换回文本内容。最后,通过递归渲染树形节点,实现了可编辑的菜单树。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值