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

为数组儿童创建独特的关键道具(React.js)

何睿范
2023-03-14

我试图在React中构建一个组件,它从JSON源获取信息,并使用其中的一些信息创建可以传递到其他单独组件的状态。虽然我还没有将状态传递到单独的组件中,但我已经能够使用JSON中的信息更新状态。然而,当我加载我的页面时,我会得到一个错误代码,我想在继续我的项目之前对其进行整理,以防在代码中留下错误会产生意外的副作用。错误代码如下所示:

js:1警告:列表中的每个子级都应该有一个唯一的“key”属性。

检查FetchData

在div(在FetchData.js:27)

在FetchData(在App.js: 8)

在div(在App.js: 7)

我的pp.js如下所示:

import React from 'react';
import './App.css';
import FetchData from './Components/FetchData/FetchData';

function App() {
  return (
    <div className="App">
      <FetchData/>
    </div>
  );
}
export default App;

我的FetchData.js如下所示:

import React from 'react';

class FetchData extends React.Component {
    constructor() {
        super();
        this.state = {
            portrait: null,
            title: null
        };
    }

    componentDidMount() {
        fetch('https://randomuser.me/api')
        .then (response => {
            return response.json();
        })
        .then (data => { 
            let userImage = data.results.map((person) => {
                return (
                    <div>
                        <img alt='portrait' img src={person.picture.large}/>
                    </div>
                )
            })
            let userTitle = data.results.map((person) => {                                  //line 27
                return (
                    <div key={person.results}>
                        <div> {person.name.title} </div>
                    </div>
                )
            })
            
            this.setState ({ 
                portrait: userImage,
                title: userTitle
             })
             console.log(this.portrait, this.title)
        })
    }
    
    render() {
        return (
            <div className='box1'>
                <div className='box2'>
                    <h2>{this.state.title}</h2>
                    {this.state.portrait}
                </div>
            </div>
        )
    }
};

export default FetchData;

以防万一,因为我的index.js看起来像这样:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

serviceWorker.unregister();

我认为问题在于我在“data.results.map”和“data.results.map”中都使用了“person”,所以我尝试更改命名,但也没有成功。任何帮助都将不胜感激!

共有3个答案

华宣
2023-03-14

在您的data.results.map((人))函数中,您需要添加idx prop,因此您的代码应该如下所示:

let userImage = data.results.map((person,idx) => {
                return (
                    <div key={idx}>
                        <img alt='portrait' img src={person.picture.large}/>
                    </div>
                )
            })
宋琛
2023-03-14

使用索引作为键是React中的一种反模式。

切勿将索引用作React中的键,除非:

  • 列表和项目是静态的–它们不会计算且不会更改
  • 列表中的项目没有ID
  • 列表从不重新排序或过滤

当满足所有条件时,您可以安全地将索引用作键。

如果没有,请使用唯一ID。

它可能来自要显示的元素,

或者,您可以向模型添加新的ID属性,或者对内容的某些部分进行散列以生成密钥。这把钥匙只需要在它的兄弟姐妹中是唯一的,而不是全球唯一的。

在React Docs中阅读更多信息

章青青
2023-03-14

错误是指FetchData组件。

如果为返回的DOM对象分配唯一的密钥,React中的协调算法可以工作。在本例中,您将从map函数返回一个类似DOM对象的列表。任何返回的块都必须在父节点上声明key属性。

就你而言:

componentDidMount() {
        fetch('https://randomuser.me/api')
        .then (response => {
            return response.json();
        })
        .then (data => { 
            let userImage = data.results.map((person) => {
                return (
                    <div key={person.id}>
                        <img alt='portrait' img src={person.picture.large}/>
                    </div>
                )
            })
            let userTitle = data.results.map((person) => {                                  //line 27
                return (
                    <div key={person.id}>
                        <div> {person.name.title} </div>
                    </div>
                )
            })
            
            this.setState ({ 
                portrait: userImage,
                title: userTitle
             })
             console.log(this.portrait, this.title)
        })
    }

键值必须是唯一的字符串,React使用它在状态更改时更新正确的DOM节点。(我不知道你的person.results是如何填写的,但你需要一种身份证)

对于简单组件,也可以使用此语法

            let userImage = data.results.map((person,idx) => {
                return (
                    <div key={idx}>
                        <img alt='portrait' img src={person.picture.large}/>
                    </div>
                )
            })

请注意使用这种语法,因为idx是包含数组中当前元素的位置,如果多次使用,它会导致重复的键(并且React会认为具有相同键的节点是相同的节点)

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

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

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

  • 我的控制台出现错误, 我的JSON在这里https://dev.justinblayney.com/wp-content/uploads/2020/12/main-menu.json_.zip 警告:列表中的每个孩子都应该有一个唯一的“键”道具。 在我的页面上显示的是(所以他们都是独一无二的,所以WTF反应) 钥匙:2429钥匙:2430钥匙:3859钥匙:2421钥匙:2802钥匙:2428 另

  • 我知道这个问题有很多答案,但我找不到一个能完全解决我问题的答案。我得到以下错误:

  • 昨天我在我的项目中添加了,现在当我离开并回到导航中的元素时,它会重新加载Sky,我得到 警告:儿童(…):遇到两个具有相同密钥的子项,。子密钥必须是唯一的;当两个子项共享密钥时,将只使用第一个子项。 (上面使用的数字50只是一个例子,它每次抛出这个错误~40次,都是不同的id) 这个问题似乎源于我的文件: 因为每次我进入另一个屏幕时,这个组件都会卸载,然后在我回来时重新安装。 当完成时,创建了一组