React-Table:仅选择单行,禁用多行选择

3

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

我正在使用 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
@Àtishking 刚刚发布了我的解决方案,如果您需要更多帮助,请告诉我。 - SAKURA
3个回答

5

我曾经困惑了一段时间,但我使用的解决方案似乎很好并且非常简单。在您的onClick()方法中使用以下内容:

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

你需要在使用useTable时,从变量解构中包括toggleAllRowsSelected。
 const { toggleAllRowsSelected, selectedFlatRows,...} = useTable({ columns, data, ....}

1
根据我的经验,您需要这样做。
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.
         },
      })}
   />
)

0
我使用了一个解决方法来使它工作,基本上是在状态中设置所选行的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
@Àtishking 哦,不错!请分享。 - SAKURA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接