【问题标题】:React-Table: Select Single Row Only, Disable Multiple Row SelectionReact-Table:仅选择单行,禁用多行选择
【发布时间】:2020-08-14 16:50:03
【问题描述】:

我正在使用单选按钮来选择行。如何禁用多行选择以便一次只能选择一行?

我正在使用selectedFlatRows,但它允许选择多行。

const Table = props => {
  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    page,
    prepareRow,
    selectedFlatRows,
  } = useTable(
    {
      columns,
      data: props.linkedProducts,
    },
    useSortBy,
    usePagination,
    useRowSelect,
    hooks => {
      hooks.visibleColumns.push(columns => [
        {
          id: 'selection',
          disableGlobalFilter: true,
          accessor: 'selection',
          Cell: ({row}) => (
            <RadioButton
              {...row.getToggleRowSelectedProps()}
            />
          ),
        },
        ...columns,
      ]);
    }
  );

【问题讨论】:

  • 您好,您找到解决方案了吗?我目前面临同样的问题
  • @Àtishking 刚刚发布了我的解决方案,如果您需要更多帮助,请告诉我

标签: reactjs react-table react-table-v6 react-table-v7


【解决方案1】:

我对这个有一段时间感到困惑,我使用的解决方案似乎工作正常并且非常简单。在 onClick() 方法中使用以下内容:

  onClick={() => {
    toggleAllRowsSelected(false);
    row.toggleRowSelected();
  }

从 useTable 解构变量时,您需要包含 toggleAllRowsSelected

 const { toggleAllRowsSelected, selectedFlatRows,...} = useTable({ columns, data, ....}

【讨论】:

    【解决方案2】:

    我使用了一种变通方法来完成这项工作,基本上是在状态中设置选定的 rowId。

    const [selectedRowId, setSelectedRowId] = useState('0');
    
    const {
        getTableProps,
        getTableBodyProps,
        headerGroups,
        rows,
        prepareRow,
      } = useTable(
        {
          columns,
          data,
        },
        usePagination
      );
    

    这是表格代码的缩短版本。如您所见,只要用户单击该行或选中单选按钮,它就会设置状态。

    <TableV2.Body {...getTableBodyProps()}>
                {rows.map((row) => {
                  prepareRow(row);
                  return (
                    <TableV2.Row
                      key={row.id}
                      onClick={() => setSelectedRowId(row.id)}
                      {...row.getRowProps()}
                      bg={row.id !== selectedRowId ? 'white' : 'gray.10'}
                    >
                      <TableV2.Cell key={`${row.id}-radio`}>
                        <Box testIds={{test: 'sku-detail-radio-button'}} mt={-12}>
                          <RadioButton
                            value={row.id}
                            checked={row.id === selectedRowId}
                            onChange={() => setSelectedRowId(row.id)}
                          />
                        </Box>
                      </TableV2.Cell>
    

    如果要将selectedRowId传递给父组件,可以使用useEffect

     useEffect(() => {
            props.onRowSelection(selectedRowId);
          }, [props, selectedRowId]);
    

    【讨论】:

    • 您好,伙计,感谢您的回复,但我只是想让您知道,我也设法解决了问题,而且我认为我的方法比那个简单得多。如果你想让我分享它,请告诉我
    • @Àtishking 哦,太好了!请分享
    【解决方案3】:

    根据我的经验,你必须这样做。

    Cell: ({row}) => (
       <RadioButton
          {...row.getToggleRowSelectedProps({
             onChange: () => {
               const selected = row.isSelected; // get selected status of current row.
               toggleAllRowsSelected(false); // deselect all.
               row.toggleRowSelected(!selected); // reverse selected status of current row.
             },
          })}
       />
    )
    

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2019-08-11
      • 2019-03-16
      • 1970-01-01
      • 2011-04-27
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多