【发布时间】:2020-12-16 02:57:44
【问题描述】:
我在 ReactJS 中创建了一个简单的待办事项列表。它为存储在文件“TodoData.js”中的待办事项加载组件,数据按如下方式存储在该文件中:
const todosData = [
{
id:1,
text: "Take out the thrash",
completed: true
},
{
id:2,
text: "Grocery shopping",
completed: false
},
App.js 使用 TodoItem.js 组件通过 map 函数呈现每个待办事项。 TodoItem.js 使用条件渲染:
if (props.item.completed == true) {
return (
<div className="todoclassDone">
<input type="checkbox"
onChange={ () => props.handleChange(props.item.id)}/>
<p className="lalatext"><del>{props.item.text}</del></p>
</div>
)
}
else { .... //same code as above but with other className.
在 App.js 中,我使用 TodoItem.js 组件通过 map 函数渲染 TodoData 中的每个项目;如果 data.completed = true 背景为绿色,否则背景为红色。
问题:但是,App.js 中的 handleChange(id) 函数无法正常工作。我循环遍历 todosData 中的所有对象;如果 id 与用户单击的复选框的 id 相似,则应使用 todo.completed = !todo.completed 将其更改为相反的布尔值但是,在运行此代码时没有任何反应。 handleChange函数:
handleChange(id) {
this.setState(prevState => {
const updatedTodos = prevState.todos.map(todo => {
if (todo.id == id) {
todo.completed = !todo.completed;
}
return todo
})
额外信息:上面提到的问题特别奇怪,因为如果我将用户单击的复选框的布尔值更改为 false 或 true,它确实有效。这不会导致所需的行为,因为现在我只能将 todo.completed 一次从 false 更改为 true。 ;在这种情况下,handleChange 函数如下所示:
handleChange(id) {
this.setState(prevState => {
const updatedTodos = prevState.todos.map(todo => {
if (todo.id == id) {
todo.completed = true;
}
return todo
})
非常感谢任何帮助,在此先感谢! :-)
【问题讨论】: