【问题标题】:Render table cells (td) with different HTML tags in React在 React 中使用不同的 HTML 标签渲染表格单元格(td)
【发布时间】:2019-10-22 04:50:49
【问题描述】:

我正在开发一个 React 应用程序,它从 API 获取数据并将其呈现到表中。我有 3 个组件:RowBodyTableTable 获取数据,将其传递给 BodyBody 将其传递给 Row,然后呈现单元格。

我面临的问题是Row 中的数据既是文本又是图像。这就是 myRow 组件的外观:

const Row = props => {
  return(
    props.data.map(row =>
      <tr key={row.id}>
          {props.cols.map(col =>
             <td>{row[col.name]}</td>
          )}
      </tr>
   )
  );
}

从 API 获取的数据采用以下形式:

data = [
  {
    "firstName": "Jack",
    "lastName": "Sparrow",
    "id": "jckspr"
  }
]

但是,我还需要通过&lt;img src="images/logo.png"&gt; 在第四列中渲染一个静态的小图像。但我无法使用我已实现的当前代码逻辑呈现此图像,即我无法在 Body:
&lt;Row data={data} cols={tableHeaders}&gt; 中呈现此图像,tableHeaders

[
  { header: "First Name", name: "firstName" },
  { header: "Last Name", name: "lastName" },
  { header: "id", name: "id" },
  { header: "Image", name: "image" }
]

如何在保持可重用和可扩展的代码架构的同时实现我想要的功能?

【问题讨论】:

    标签: html reactjs jsx code-reuse


    【解决方案1】:

    为单元格创建一个新组件

    const Cell = ({ colName, value }) => {
      if (colName === 'image') {
        return <img src="images/logo.png" />;
      }
      // Other if's for other possible cell types
      // ...
      // Otherwise return the value
      return value;
    }
    

    然后更新 Row 组件:

    const Row = props => {
      return(
        props.data.map(row =>
          <tr key={row.id}>
              {props.cols.map(col =>
                 <td>
                   <Cell colName={col.name} value={row[col.name]} />
                 </td>
              )}
          </tr>
       )
      );
    }
    

    【讨论】:

    • 非常感谢,这是个好主意。但是,我面临一个问题。我从 API 收到的数据采用我在问题中指定的 data 数组的形式,因此它没有 Image 字段。除非我使用map 向每个对象添加Image 字段,否则使用row[col.name] 将不起作用。这是低效的,因为数组很大,有很多对象。你知道我还能如何做到这一点吗?
    • 您可以依靠 col.name 来定义渲染单元格的方式。我会用这个想法更新答案。
    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2016-11-15
    • 2011-10-02
    • 2018-01-11
    • 2020-08-17
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多