第二次单击后,React 复选框被(取消)选中

ren*_*kre 5 html javascript checkbox checkboxlist reactjs

下面是 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>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中checked,如果当前 id 已经在名为st_taskOwnersId.

我使用hook如下存储已检查项目的 Id 。onChange_TaskOwner函数更新st_taskOwnersId取决于它是checkedunchecked

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);
        }));
}
Run Code Online (Sandbox Code Playgroud)

代码运行没有错误。唯一的问题是我必须单击两次才能选中/取消选中复选框。我不知道为什么会这样。有什么帮助吗?

aqu*_*esb 10

我相信问题出在onChange_TaskOwner功能上。您应该删除event.preventDefault();呼叫。

我尝试在此codepen上重现您的组件,但event.preventDefault();效果不佳,如果添加它,则会开始发生相同类型的错误。