reactjs 在JSX中显示具有属性的对象列表

r1zhe5dt  于 2023-05-28  发布在  React
关注(0)|答案(2)|浏览(116)

我有以下来自我的React组件的代码:

<div className="mainApp">
            <div className="pkgsList">
                {pkgData.map((p) => 
                    <h3 key={p.name}>{p.name}</h3>                    
                )}
                    
            </div>
        </div>
    )

在本例中,pkgData是一个对象数组,它试图描述本场景中的包。每个对象都包含一个字符串属性name和一个数组属性sources,其中每个项也是一个对象。我想在上面的h3元素下面打印sources中的项目(每个项目有几个属性),但我似乎不知道如何在上面的内容上添加更多的HTML / JSX-任何帮助都将不胜感激。
我一直尝试为每个p调用map,但无论我是将它 Package 在()上还是仅 Package 在{}上,都会遇到错误。

{p.map((s) => {
                       
})

因此,生成的div代码将是:

<div className="pkgList">
                {pkgData.map((p) => 
                    <h3 key={p.name}>{p.name}</h3>
                    {p.map((c) => {
                        
                    })
                )}
            </div>

不会让我的react应用程序编译成功。

ej83mcc0

ej83mcc01#

错误Map

首先,pkgData.map中的嵌套Map是错误的。因为p本身不是数组。Map应该是这样的

{p.sources.map((c) => {
    ...
    }
  )}

JSX错误

第二,就像@大卫在评论中说的那样,由于JSX在后台的工作方式,您不能有多个顶级元素。例如,代码

<div className="mainApp">
  <div className="pkgsList">
    {pkgData.map((p) => 
      <h3 key={p.name}>{p.name}</h3>                    
    )}
  </div>
</div>

相当于这个

<div className="mainApp">
  <div className="pkgsList">
    {pkgData.map((p) => {
      return React.createElement("h3", {key: p.name}, p.name)
      }                    
    )}
  </div>
</div>

因此,如果在顶层返回多个JSX元素,React.createElement将无法工作。因此,你应该在顶层用一些标签 Package 这些东西,比如fragments(<>),div等。
比如说

<div className="mainApp">
  <div className="pkgsList">
    {pkgData.map((p) =>
      <>
        <h3 key={p.name}>{p.name}</h3>
        {p.sources.map((c) => 
          <p>{c.something}</p>
        )} 
      </>
    )}
  </div>
</div>

仅供参考:https://react.dev/reference/react/createElement#creating-an-element-without-jsx

pkwftd7m

pkwftd7m2#

在map中只能返回1个jsx元素,就像在普通组件中一样。如果你想在map函数中呈现多个元素,你可以把代码 Package 在一个react片段中,如下所示:

<div className="mainApp">
    <div className="pkgsList">
        {pkgData.map((p) => (
            <> {/* <- this is a fragment */}
                <h3 key={p.name}>{p.name}</h3>
                {p.sources.map((s) => (
                    <>{/* render source here */}</>
                ))}
            </>
        ))}
    </div>
</div>

相关问题