如何在没有 key prop 警告的情况下拥有数组的嵌套映射?

How to have nested maps of an array without the key prop warning?

提问人:Fateme Ghalandari 提问时间:8/28/2023 更新时间:8/28/2023 访问量:33

问:

我有一个数据数组:

const arr = [
  {
    title: "title1",
    content: [
      {
        id: "home",
        name: "Home",
      },
      {
        id: "services",
        name: "services",
      },
      {
        id: "Appointments",
        name: "Appointments",
      },
    ],
  },
  {
    title: "title2",
    content: [
      {
        id: "about us",
        name: "about us",
      },
      {
        id: "contact",
        name: "contact",
      },
      {
        id: "blog",
        name: "blog",
      },
    ],
  },
];

我想绘制所有这些地图。 我尝试过使用和添加到每个标签nested mapskey prop

{arr.map((element) => (
          <div key={element.name}>
            <h4 key={element.name}>{element.title}</h4>
            <ul key={element.name}>
              {element.content.map((index) => (
                <li key={index.id}>
                  {index.name}
                </li>
              ))}
            </ul>
          </div>
        ))}

我试过使用,它工作正常并显示数组,但我收到了此警告nested maps

警告:列表中的每个子项都应该有一个唯一的“键”道具。

我应该如何解决此警告?

嵌套的 reactjs 数组

评论


答:

0赞 Akash kandasamy 8/28/2023 #1
{arr.map((element , index) => (     // added index 
      <div key={index}>
        <h4 key={element.name}>{element.title}</h4>
        <ul key={element.name}>
          {element.content.map((index) => (
            <li key={index.id}>
              {index.name}
            </li>
          ))}
        </ul>
      </div>
    ))}

这会将索引添加到数组映射。

评论

0赞 Fateme Ghalandari 8/28/2023
警告已更改:警告:遇到两个具有相同密钥的子项。密钥应该是唯一的,以便组件在更新中保持其标识。非唯一键可能会导致子项被重复和/或省略 - 该行为不受支持,并且可能会在将来的版本中更改。0
0赞 Jerry 8/28/2023 #2

当任何循环或嵌套循环开始时,应将其放置在
它应该起作用:
key={index}parent element tag.

{arr.map((element,index) => (
          <div key={index}>
            <h4>{element.title}</h4>
            <ul>
              {element.content.map((item,index2) => (
                <li key={index2}>
                  {item.name}
                </li>
              ))}
            </ul>
          </div>
        ))}