最近在用React做项目,使用到antd作为ui,发现官网一些案例说明不是很详细
1 2 3 4 5 6
| const data = [ name:'test', children:[ name:'child' ] ]
|
有一个这样的数据格式,与官网案例不同的是需要显示的字段为name,官网为title,而且官网的字段中包含key
文档中说明可以使用 TreeNode 自定义显示,但又没有案例说明,下面是一个简单实现Tree自定义显示的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import { Tree } from "antd";
import React from "react"; const { TreeNode } = Tree;
class TreeDemo extends React.Component<any, any> { constructor(props: any) { super(props); this.state = { menu: [ name:'test', children:[ name:'child' ] ] }; }
loop = (arr: Array<object>) => { return arr.map((item: any) => { return ( <TreeNode title={<span>{item.name}</span>} key={item.name}> {item.children && item.children.length > 0 ? this.loop(item.children) : null} </TreeNode> ); }); }; render() { return ( <div> <Tree>{this.loop(this.state.menu)}</Tree> </div> ); } }
|
以上方式为antd 3x 至 antd 4x的方式,在4x中不推荐,Tree控件的children即将被废弃,推荐使用titleRender方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import { Tree } from "antd";
import React from "react";
class TreeDemo extends React.Component<any, any> { constructor(props: any) { super(props); this.state = { menu: [ name:'test', children:[ name:'child' ] ] }; }
loop = (arr: Array<object>): any => { return arr.map((item: any) => { item.key = item.id; return item.children && item.children.length > 0 ? { ...item, children: this.loop(item.children) } : item; }); }; render() { return ( <div> <Tree titleRender={(nodeData: any) => { return `${nodeData.name}`; }} treeData={this.loop(this.state.menu)} ></Tree> </div> ); } }
|
虽然此方式可以自定义渲染title,但数据源中不存在key值时依旧会提示key undefind。因此推荐递归处理数据后渲染