提问者:小点点

点击(反应)时复选框未选中


我使用React创建了一个待办事项列表。我得到一些问题,我想创建复选框,但我的复选框它不工作,我不能解决:(我不知道有什么问题。

我设置了每个任务的数据,然后需要更改某个任务的已完成,但是它不能点击更改已完成的任务

这是我的密码

class App extends React.Component {
  constructor() {
    super()
    this.state = {
      todos: todoData,
    }
    this.handleChange = this.handleChange.bind(this)
  }

  handleChange(id) {
    this.setState(prevState => {
      const updatedTodos = prevState.todos.map(todo => {
        if(todo.id === id) {
          todo.completed = !todo.completed
          // console.log(todo.completed)
        }
        return todo
      })
      return {
        todos: updatedTodos
      }
    })
  }
  
  render() {
    const todoItem = this.state.todos.map(item => <TodoItem key={item.id} item={item} 
      handleChange={this.handleChange}/>)
    return (
      <div>
        <h1 className="header">My Todo Lists</h1>
        {todoItem}
      </div>
    )
  }
}

function TodoItem(props) {
    let textItem = props.item.completed === true ? 
        <del>{props.item.text}</del> : props.item.text
    return (
        <div className="list">
            <input 
                type="checkbox"
                checked={props.item.completed}
                onChange={() => props.handleChange(props.item.id)} 
            />
            <p className="item">{textItem}</p>
        </div>
   
    )
}

这是我的数据

const todoData = [
    {
        id: 1,
        text: "Practice coding",
        completed: false
    },
    {
        id: 2,
        text: "Grocery shopping",
        completed: true
    },
    {
        id: 3,
        text: "Wash the dishes",
        completed: true
    },
    {
        id: 4,
        text: "Take out the trash",
        completed: false
    },
    {
        id: 5,
        text: "Teach my brother homework",
        completed: false
    }
]

感谢您的帮助:)


共1个答案

匿名用户

中,您似乎正在改变转换中的现有状态。则必须返回一个新状态。

用以下代码替换:

handleChange(id) {
  this.setState((prevState) => {
    const updatedTodos = prevState.todos.map((todo) => {
      return {
        ...todo,
        completed: todo.id === id ? !todo.completed : todo.completed
      };
    });
    return {
      todos: updatedTodos
    };
  });
}