使用 React JS 中的复选框创建一个选定行的数组

Posted

技术标签:

【中文标题】使用 React JS 中的复选框创建一个选定行的数组【英文标题】:Create an array of selected rows using checkboxes in React JS 【发布时间】:2022-01-18 13:07:41 【问题描述】:

我有一个数据表。第一列是一个复选框。我正在尝试为每个被选中的行 ID 创建一个数组。

  const [selectedRows, setSelectedRows] = useState([]);

  const handleCheckbox = (event, row) => 
    if (event.target.checked === true) 
      selectedRows.push(row.id);
     else 
      selectedRows.pop(row.id);
    
  ;

        <TableBody>
            expenseTransactions.map((row) => (
              <TableRow key=row.id>
                <TableCell>
                  <Checkbox onChange=(event) => handleCheckbox(event, row) />
                </TableCell>
              </TableRow>
       </TableBody>

我无法让它正常工作。关于处理 onChange 事件的最佳方法的任何想法,所以我有一个包含所有选定元素的数组,然后如果我取消选择一个,该 id 将从数组中删除。

非常感谢,

【问题讨论】:

【参考方案1】:

您不应使用selectedRows.push() 直接更改state。正确的方法是使用setSelectedRows。正确的代码如下所示。

const handleCheckbox = (event, row) => 
  if (event.target.checked === true) 
    setSelectedRows([
       ...selectedRows,
       row
    ])
   else 
    const nextSelectedRows = selectedRows.filter(selectedRow => selectedRow.id != row.id);
    setSelectedRows(nextSelectedRows)
  

【讨论】:

【参考方案2】:

当我处理这种情况时,我更喜欢将检查的元素存储到一个对象中,使用这种方法可以避免发现受影响的索引。此外,Material UI 的 Checkbox 必须使用其 checked 属性进行设置。

例如:

 const [selectedRows, setSelectedRows] = useState();

处理程序:

 const handleCheckbox = (event, row) => 
      setSelectedRows((state) => 
         ( 
           ...state, 
           selectedRows:  
             ...state.selectedRows, 
             [row.id]: event.target.checked
            
         )
       );
 ;

JSX:

 <TableBody>
        expenseTransactions.map((row) => (
          <TableRow key=row.id>
            <TableCell>
              <Checkbox 
                checked= selectedRows[row.id] || false  
                onChange=(event) => handleCheckbox(event, row) 
              />
            </TableCell>
          </TableRow>
   </TableBody>

【讨论】:

【参考方案3】:

要将选中状态保持在某个状态,请将选中项的名称存储在数组中。

  const [checkedState, setChekcedState] = useState([]);
  
  const handleChange = (e) =>
    const checked, name = e.target
    if(checked)
      setChekcedState(oldState => ([...oldState, name]))
    else
      setChekcedState(oldState => oldState.filter(item => item !== name))
    
  

根据评论,ID 是数字。因此,将数字转换为字符串。 当需要数组时,将这些字符串转换回数字。

<TableBody>
    expenseTransactions.map((item) => (
        <TableRow key=item.id>
            <Checkbox
                onChange=handleChange
                checked=checkedState.includes(item.id)
                name=item.id
            />
        </TableRow>
    ))
</TableBody>

将这些字符串转换回数字

let convertedIntegerArr = checkedState.map(item=>parseInt(item))

这是工作演示

【讨论】:

谢谢。有一件事,我的身份证是导致这不起作用的数字。你会如何解决这个问题?干杯 嗨!因为这个简单直接的解决方案是将该数字转换为字符串。我正在相应地更新我的答案

以上是关于使用 React JS 中的复选框创建一个选定行的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式取消选择 Datatable 中的选定行

计算 React.js 中选中的复选框

React.js - 功能组件中的状态未更新[重复]

React Redux 表更新行

Javascript - 来自具有“父”和“子”行的表中的 Json

根据 r shiny 中的选定类别创建图表饼图