next.js Reactarray.map()sub-children键

v7pvogib  于 2023-05-06  发布在  React
关注(0)|答案(1)|浏览(94)

我已经构建了一个React组件,它从Azure Cosmos数据库(JSON对象)获取数据,并在Web应用程序中以类似卡片的结构显示这些数据。
JSON包含几个顶级键/值对,然后是一个'tickets'节点,它可以包含数量可变的子节点,编号为1..n,其中几个键/值对作为子节点,请参见下面的简化示例:

{
    "id": "541f6100-ab47-48ed-a415-92a509c4b9bd",
    "tickets": {
        "1": {
            "ticketID": "d10400e3-ccea-4592-aef1-19005f9c91d8"
        },
        "2": {
            "ticketID": "05a7e6d4-a4ff-4402-bb42-52fdc7dbf72b"
        },
        "3": {
            "ticketID": "e7e332f2-be7b-47b8-a864-2244d720a12e"
        }
    }
}

我的React组件大致结构如下(为了可读性而简化):

const Cards = ({ CosmoData }) => {
  return (
    <div>
      {CosmoData.map((card) => (
        <div>
          <div key={card.id}>
            <div>
              <div>
                <table>
                  <tbody>
                    <tr key={card.tickets}>
                      <td>2</td>
                      <td>3</td>
                      <td>4</td>
                    </tr>
                  </tbody>
                </table>
              </div>
            </div>
          </div>
        </div>
      ))}
    </div>
  );
}

数据由服务器组件馈送到客户端组件,如下:

export default async function Page() {
  // Fetch data directly in a Server Component
  const CosmoData = await getCards();

  // Forward fetched data to your Client Component
  return <Cards CosmoData={CosmoData} />;
};

因此CosmoData.map()方法使顶级键/值对可访问。但是,我似乎找不到如何使用子节点,特别是计算子节点的数量,以便索引可以用于键属性。
我应该以某种方式嵌套.map方法吗?

mbyulnm0

mbyulnm01#

我通过使用嵌套数组Map解决了这个问题。因此(请注意,这只是从标签开始的代码块):

<tbody>
{Object.keys(card.tickets).map((i) => {
  return (
    <tr key={i} className="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
          <th scope="row" className="px-6 py-4 font-medium text-gray-900 whitespace-nowrap dark:text-white">
              {card.tickets[i].ticketID}
          </th>
          <td className="px-6 py-4">
              {card.tickets[i].ticketNumber}
          </td>
          <td className="px-6 py-4">
              {card.tickets[i].ticketStatus}
          </td>
          <td className="px-6 py-4">
              {card.tickets[i].ticketURL}
          </td>
    </tr>
    )
  })}
</tbody>

请注意,由于ticket节点本身被视为一个对象,所以在再次对其使用.map()方法之前,必须首先使用Object.keys()。

相关问题