很多时候官网并没有给我们过多地详解来解释他们的产品怎么使用。
今天碰到了一个很恶心的问题,就是在给antd的treeSelect组件加左侧icon的时候,总是报一个警告,
Warning: Each child in a list should have a unique “key” prop.
告诉我们每一个节点都需要有一个唯一的key。
首先我这里简单的封装了一下treeSelect这个组件:
import React from 'react';
import {
TreeSelect } from 'antd';
import 'antd/dist/antd.css';
import '../styles/rstreeselect.less';
class RSTreeSelect extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
}
}
static defaultProps = {
title: "",
treeData: [],
}
render() {
let {
title, treeData, ...rest } = this.props;
return (
<div className="rsselect">
{
title && <p className="rsselect-title">{
title}:</p>}
{
<TreeSelect
treeData={
treeData}
{
...rest}>
</TreeSelect>}
</div>
)
}
}
export default RSTreeSelect;
然后页面使用:
import RSTreeSelect from '../../component/RSTreeSelect';
import {
FolderOpenOutlined, CarryOutOutlined } from '@ant-design/icons';
const treeData = [
{
title: 'Node1',
value: '1',
disabled: true,
children: [
{
title: 'Child Node1',
disabled: true,
value: '1-1',
},
{
title: 'Child Node2',
value: '1-2',
children: ''
},
{
title: 'Child Node2',
value: '1-22',
children: ''
},
{
title: 'Child Node2',
value: '1-233',
children: ''
},
],
},
{
title: 'Node2',
value: '2',
children: '',
},
];
在render函数中的dom:
<RSTreeSelect
title={
'选择文件'}
value={
this.state[`${
item.keyName}`]}
dropdownStyle={
{
maxHeight: 400, overflow: 'auto' }}
treeData={
this.treeData(treeData)}
// treeData={item.keyAndValueList === '' || item.keyAndValueList === null ? [] : this.treeData(JSON.parse(item.keyAndValueList))}
placeholder="请选择文件"
treeIcon={
true}
onChange={
(e) => {
this.inputName(`${
item.keyName}`, e) }}
suffixIcon={
<FolderOpenOutlined />}
/>
仔treeData渲染文件夹数组之前调用了函数处理了数据结构
treeData = (data) => data.map(item => {
if (item.children) {
item['icon'] = [<FolderOpenOutlined />]
this.treeData(item.children)
} else {
item['icon'] = [<CarryOutOutlined/>]
}
return item
})
这个时候就会报错,绞尽脑汁找到原因,原来引入的antd图标组件没有加key
正确的:
treeData = (data) => data.map(item => {
if (item.children) {
item['icon'] = [<FolderOpenOutlined key={
item.title}/>]
this.treeData(item.children)
} else {
item['icon'] = [<CarryOutOutlined key={
item.title}/>]
}
return item
})
函数的作用就是递归自己给对象加icon属性。最重要的是对数据进行处理,我这里遇到一个小坑 key,记录一下。
可以按照自己的喜好体检icon喽