![](/img/trans.png)
[英]React: trigger onChange on checkbox input when changing checked state programmatically?
[英]Checkbox doesn't respond to onChange when checked is driven by state
我有一个 material-ui Table
,并且一直在上面实现多选功能。
我的多 select 应该表现如下:
TableHead
/ 取消选择Table
中的所有行。 每行都有自己独特的id
。
我通过一个useState
挂钩维护一个名为idsOfSelectedRows
的Set
,以跟踪当前选择的所有行。
每个TableRow
都有一个Checkbox
,看起来像这样
<Checkbox
className={
idsOfSelectedRows.size === 0 &&
styles.rowSelectionCheckboxStyle
}
onChange={() => handleRowSelectionCheckboxClick}
checked={idsOfSelectedRows.has(row.id)}
/>
和handleRowSelectionCheckboxClick
看起来像这样
const handleRowSelectionCheckboxClick = event => {
const idOfClickedRow = event.target.attributes.getNamedItem("id").value;
//If the checkbox has just become checked then add it to the idOfSelectedRows Set, otherwise remove it.
setIdsOfSelectedRows(
event.target.checked
? new Set(idsOfSelectedRows.add(String(idOfClickedRow)))
: () => {
idsOfSelectedRows.delete(String(idOfClickedRow));
return new Set(idsOfSelectedRows);
}
);
};
我的问题是单击行上的复选框没有响应。 我可以通过单击表头中的select 所有Checkbox
来TableHead
所有这些复选框,但单击各个行中的复选框不会更改其 state?
这是重现确切问题的完整 CodeSandbox。 我需要做什么才能使行中的复选框可切换?
从onChange
分配中删除() =>
以便快速修复。
为什么
您正在声明一个匿名内联 function,但 function 没有调用任何东西(缺少()
是调用函数的语法)。 onChange
接受 function 参考。 当你给它一个内联 function 时,它会调用 function。 另一种选择是仅将句柄RowSelectionCheckboxClick 的handleRowSelectionCheckboxClick
引用传递给它,然后在更改时将调用 function 而不是匿名的 ZC1C425268E68385D14AB5074C17Z9 中间人。
所以你的两个选择是:
onChange={handleRowSelectionCheckboxClick} // Just the reference
或者
onChange={(e) => handleRowSelectionCheckboxClick(e)} // New inline function that calls your function
在大多数情况下,第二种方式是不必要的。 除非您需要传递自定义参数,否则首选第一个。 以下是它可能有用的示例:
onChange={(e) => handleRowSelectionCheckboxClick(e, id)}
在您的沙箱中,您对元素进行 map 并且每个元素都获得一个更改处理程序。 要在处理程序中单独处理它们,您可以像上面一样将一个额外的变量传递给 function。
例如,我通过将处理程序和分配更改为:
const handleRowSelectionCheckboxClick = (event, idOfClickedRow) => {
...
onChange={(e) => handleRowSelectionCheckboxClick(e, row.id)}
这一行: event.target.attributes.getNamedItem("id").value;
不会为您提供所需的 id,因为没有通过,请像这样更改chekbox
:
<Checkbox
id={row.id}
onChange={handleRowSelectionCheckboxClick}
checked={idsOfSelectedRows.has(row.id)}
/>
然后,像这样检索 ID:
const idOfClickedRow = event.target.attributes.id.value;
handleRowSelectionCheckboxClick
function 调用,如示例中所示。
如果您喜欢匿名 function 的解决方案,您应该添加()
: onChange={() => handleRowSelectionCheckboxClick()}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.