【发布时间】:2021-06-15 09:54:17
【问题描述】:
我是 react 新手,我正在尝试使用 react 钩子创建一个待办事项应用程序。我有一个数组 todoList,我在无序列表中显示它,每个 todo 元素都有一个复选框。现在,问题是复选框状态在单击时没有改变。我错过了什么?在 OnChange 中,我尝试直接更改 item.isDone 属性,并且我也尝试使用 setTodoList,但在这两种情况下,UI 中都没有发生任何事情。 useForm 只是另一个使用 useState 的模块。
const App = () => {
const [todoVal, handleChange] = useForm({
todoValue: "",
});
const [todoList, setTodoList] = useState([]);
return (
<div>
<div className="container">
<h1>Todo Item {todoVal.todoValue}</h1>
<div className="row">
<input
type="text"
placeholder="Write a todo"
className="form-control"
required
name="todoValue"
value={todoVal.todoValue}
onChange={handleChange}
/>
<button
className="btn btn-primary btn-lg"
onClick={() => {
setTodoList([
...todoList,
{
id: Math.floor(Math.random() * 20),
isDone: false,
value: todoVal.todoValue,
},
]);
}}
disabled={!todoVal.todoValue.length}
>
Add Todo
</button>
</div>
<div className="row">
<ul className="list-group">
{todoList.map((item, idx) => {
return (
<li key={item.id} className="list-group-item">
<div className="row">
<div className="col-xs-8 px-2">
<input
id={"isDone-" + item.id}
type="checkbox"
name={"isDone-" + item.id}
checked={item.isDone}
onChange={(e) => {
item.isDone = !item.isDone;
}}
/>
<label for={"isDone-" + item.id}>{item.value} - {String(item.isDone)}</label>
</div>
<button
className="btn btn-danger"
onClick={() => {
const list = todoList.filter(
(todoItem) => todoItem.id !== item.id
);
setTodoList(list);
}}
>
Delete
</button>
</div>
</li>
);
})}
</ul>
</div>
</div>
</div>
);
};
export default App;
【问题讨论】:
-
您必须更新单选按钮的 todoList onChange。您可以使用 id 跟踪记录。
标签: reactjs react-hooks