【问题标题】:Warning: flattenChildren(...): Encountered two children with the same key in reactjs警告:flattenChildren(...):在 reactjs 中遇到两个具有相同键的孩子
【发布时间】:2017-04-05 15:37:13
【问题描述】:

我正在使用 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>
            )
        }

即使我只能在每个选项卡中看到过滤后的项目(因此键是唯一的,因为每个项目只存在一次)我仍然收到此警告:

警告:flattenChildren(...): 遇到两个相同的孩子 键,1。子键必须是唯一的;当两个孩子共用一把钥匙时, 只会使用第一个孩子。

为什么会这样?

任何帮助/想法/提示将不胜感激。

提前非常感谢! :)

【问题讨论】:

    标签: javascript reactjs material-ui


    【解决方案1】:

    该行的意思是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 将返回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);

    【讨论】:

    • 谢谢,我不再收到警告,但是每个项目出现 3 次,因为我在页面上的元素有 3 次(在每个选项卡中),我想我需要防止重复如果元素已经在数组中,则不应再次推送...我可以使用 id 来做到这一点 - 每个模块都是唯一的
    • 你必须从数组中删除重复的条目,我认为。你是如何准备这个数组的?
    • 它只是一个空数组 ListItems = [] 然后我在 中添加了 data-itemid={module.id} 以便我可以确定重复项
    • 为什么这样的东西不起作用? const ListItemsUnique = [] ListItems.map(item => { if (ListItemsUnique.indexOf(item.props['data-itemid']) === -1) { ListItemsUnique.push(item) } })
    • 我认为问题是 item 将是一个对象,并且您正在将该对象推送到唯一列表中,并检查 data-itemid 的索引。
    猜你喜欢
    • 2017-12-15
    • 2017-05-17
    • 2016-07-10
    • 2017-09-11
    • 2017-08-08
    • 2017-06-01
    • 1970-01-01
    • 2018-01-01
    • 2016-01-28
    相关资源
    最近更新 更多