【发布时间】:2021-02-15 03:14:35
【问题描述】:
我正在使用 React 创建一个 todolist 应用程序。待办事项的数据如下所示:
const todoData = [
{
id: 1,
text: "Empty bin",
completed: true
},
{
id: 2,
text: "Call mom",
completed: false
}
]
现在,我有一个 App 组件,我可以在其中导入该数据并将其保存在状态中。
import todoData from "./todoData"
class App extends React.Component {
constructor() {
super()
this.state = {
todos: todoData,
}
this.handleChange = this.handleChange.bind(this)
}
...
我还有一个 handleChange 方法,它应该将已完成属性的值更改为其反向值。例如:对于 id 为 1 的待办事项,其文本值为“Empty Bin”并且已完成为 true,因此默认情况下会选中复选框。然而,当它被点击时,完成应该是假的并且复选框不应该再被点击。 由于某种原因,这不会发生,因此 completed 保持其默认布尔值并且不会翻转。所以当一个复选框被点击时,不会发生任何变化。
handleChange(id) {
this.setState(prevState => {
const updatedTodos = prevState.todos.map(todo => {
if (todo.id === id) {
todo.completed = !todo.completed
}
return todo
})
return {
todos: updatedTodos
}
})
}
使用 console.log 后,我意识到 todo.completed 确实被更改为相反的值,但由于某种原因,即使在 devtools map() 中表示该值在返回时更新存储在 updatedTodos 中的新数组。因此,状态不会改变,复选框不能被点击
TodoItem 功能组件与 App 组件位于一个单独的文件中,并包含 todo 元素的 HTML。如下图所示:
function TodoItem(props) {
return (
<div className="todo-item">
<input type="checkbox"
checked={props.task.completed}
onChange={() => props.handleChange(props.task.id)}/>
<p>{props.task.text}</p>
</div>
)
}
另外,TodoItem 是在 App 组件中呈现的
render() {
const todoArray = this.state.todos.map(task => <TodoItem key={task.id}
task={task} handleChange={this.handleChange}/>)
return (
<div className="todo-list">
{todoArray}
</div>
)
}
【问题讨论】:
标签: javascript reactjs