警告:flattenChildren(...): 在 reactjs 中遇到两个具有相同键的 children
Warning: flattenChildren(...): Encountered two children with the same key in reactjs
我正在使用 Material UI 中的选项卡,其中我正在显示一个由选项卡过滤的列表组件,请查看我的容器组件中选项卡的代码:
<Tabs
className="DrawerTabs"
inkBarStyle={{ display: 'none' }}
>
<Tab label="Headline"
data-route="/headline"
onActive={this.handleActive}
className={this.isActive('Headline')}
>
<div>
<ModulesListContainer
filter="Headline"
/>
</div>
</Tab>
<Tab label="Body"
data-route="/body"
onActive={this.handleActive}
className={this.isActive('Body')}
>
<div>
<ModulesListContainer
filter="Body"
/>
</div>
</Tab>
<Tab
label="Other"
data-route="/other"
onActive={this.handleActive}
className={this.isActive('Other')}
>
<div>
<ModulesListContainer
filter="Other"
/>
</div>
</Tab>
</Tabs>
我在每个选项卡中放置的 ModuleList 代码仅显示基于从容器组件传递的过滤器的项目:
const ModulesList = (props) => {
let ListItems = props.modulesProps.map(module => {
if (props.filter === module.category) {
return (
<ListItem
key={module.id}
className="ModulePreview"
>
{module.id} - {module.name} - {module.thumbnail}
<FontAwesome
name="plus-circle"
size="2x"
onClick={props.addModule.bind(this, module)}
className="AddModule"
/>
</ListItem>
)
}
})
return (
<div className="ModulesList">
<List>
{ListItems}
</List>
</div>
)
}
尽管我只能在每个选项卡中看到过滤后的项目(因此键是唯一的,因为每个项目只存在一次)我仍然收到此警告:
Warning: flattenChildren(...): Encountered two children with the same
key, 1
. Child keys must be unique; when two children share a key,
only the first child will be used.
这是为什么?
任何帮助/想法/提示将不胜感激。
提前致谢! :)
那一行的意思是 module.id
不是唯一的,在 array
中会有 2 个 objects
具有相同的 id=1
,以避免你可以使用object
的索引,它将始终是唯一的。
使用这个:
let ListItemsUI = [];
props.modulesProps.forEach((module, i) => {
if (props.filter === module.category) {
ListItemsUI.push (
<ListItem
key={i}
className="ModulePreview"
>
{module.id} - {module.name} - {module.thumbnail}
<FontAwesome
name="plus-circle"
size="2x"
onClick={props.addModule.bind(this, module)}
className="AddModule"
/>
</ListItem>
)
}
})
return (
<div className="ModulesList">
<List>
{ListItemsUI}
</List>
</div>
)
还有一件事 map
不适合这些情况,您希望根据条件 return
只有少数元素,为此使用 forEach
。原因是如果你不 return
任何东西,默认情况下 map
将 return undefined
.
检查这个例子的输出:
let a = [1,2,3,4,5,6,7,8];
let b = a.map(el=>{
if(el % 2 == 0)
return el;
})
console.log(b);
我正在使用 Material UI 中的选项卡,其中我正在显示一个由选项卡过滤的列表组件,请查看我的容器组件中选项卡的代码:
<Tabs
className="DrawerTabs"
inkBarStyle={{ display: 'none' }}
>
<Tab label="Headline"
data-route="/headline"
onActive={this.handleActive}
className={this.isActive('Headline')}
>
<div>
<ModulesListContainer
filter="Headline"
/>
</div>
</Tab>
<Tab label="Body"
data-route="/body"
onActive={this.handleActive}
className={this.isActive('Body')}
>
<div>
<ModulesListContainer
filter="Body"
/>
</div>
</Tab>
<Tab
label="Other"
data-route="/other"
onActive={this.handleActive}
className={this.isActive('Other')}
>
<div>
<ModulesListContainer
filter="Other"
/>
</div>
</Tab>
</Tabs>
我在每个选项卡中放置的 ModuleList 代码仅显示基于从容器组件传递的过滤器的项目:
const ModulesList = (props) => {
let ListItems = props.modulesProps.map(module => {
if (props.filter === module.category) {
return (
<ListItem
key={module.id}
className="ModulePreview"
>
{module.id} - {module.name} - {module.thumbnail}
<FontAwesome
name="plus-circle"
size="2x"
onClick={props.addModule.bind(this, module)}
className="AddModule"
/>
</ListItem>
)
}
})
return (
<div className="ModulesList">
<List>
{ListItems}
</List>
</div>
)
}
尽管我只能在每个选项卡中看到过滤后的项目(因此键是唯一的,因为每个项目只存在一次)我仍然收到此警告:
Warning: flattenChildren(...): Encountered two children with the same key,
1
. Child keys must be unique; when two children share a key, only the first child will be used.
这是为什么?
任何帮助/想法/提示将不胜感激。
提前致谢! :)
那一行的意思是 module.id
不是唯一的,在 array
中会有 2 个 objects
具有相同的 id=1
,以避免你可以使用object
的索引,它将始终是唯一的。
使用这个:
let ListItemsUI = [];
props.modulesProps.forEach((module, i) => {
if (props.filter === module.category) {
ListItemsUI.push (
<ListItem
key={i}
className="ModulePreview"
>
{module.id} - {module.name} - {module.thumbnail}
<FontAwesome
name="plus-circle"
size="2x"
onClick={props.addModule.bind(this, module)}
className="AddModule"
/>
</ListItem>
)
}
})
return (
<div className="ModulesList">
<List>
{ListItemsUI}
</List>
</div>
)
还有一件事 map
不适合这些情况,您希望根据条件 return
只有少数元素,为此使用 forEach
。原因是如果你不 return
任何东西,默认情况下 map
将 return undefined
.
检查这个例子的输出:
let a = [1,2,3,4,5,6,7,8];
let b = a.map(el=>{
if(el % 2 == 0)
return el;
})
console.log(b);