1 回答

TA貢獻1828條經驗 獲得超13個贊
當您的組件被包裹在<React.StrictMode>
.?如果您使用 Create React App 創建您的應用程序,這是默認完成的,請在您的index.js
文件中檢查它。
StrictMode 是一種開發功能,可強制您編寫更好的代碼。它只影響您的開發構建,因此如果在生產模式下構建和運行,您的代碼應該可以正常工作。
StrictMode 做的一件事是運行你的setState
方法兩次,以確保你不依賴它只運行一次。因此,它第一次運行時,您會按預期反轉 todo.completed ,而在第二次運行時,它會將其恢復為原始值。
這告訴你的是你的handleChange
函數實際上是用一個不純的方法更新狀態,因為你實際上改變了todo
你的prevState.todos.map
.
您需要做的是返回一個新todo
對象,該對象將是另一個對象的副本,僅completed
修改了屬性,如下所示:
handleChange(id) {
? this.setState(prevState => {
? ? const updatedTodos = prevState.todos.map(todo => {
? ? ? return {
? ? ? ? id: todo.id,
? ? ? ? task: todo.task,
? ? ? ? completed: todo.id === id ? !todo.completed : todo.completed
? ? ? };
? ? });
? ? return {
? ? ?todos: updatedTodos
? ? };
? });
}
或者使用ES6 spread operator,如下所示:
handleChange(id) {
? this.setState(prevState => (
? ? {
? ? ? todos: prevState.todos.map(todo => (
? ? ? ? {...todo, completed: todo.id === id ? !todo.completed : todo.completed}
? ? ? ))
? ? }
? ));
}
我相信這是比 Chris G 建議刪除 <React.StrictMode> 更好的解決方案,因為 StrictMode 實際上可以幫助您編寫更好的代碼。
添加回答
舉報