React 复选框在第二次单击后得到(取消)选中
React checkbox get (un)checked after the second click
下面是 React 组件中列出动态复选框的部分:
<div className="pb-4">
<p>Choose the task owner(s):</p>
{
peerIds.map(id => {
if (currentUserId != id)
return (
<label className="checkbox-inline mr-3">
<input onChange={onChange_TaskOwner}
type="checkbox"
name="taskowner"
checked={st_taskOwnersId.filter(function (item) {return (item == id)}).length > 0}
value={peers[id].id} />
<span>{peers[id].fullName}</span>
</label>
)
})
}
<div style={{ clear: 'both' }}></div>
</div>
在上面的代码中,如果当前 id 已经在名为 st_taskOwnersId
的挂钩状态对象中,我将 checked
设置为 false/true。
我使用 hook
存储选中项目的 ID,如下所示。 onChange_TaskOwner
函数根据它是 checked
还是 unchecked
更新 st_taskOwnersId
:
const [st_taskOwnersId, set_taskOwnersId] = useState([] as any);
const onChange_TaskOwner = (event) => {
event.preventDefault();
if (event.target.checked)
set_taskOwnersId([...st_taskOwnersId, event.target.value]);
else
set_taskOwnersId(st_taskOwnersId.filter(function (item) {
return (item != event.target.value);
}));
}
代码运行没有错误。唯一的问题是我必须单击两次才能 check/uncheck 复选框。我不知道为什么会这样。有帮助吗?
我认为问题出在 onChange_TaskOwner
函数上。您应该删除 event.preventDefault();
调用。
我试图在这个 codepen 上重现你的组件,但是 event.preventDefault();
工作正常,如果你添加它,同样的错误开始发生。
下面是 React 组件中列出动态复选框的部分:
<div className="pb-4">
<p>Choose the task owner(s):</p>
{
peerIds.map(id => {
if (currentUserId != id)
return (
<label className="checkbox-inline mr-3">
<input onChange={onChange_TaskOwner}
type="checkbox"
name="taskowner"
checked={st_taskOwnersId.filter(function (item) {return (item == id)}).length > 0}
value={peers[id].id} />
<span>{peers[id].fullName}</span>
</label>
)
})
}
<div style={{ clear: 'both' }}></div>
</div>
在上面的代码中,如果当前 id 已经在名为 st_taskOwnersId
的挂钩状态对象中,我将 checked
设置为 false/true。
我使用 hook
存储选中项目的 ID,如下所示。 onChange_TaskOwner
函数根据它是 checked
还是 unchecked
更新 st_taskOwnersId
:
const [st_taskOwnersId, set_taskOwnersId] = useState([] as any);
const onChange_TaskOwner = (event) => {
event.preventDefault();
if (event.target.checked)
set_taskOwnersId([...st_taskOwnersId, event.target.value]);
else
set_taskOwnersId(st_taskOwnersId.filter(function (item) {
return (item != event.target.value);
}));
}
代码运行没有错误。唯一的问题是我必须单击两次才能 check/uncheck 复选框。我不知道为什么会这样。有帮助吗?
我认为问题出在 onChange_TaskOwner
函数上。您应该删除 event.preventDefault();
调用。
我试图在这个 codepen 上重现你的组件,但是 event.preventDefault();
工作正常,如果你添加它,同样的错误开始发生。