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

在渲染对象数组时,不断获取“警告:列表中的每个子级都应具有唯一的“键”属性。”

萧萧迟
2023-03-14

我有一个包含数组的对象。我能够使它呈现我想要的方式。然而,反应键给我带来了麻烦;抛出这个“警告:列表中的每个孩子都应该有一个独特的“钥匙”道具。”

我曾尝试在原始数组对象中为每个数组中的每个元素指定一个唯一的“id”属性,但没有帮助。

我也看了这些,但我想我有所有的建议:数组或迭代器中的每个孩子都应该在reactjs中有一个唯一的“键”道具警告:列表中的每个孩子都应该有一个唯一的“键”道具警告:一个数组或迭代器中的每个孩子数组或迭代器应该有一个唯一的“键”道具。检查ListView的渲染方法

我的对象

const courses = 
[
    {
      name: 'Half Stack application development',
      id: 'Half Stack application development',
      parts: [
        {
          name: 'Fundamentals of React',
          exercises: 10,
          id: 'Fundamentals of React'
        },
        {
          name: 'Using props to pass data',
          exercises: 7,
          id: 'Using props to pass data'
        },
        {
          name: 'State of a component',
          exercises: 14,
          id: 'State of a component'
        },
        {
          name: 'Redux',
          exercises: 11,
          id: 'Redux'
        }
      ]
    }, 
    {
      name: 'Node.js',
      id: 'Node.js',
      parts: [
        {
          name: 'Routing',
          exercises: 3,
          id: 'Routing'
        },
        {
          name: 'Middlewares',
          exercises: 7,
          id: 'Middlewares'
        }
        ]
    }
]


ReactDOM.render(<App course={courses}/>, document.getElementById('root'));

这是回调顺序:

应用程序-

const App = ({course}) => {
  return (
    <>
      <Courses course={course} />
    </>
  )
}

const Courses = ({course}) => {
    console.log("Starting.....")
    const courseList = course.map(nameConent => nameConent)
    // console.log(courseList)
    // const idList = courseList.map(eachCourse =>eachCourse.id)
    const mapEverything = () => courseList.map(a => <Course name={a.name} partsList={a.parts} id={a.id}/>)
    // const mapEverything = () => courseList.map(a => console.log(a.id))
    // console.log("CourseID",idList)
    return (
        <>  
            {mapEverything()}
        </>

    )
}

const Course = ({name,partsList,id}) => {
    // console.log(name)
    console.log("CourseID", id)

    return (
        <>
            <div key={id}>
                <Header header={name} id={id}/>
                <Content contents={partsList} id={id+"======"}/>
            </div>
        </>
    )
}

const Content = ({contents,id}) => {
    console.log("contentsID",id)
    const partList = () => contents.map(part =>
        <Part
            name={part.name}
            id={part.id} 
            exercises={part.exercises}
        />
    )

    const getSumofArray = (accumulator, currentValue) => accumulator + currentValue

    const exeList = contents.map(content => content.exercises).reduce(getSumofArray)
    // console.log(exeList)
    return (
        <>
            <ul key={id}>
                {partList()}
            </ul>
            <b>total exercises: {exeList}</b>
        </>
    )
}

const Header = ({header, id}) => {
    console.log("HeaderID", id)
    return (
        <>
            <h1 key={id}>
                {header}
            </h1>
        </>
    )
}

const Part = ({name, id, exercises}) => {
    console.log("PartID", id)
    return (
        <>
            <li  key={id}>
                {name}: {exercises}
            </li>
        </>
    )
}


它在课程和内容方面遇到了问题。

警告截图:https://drive.google.com/open?id=1kcLlF0d90BG6LXPojDtfSlBFGafC9HC_

共有2个答案

别永年
2023-03-14

这是关键道具的主题。无论何时在Reactjs中呈现数组或列表,它都希望有一个键属性可用。

此键属性的存在是出于性能考虑,它使Reactjs更容易呈现项目列表。

您所要做的就是为数组中的任何其他元素提供另一个道具。您的课程列表中最独特的标识符似乎是名称。因此,您可能需要将代码简化为这样的内容,以使自己能够运行:

const CourseList = () => {
  const RenderedCourses = courses.map(function(course) {
    return <CourseDetail key={course.name} course={course} />;
  });
  return <ul>{RenderedCourses}</ul>;
};

然后,一旦你开始工作,你可以使代码简洁,你是如何用箭头函数和所有:

const CourseList = () => {
  const RenderedCourses = courses.map(course => (
    <CourseDetail key={course.name} course={course} />
  ));
  return <ul>{RenderedCourses}</ul>;
};
廉子民
2023-03-14

我认为问题在于:

const mapEverything = () => courseList.map(a => <Course name={a.name} partsList={a.parts} id={a.id}/>)

您应该尝试在此处添加密钥:

const mapEverything = () => courseList.map(a => <Course name={a.name} partsList={a.parts} id={a.id} key={a.id}/>)

这里也是:

const partList = () => contents.map(part =>
        <Part
            name={part.name}
            id={part.id} 
            exercises={part.exercises}
            key={part.id}
        />)

下面是一个很好的解释,说明了为什么需要这样做。

 类似资料:
  • 我是新手,我正在编写一个包含卡片的应用程序平面列表,但我发现这个错误,这是我的代码 但是我得到警告:列表中的每个孩子都应该有一个独特的“钥匙”道具。有关更多信息,请参见https://fb. me/react-warge-key。%s, 我做错了什么?

  • 得到一个警告:列表中的每个孩子都应该有一个唯一的“键”道具。我想不出我需要用哪把钥匙。 我红了反应指南,但它不能帮助我理解如何在我的情况下使用它

  • 我用ReactNative为iOS和android构建了一个应用程序,它具有。使用有效数据源填充listview时,屏幕底部会显示以下警告: 警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查

  • 向整个社区问好。 我正在做一个项目,在这个项目中,我所在城市的餐馆可以通过这个应用程序放置他们的菜肴并生成订单。 但是我在执行项目时遇到了一个错误。 这就是我犯的错误。 我正在用React本地做我的前端项目。 **我的代码是这个-我的前端** 应用程序。js 餐食 创建一个调用Flatlist操作的列表,并管理列表中的信息。 列表js 获取我的项目的url。 UseFecth.js 我的modal

  • 我一直在调试这个,开始掉头发。到目前为止,我还没有找到解决办法。这是组件。我最初是为组件编写测试的,但是由于样式化的组件,它出现了一些错误,所以我的技术负责人告诉我为这个新的组件(这是组件中的新组件)编写测试,因为它可能有一些效果。运行<代码>摘要时。测验tsx我收到此错误(与钥匙相关): 我的挑逗测试: 我的戏弄组件:

  • 在这个简单的React应用程序中,我不明白为什么我会收到以下警告信息: 警告:列表中的每个孩子都应该有一个唯一的“键”道具。 对我来说,似乎我把密钥放在了正确的位置,形式为key={item.login.uuid} 我怎样才能摆脱警告信息?把钥匙放在哪里合适? 应用程序。js 列表js