如何将道具传递到反应表中的行

Posted

技术标签:

【中文标题】如何将道具传递到反应表中的行【英文标题】:How to pass props to row in react-table 【发布时间】:2020-12-14 17:02:35 【问题描述】:

我一直在关注https://blog.logrocket.com/complete-guide-building-smart-data-table-react/。要根据单元格值应用自定义样式,我将像这样更新列对象:

return 
  Header: key,
  accessor: key,
  width: "150",
  sortType: "basic",
  Cell: (cell: value ) => 
    if (value == "Error") 
      return <RedCell/>
    
    ...
  

是否可以改为将自定义样式应用于包含单元格的行?我想一个道具必须被传递到行,但我根本不清楚如何做到这一点。

任何指针将不胜感激。

【问题讨论】:

【参考方案1】:

对于遇到此问题的任何人,react-table 库的作者已在此处回答了此问题 — https://spectrum.chat/react-table/general/v7-row-getrowprops-how-to-pass-custom-props-to-the-row~ff772376-0696-49d6-b259-36ef4e558821

在您的 Table 组件中,您可以为行传递您选择的任何道具(例如,rowProps)——

<Table
        columns=columns
        data=data
        rowProps=row => (
          onClick: () => alert(JSON.stringify(row.values)),
          style: 
            cursor: "pointer"
          
        )
      />

然后实际使用它-

function Table( columns, data, rowProps = () => () ) 
  // Use the state and functions returned from useTable to build your UI
  const  getTableProps, headerGroups, rows, prepareRow  = useTable(
    columns,
    data
  );

  // Render the UI for your table
  return (
    <table ...getTableProps()>
      <thead>
        headerGroups.map(headerGroup => (
          <tr ...headerGroup.getHeaderGroupProps()>
            headerGroup.headers.map(column => (
              <th ...column.getHeaderProps()>column.render("Header")</th>
            ))
          </tr>
        ))
      </thead>
      <tbody>
        rows.map(
          (row, i) =>
            prepareRow(row) || (
              <tr ...row.getRowProps(rowProps(row))>
                row.cells.map(cell => 
                  return (
                    <td ...cell.getCellProps()>cell.render("Cell")</td>
                  );
                )
              </tr>
            )
        )
      </tbody>
    </table>
  );

【讨论】:

【参考方案2】:

目前您正在为列定义应用样式。

为了将样式应用于整个行。 (例如,如果 value == "Error",则将整行设为红色),我会在您的表格 UI 中执行此操作。

在您的 UI 中,您将调用 prepareRow(row),然后使用该行来呈现单元格。

也许是:row.cells.map

此时你可以根据单元格row.cells[0]的内容做一些不同的事情

可能是这样的:

                  (row.cells[0].value !== "Error" && row.cells.map(cell =>
                    
                        return (
                            <TableCell ...cell.getCellProps( className: cell.column.className )>
                                cell.render('Cell')
                            </TableCell>
                        );
                    )) ||  <RedRow />

【讨论】:

以上是关于如何将道具传递到反应表中的行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用反应路由器将道具传递给非子组件?

如何在Vuejs中将反应性道具传递给孩子

如何将 crud 表中的行值传递给自定义提交按钮

在反应组件中将样式作为道具传递

如何将道具从组件传递到 NextJS 中的 getServerSideProps()?

通过JQuery在表中的行中迭代列