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

警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查“ListView”的渲染方法`

阎宾实
2023-03-14

我用ReactNative为iOS和android构建了一个应用程序,它具有ListView。使用有效数据源填充listview时,屏幕底部会显示以下警告:

警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查列表视图的渲染方法。

这个警告的目的是什么?在消息之后,他们链接到这个页面,在这里讨论了完全不同的事情,这些事情与反应本机无关,而是与基于网络的反应有关。

我的ListView是用以下语句构建的:

render() {
    var store = this.props.store;

    return (

        <ListView
            dataSource={this.state.dataSource}
            renderHeader={this.renderHeader.bind(this)}
            renderRow={this.renderDetailItem.bind(this)}
            renderSeparator={this.renderSeparator.bind(this)}
            style={styles.listView}
            />

    );
}

我的数据源包括以下内容:

    var detailItems = [];

    detailItems.push( new DetailItem('plain', store.address) );
    detailItems.push( new DetailItem('map', '') );

    if(store.telefon) {
        detailItems.push( new DetailItem('contact', store.telefon, 'Anrufen', 'fontawesome|phone') );
    }
    if(store.email) {
        detailItems.push( new DetailItem('contact', store.email, 'Email', 'fontawesome|envelope') );
    }
    detailItems.push( new DetailItem('moreInfo', '') );

    this.setState({
        dataSource: this.state.dataSource.cloneWithRows(detailItems)
    });

并且ListView行使用以下内容呈现:

        return (
            <TouchableHighlight underlayColor='#dddddd'>
                <View style={styles.infoRow}>
                    <Icon
                                name={item.icon}
                                size={30}
                                color='gray'
                                style={styles.contactIcon}
                                />
                    <View style={{ flex: 1}}>
                        <Text style={styles.headline}>{item.headline}</Text>
                        <Text style={styles.details}>{item.text}</Text>
                    </View>
                    <View style={styles.separator}/>
                </View>
            </TouchableHighlight>
        );

一切正常,正如预期的那样,除了警告,这似乎是完全无稽之谈。

向我的“DetailItem”-类添加一个键属性并没有解决这个问题。

这就是“cloneWithRows”真正传递给ListView的内容:

_dataBlob: 
I/ReactNativeJS( 1293):    { s1: 
I/ReactNativeJS( 1293):       [ { key: 2,
I/ReactNativeJS( 1293):           type: 'plain',
I/ReactNativeJS( 1293):           text: 'xxxxxxxxxx',
I/ReactNativeJS( 1293):           headline: '',
I/ReactNativeJS( 1293):           icon: '' },
I/ReactNativeJS( 1293):         { key: 3, type: 'map', text: '', headline: '', icon: '' },
I/ReactNativeJS( 1293):         { key: 4,
I/ReactNativeJS( 1293):           type: 'contact',
I/ReactNativeJS( 1293):           text: '(xxxx) yyyyyy',
I/ReactNativeJS( 1293):           headline: 'Anrufen',
I/ReactNativeJS( 1293):           icon: 'fontawesome|phone' },
I/ReactNativeJS( 1293):         { key: 5,
I/ReactNativeJS( 1293):           type: 'contact',
I/ReactNativeJS( 1293):           text: 'xxxxxxxxx@hotmail.com',
I/ReactNativeJS( 1293):           headline: 'Email',
I/ReactNativeJS( 1293):           icon: 'fontawesome|envelope' },
I/ReactNativeJS( 1293):         { key: 6, type: 'moreInfo', text: '', headline: '', icon: '' } ] },

正如一个键所见,每个记录都有一个键属性。警告仍然存在。


共有3个答案

元嘉木
2023-03-14

您还可以使用迭代计数(i)作为

render() {
    return (
      <ol>
        {this.props.results.map((result, i) => (
          <li key={i}>{result.text}</li>
        ))}
      </ol>
    );
}
邵奇
2023-03-14

你需要提供一把钥匙。

如果您有键属性,请尝试在ListView行中执行此操作:

<TouchableHighlight key={item.key} underlayColor='#dddddd'>

如果没有,尝试只是添加项目作为关键:

<TouchableHighlight key={item} underlayColor='#dddddd'>
鲁望
2023-03-14

我已经有一段时间和你有完全相同的问题了,在看了上面的一些建议后,我终于解决了这个问题。

事实证明(至少对我来说),我需要提供一个键(一个称为'key'的道具)到我从我的render分离器方法返回的组件。将密钥添加到我的renderRow或renderSectionHeader并没有做任何事情,但是将其添加到render分隔符会使警告消失。

希望有帮助。

 类似资料:
  • 问题内容: 我使用 ReactNative 为iOS和android 构建了一个带有的应用。当使用有效的数据源填充listview时,屏幕底部将显示以下警告: 警告:数组或迭代器中的每个子代都应具有唯一的“键”道具。检查的渲染方法。 此警告的目的是什么?消息后,它们链接到此页面,在此讨论了完整的不同内容,这些内容与react native无关,而与基于Web的reactjs有关。 我的ListVi

  • 问题内容: G’Day。我想遍历一堆JSON对象,然后将它们变成React Elements。对象看起来像这样 遍历它们的代码非常简单。这样: 而且我收到错误警告:数组或迭代器中的每个子代都应具有唯一的“键”属性。有什么提示吗?干杯 我更改了代码以执行此操作。 而且我得到同样的错误。我不明白为什么!固定!谢谢您的帮助。 这是代码。 问题答案: 您需要向React元素添加一个唯一的key prop。

  • 我对React JS组件中的关键道具有问题。 我正在得到 警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查登录的呈现方法。从应用程序中传递了一个孩子。 控制台日志中的警告。应用程序组件如下: 我的登录组件如下: 我对React还是个新手,我不确定我应该像钥匙一样传递什么,在哪里传递? 使现代化 LoginForm组件: 路由文件: 主页组件

  • 我有一个包含数组的对象。我能够使它呈现我想要的方式。然而,反应键给我带来了麻烦;抛出这个“警告:列表中的每个孩子都应该有一个独特的“钥匙”道具。” 我曾尝试在原始数组对象中为每个数组中的每个元素指定一个唯一的“id”属性,但没有帮助。 我也看了这些,但我想我有所有的建议:数组或迭代器中的每个孩子都应该在reactjs中有一个唯一的“键”道具警告:列表中的每个孩子都应该有一个唯一的“键”道具警告:一

  • 我完全糊涂了,因为我的控制台有错误,我阅读了reactjs文档和有关stackoverflow的所有提示,但我无法理解问题是什么。我看到了书的标题列表({item.volumeInfo.title}),但控制台有错误。 这是我的密码: 这是API响应的一部分: 我试着做下一个键: key={item.etag}, key={i}, key={item.volumenfo.title} 但错误仍然存