为什么 <Table/> 多次渲染时不显示复选框?

IT技术 javascript html reactjs material-ui
2022-07-16 01:03:53

<Table/>http://www.material-ui.com/#/components/table使用。<TableRowColumn/>当我根据数组中有多少对象进行多次渲染时,不会出现复选框。例如,如果有两个对象,它会呈现两行,但不会显示复选框。可能是什么问题?

全新编辑

因此,FileTable.js在另一个页面上呈现,并由索引路由内的按钮触发Home.js

render(
  <div>
    <Provider store={store}>
      <Router history={hashHistory}>
        <Route
          component={RequireAuth(App)}
          path='App'
        >
          <IndexRoute
            component={Home}
          />
          <Route
            component={FileTable}
            path='/FileTable'
          />
        </Route>
      </Router>
    </Provider>
  </div>,
  document.getElementById('app')
)

并且App.js是:

class App extends Component {

  render() {

    return (
        <div>
          {React.cloneElement(this.props.children, this.props)}
        </div>
    );
  }
}

我完全按照您的实现方式并获得了正确的属性queryVehicles,但是当我现在按下按钮时,Home.js出现以下错误:

在此处输入图像描述

2个回答

根据您收到的浏览器警告,听起来您有一个独特的 React 组件封装了TableRow(" FileTableRow")。

当您遍历 中的某些数据时TableBody,您将看到使用TableRow内联(如在您的代码片段中)和单独的组件(如<FileTableRow />)之间关于复选框行为的不同行为。

TableBody使用and的当前实现TableRow,如果您想拥有一个单独的FileTableRow组件,则需要按如下方式拥有它才能显示复选框。

const FileTableRow = (props) => {
  const { children, Date, Start_Time, End_Time, Type, ...rest } = props

  // The checkbox element will be inserted by the <TableBody> as a child
  // of this component. So if we have a separate row component like this,
  // we need to manually render it from the props.children

  // We also use {...rest} to pass any other props that the parent <TableBody />
  // passed to this component. This includes any handlers for the checkbox.
  return (
    <TableRow {...rest}>
      {children[0]}
      <TableRowColumn>{Date}</TableRowColumn>
      <TableRowColumn>{Start_Time}</TableRowColumn>
      <TableRowColumn>{End_Time}</TableRowColumn>
      <TableRowColumn>{Type}</TableRowColumn>
    </TableRow>
  )
}

此外,警告听起来像是您将<TableRow />组件包装在 a<div />中,应该避免这种情况。

编辑:

添加了{...rest}将任何其他props传递给<TableRow>

在以下位置添加了一个工作示例:http ://www.webpackbin.com/4kNnhM2o-

编辑2:

添加了一个修改后的示例,该示例似乎更接近询问者的数据结构。http://www.webpackbin.com/VkuA-FbhZ

编辑3:

使组件有状态以捕获和记录选定的行。由于其Table实现的一些怪癖,需要将其Table转换为受控组件。http://www.webpackbin.com/EyhKEDNhb

让我们一一解决这些警告:

对于第一个警告,您只需升级到 v 0.15.4。

如前所述,对于第二个和第三个警告,您将放置一个<div>内部<tr></tr>标签,反之亦然。您可能已经创建了一个名为 FileTableRow 的组件,并将其放入<tr></tr>标签中。这个 FileTableRow 可能有一些像这样的 render() 函数:

render() {
    return (
        <div>
            ... some code here ...
        </div>
    )
}