3 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的代碼存在一些問(wèn)題。onDelete最大的問(wèn)題是您的、onChangeCheckbox和處理程序中的狀態(tài)突變addTodo。這些處理程序也不正確地不存儲(chǔ)todos數(shù)組。
使用功能狀態(tài)更新并將現(xiàn)有狀態(tài) todos 數(shù)組映射到新數(shù)組,并復(fù)制todo與 id 匹配的項(xiàng)目,這樣您就不會(huì)改變狀態(tài)對(duì)象。
Math.random 生成浮點(diǎn)數(shù),因此很難與===. 我改為為每個(gè)添加一個(gè) guid。
class App extends React.Component {
state = {
todos: [
{ id: uuidV4(), content: "Buy milk1", status: "pending" },
{ id: uuidV4(), content: "buy carrots1", status: "pending" },
{ id: uuidV4(), content: "Buy milk2", status: "done" },
{ id: uuidV4(), content: "buy carrots2", status: "deleted" }
]
};
onDelete = (id) => {
this.setState((prevState) => ({
todos: prevState.todos.map((todo) =>
todo.id === id
? {
...todo,
status: "deleted"
}
: todo
)
}));
};
onChangeCheckbox = (id, checked) => {
this.setState((prevState) => ({
todos: prevState.todos.map((todo) =>
todo.id === id
? {
...todo,
status: checked ? "done" : "pending"
}
: todo
)
}));
};
addTodo = (todo) => {
this.setState((prevState) => ({
todos: [
...prevState.todos,
{
...todo,
id: uuidV4(),
status: "pending"
}
]
}));
};
render() {
return (
<div>
<h1>Todo's App</h1>
<AddTodo addTodo={this.addTodo} />
<Todo
todos={this.state.todos}
deleteTodo={this.onDelete}
onChangeCheckbox={this.onChangeCheckbox}
/>
</div>
);
}
}
也不需要存儲(chǔ)任何checked狀態(tài),Todo.js因?yàn)闄z查狀態(tài)很容易從您的todo.status財(cái)產(chǎn)中派生出來(lái)。如果狀態(tài)為“完成”,則選中該框。
todos您可以(應(yīng)該)首先通過(guò)過(guò)濾器運(yùn)行您的數(shù)組以刪除已刪除的狀態(tài)待辦事項(xiàng)。
const Todo = ({ todos, deleteTodo, onChangeCheckbox }) => {
const todoList = todos.length ? (
todos
.filter(({ status }) => status !== "deleted")
.map((todo) => {
return (
<div key={todo.id}>
<div>
<input
type="checkbox"
checked={todo.status === "done"}
onChange={(event) =>
onChangeCheckbox(todo.id, event.target.checked)
}
/>
<p
style={
todo.status === "pending"
? { color: "red" }
: { color: "green", textDecoration: "line-through" }
}
>
{todo.content}
</p>
<button onClick={() => deleteTodo(todo.id)}>Delete</button>
</div>
<hr />
</div>
);
})
) : (
<p>You have no todos</p>
);
return <div>{todoList}</div>;
};

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
checked
對(duì)于每個(gè)項(xiàng)目,您只有一個(gè)狀態(tài)todo
。我建議您為列表checked
中的每個(gè)項(xiàng)目添加狀態(tài)todos
。然后你可以找到項(xiàng)目并相應(yīng)地改變狀態(tài)

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
發(fā)生這種情況是因?yàn)槟屵x中狀態(tài)監(jiān)聽(tīng)current component state而不是項(xiàng)目狀態(tài)。而且它們不同步。所以你有兩個(gè)解決方案。首先將狀態(tài)值作為道具傳遞給已檢查狀態(tài),以便在狀態(tài)值更新時(shí)讓狀態(tài)發(fā)生變化,我認(rèn)為它更昂貴。我有其他完全沒(méi)有狀態(tài)的建議。
// const [checked, setChecked] = useState(false); remove that, you no longer need it
const handleInputChange =(event,id,status)=>{
let isChecked = status=='pending' ? true: false;
onChangeCheckbox(id, isChecked);
}
同時(shí)更新輸入檢查狀態(tài)
<input
type="checkbox"
checked={todo.status === 'pending' ? false : true}
onChange= {(event)=>handleInputChange(event,todo.id,todo.status)}
/>
https://codesandbox.io/s/competent-hugle-jn22o?file=/src/Todo.js
添加回答
舉報(bào)