当前位置: 首页 > 知识库问答 >
问题:

如何在反应中向待办事项应用程序添加处理更改?

章心水
2023-03-14

我是一个新的反应和做一个todo应用程序。

我添加了一个事件侦听器(handleChange)来翻转todosData。从true到false完成,反之亦然,从而允许用户选中和取消选中复选框。

我怎样才能纠正这个问题。这是我的密码:

 class App extends React.Component {
  constructor() {
    super();
    this.state = {
      todos: todosData
    }
    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;
        }
        return todo;
      });

      return {
       todos : updatedTodos
      };
    });
  }

  render() {
    const todoItems = this.state.todos.map(item => (
      <TodoItem
        key={item.id}
        item={item}
        handleChange={this.handleChange}/>
    ));

    return(
      <div>{todoItems}</div>
    );
  }
}

export default App;

function TodoItem(props) {
  return (
    <div>
      <input 
        type = 'checkbox' checked = {props.item.completed}
        onChange = {() => props.handleChange(props.item.id)} />
      <p> {props.item.task} </p>
    </div>
  );
}

export default TodoItem;

有人能告诉我我错过了什么吗?

共有1个答案

乐正明辉
2023-03-14

正如@ChrisG在注释中指出的,当您的组件被包装在中时,就会发生这种情况。

StrictMode是一种开发特性,它迫使您编写更好的代码。它只影响您的开发构建,所以如果在生产模式下构建和运行,您的代码可能会工作。

StrictMode所做的事情之一是运行两次setState方法,以确保您不依赖于它只运行一次。因此,它第一次运行时,您会按预期反转todo.completed,第二次它会将其还原为原始值。

这告诉您的是,您的handleChange函数实际上正在使用一种非纯方法更新状态,因为您实际上更改了prevState中的todo对象。待办事项。地图

相反,您需要做的是返回一个新的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扩展运算符,如下所示:

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

我相信这是一个比克里斯·G建议删除更好的解决方案

 类似资料:
  • 我有一个java应用程序,需要部署在weblogic服务器中。我目前正在为该应用程序制作ear文件。我的ear文件中有一个ejb jar。我想将log4j2 jar添加到此应用程序中。所以我的文件夹结构是 目前,我已经将JAR放在APP-INF文件夹/lib和META-INF/application中。xml我把JAR放在了模块中。这是我的申请表。xml 但它不接受log4j罐子。有什么解决方案吗

  • 我安装了Tomcat6,并希望添加web应用程序来启动URL。我学习了如何在Tomcat7.0中设置web应用程序的上下文路径 我在/conf/catalina/localhost/path中创建了root.xml。在root.xml文件中有以下内容

  • 我正在运行创建-反应-应用程序u调查共享和它给我这个 [2/4]获取包... infofsevents@1.1.2:平台"win32"与此模块不兼容。info"fsevents@1.1.2"是可选的依赖项,兼容性检查失败。从安装中排除它。infofsevents@1.1.3:平台"win32"与此模块不兼容。info"fsevents@1.1.3"是可选的依赖项,兼容性检查失败。从安装中排除它。

  • 保存在手机日历应用程式中的活动会以通知形式出现在您的 M600 上。您也可调动您的时间表。 查看时间表 按下侧边电源按钮打开应用程式菜单,找到并轻击Agenda(待办事项)。 当日时间表会被打开。

  • 我试图在Firebase中创建一个动态链接,当我选择android应用程序时,它显示一个错误,说“将SHA-1添加到这个android应用程序”,我已经添加了一个凭据,但我不确定我到底如何“将SHA-1添加到应用程序” 这是怎么做到的?