当前位置: 首页 > 知识库问答 >
问题:

警告:flatten儿童(...):遇到两个具有相同密钥的儿童/儿童密钥必须是唯一的

盖昀
2023-03-14

昨天我在我的项目中添加了react router dom,现在当我离开并回到导航中的Sky元素时,它会重新加载Sky,我得到

警告:儿童(…):遇到两个具有相同密钥的子项,element-id-50。子密钥必须是唯一的;当两个子项共享密钥时,将只使用第一个子项。

(上面使用的数字50只是一个例子,它每次抛出这个错误~40次,都是不同的id)

这个问题似乎源于我的天空。js文件

componentWillMount() {
    this.props.dispatch(requestSkySetup());
    this.props.dispatch(requestAllElements());

    this.setState({loadedSky: true, loadedElements: true});
}

因为每次我进入另一个屏幕时,这个组件都会卸载,然后在我回来时重新安装。

receiveSkySetup完成时,sky中的render功能。js创建了一组名为扇区s的div,每个扇区创建了几个名为插槽s的div。

然后在槽内。渲染我有:

return connectDropTarget(
            <div className={showOutline ? 'slot showOutline' : 'slot'} style={style} onClick={interactable ? this.handleClick : null}>
                {
                    elements
                        .map(e => (
                            <SkyElement
                                id={e.id}
                                key={`element-id-${e.id}`}
                                title={e.title}
                                size={150}
                                opacity={e.opacity}
                                glow={e.glow}
                                color={e.color}
                                sectorId={e.sectorId}
                                slotId={e.id}
                                dispatch={this.props.dispatch}
                                isDragging={false}
                                transformElement={false} />
                        ))
                }
            </div>
        );

上面的SkyElement调用中的key元素是在每次安装时抛出40个错误的原因。

如果需要,乐意提供更多代码。

任何帮助都会大有裨益。谢谢

编辑:控制台日志记录元素

再深入一点,我的商店里的商品翻了一番。

因此,在sky选项卡的第二个渲染中,元素id的完整列表是["0","1","2","3","4","5","6","7","17","18","19","55"、"56"、"57"、"58"、"59"、"60"、"61"、"62"、"63"、"64"、"65"、"66"、"67"、"77"、"78"、"0"、"1"、"2"、"3"、"4","5"、"6"、"7"、"17"、"18"、"19"、"55"、"56"、"57"、"58"、"59"、"60"、"61"、"62"、"63"、"64"、"65"、"66"、"67"、"77","78"]

在第三次渲染时,元素0-78(从上面的数组中应用的id)将再次添加到数组

插槽中。js

const mapStateToProps = ({elements}, ownProps) => {
    return {
        elements: getElementsBySlotId(elements, ownProps.id),
    };
};

元素这里将是n乘以Sky已完成的加载次数。

天空中。js

const mapStateToProps = ({sky, elements}) => {
    return {
        sectors: getSky(sky).sectors,
        elements: getElementsByKeyName(elements, 'visibleElements'),
        unplacedElements: getElementsByKeyName(elements, 'unplacedElements'),
    };
};

打印元素。长度我看到它们在这里也加倍了。狭槽js是从同一家商店购买的,所以这是有意义的

在我的元素/reducer.js

case 'receiveAllElements':
        const visibleElements = {};
        const unplacedElements = {};

        const elements = action.elements.reduce((result, index) => {
            result[`${index.id}`] = index;
            return result;
        }, {});

        const keys = Object.keys(elements);
        for (const key of keys) {
            const e = elements[key];

            if (e.sectorId === null) {
                unplacedElements[key] = e;
            } else {
                visibleElements[key] = e;
            }
        }

        const visibleIds = Object.keys(visibleElements);
        const unplacedIds = Object.keys(unplacedElements);
        console.log(visibleIds);
        console.log(unplacedIds); // logging these, the numbers are consistent and don't double, triple etc with each load

        return {
            ...state,
            elementsMap: {
                ...state.elementsMap,
                ...elements,
            },
            visibleElements: [...state.visibleElements, ...visibleIds],
            unplacedElements: [...state.unplacedElements, ...unplacedIds],
        };

也许里面有什么导致计数翻倍了?

共有1个答案

尚景焕
2023-03-14

这里的问题是

    return {
        ...state,
        elementsMap: {
            ...state.elementsMap,
            ...elements,
        },
        visibleElements: [...state.visibleElements, ...visibleIds],
        unplacedElements: [...state.unplacedElements, ...unplacedIds],
    };

即,visibleElements(和unplace edElements值)。

[…state.visibleElements,…visibleId]将包含2个数组,因此,由于每次我返回Sky选项卡时都会命中此代码,因此它会在中添加新的ID。。。VisibleID,指向我在中已经拥有的数组。。。状态可见元素和加倍值

 类似资料:
  • 我对gitlab ci子管道有问题。需要在具有多个应用程序的repo中的每次提交后自动触发ci管道。需要配置以检测哪些文件夹/文件被修改,以便知道要触发哪个应用程序管道 结构示例 Main“.gitlab ci.yml”是: appA1".gitlab-ci.yml"是: appA2“.gitlab ci.yml”是: 这种配置的目的是,例如,当我在应用**中更改文件时,管道会检测到更改并生成应用

  • 我有一个非常简单的功能组件,如下所示: 还有一个组件: 我不断收到以下错误: [ts]JSX元素类型“ReactNode”不是JSX元素的构造函数。类型“未定义”不能分配给类型“元素类”。[2605] 如何正确键入?

  • 我对阿克卡很陌生,我有一个(希望)简单的问题。我有一个参与者需要重复执行某个小的子任务——也就是说,每次这个参与者收到消息时,它都必须执行N个子任务。这个子任务是我指定给儿童演员的。我的问题是,我是否应该为每个子任务创建一个新的子角色实例?或者我应该简单地产生一个孩子演员,并发送N条消息?在这种情况下,最好的做法是什么? 为了更好地说明我的问题,这里有两个简化的示例(在Java中-但希望对Scal

  • 我希望一个标签的所有子项没有标签之间的空白。但是美丽的汤和也返回标记之间的空白。 这张照片是: 同 我想要的是: 有没有办法告诉BeautifulSoup只返回标签而忽略空白? 文档对此主题没有多大帮助。示例中的html在标记之间不包含任何空格。 事实上,去除html标记之间的所有空白可以解决我的问题: 使用这个html,我得到的标签之间没有空格,因为标签之间没有空格。但是我希望使用Beautif

  • 本文向大家介绍儿童python练习实例,包括了儿童python练习实例的使用技巧和注意事项,需要的朋友参考一下 实例一: 题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列(只要百不等于十位并且不等于个位)。 实例(Python 2.0+) 实例二: 题目:企业发

  • 我有一个非常简单的功能组件,如下所示: 和另一个组成部分: 我不断发现以下错误: [ts]JSX元素类型“ReactNode”不是JSX元素的构造函数。类型“undefined”不可分配给类型“ElementClass”。[2605] 如何正确地键入此内容?