【问题标题】:React Todo Delete Button Removes all listed items at onceReact Todo 删除按钮一次删除所有列出的项目
【发布时间】:2018-02-04 02:56:51
【问题描述】:

我有 2 个文件

App.js

    import React, { Component } from 'react';
    import './App.css';
    import ToDo from './components/ToDo.js';

    class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          todos: [],
          newTodoDescription: ''
        };
        this.deleteTodo = this.deleteTodo.bind(this);
      }

    handleChange(e) {
      this.setState({ newTodoDescription: e.target.value })
    }

    handleSubmit(e) {
      e.preventDefault();
      if (!this.state.newTodoDescription) { return }
      const newTodo = { id: this.state.todos.id, description: this.state.newTodoDescription, isCompleted: false };
      this.setState({ todos: [...this.state.todos, newTodo], newTodoDescription: '' });
    }


    toggleComplete(index) {
      const todos = this.state.todos.slice();
      const todo = todos[index];
      todo.isCompleted = todo.isCompleted ? false : true;
      this.setState({ todos: todos });
    }




    deleteTodo(id) {
      const remainingToDos = this.state.todos.filter((todo, remainingToDos) => {
          if(todo.id !== remainingToDos.id) return todo; });
      this.setState({ todos: remainingToDos });
    }


      render() {
        return (
          <div className="App">
            <h1>Add a ToDo!</h1>
            <form onSubmit={ (e) => this.handleSubmit(e)}>
              <input type="text"
                value={ this.state.newTodoDescription }
                onChange={ (e) => this.handleChange(e) }
                />
              <input type="submit" value="Add Todo" />
            </form>
            <ul>
              { this.state.todos.map( (todo) =>
                <ToDo key={ todo.id }
                  description={ todo.description }
                  isCompleted={ todo.isCompleted }
                  toggleComplete={ () => this.toggleComplete(todo) }
                  onDelete={ this.deleteTodo }
                   />
              )}

            </ul>
          </div>
        );
      }
    }

    export default App;

ToDo.js

      import React, { Component } from 'react';

      class ToDo extends Component {
        render() {
          return (
            <li>
              <input type="checkbox" checked={ this.props.isCompleted } onChange={ this.props.toggleComplete } />
              <span>{ this.props.description }  {''}</span>
              <button onClick={() => this.props.onDelete(this.props.id)}>Remove Todo</button>
            </li>
          );
        }
      }

      export default ToDo;

我要完成的工作:将许多待办事项添加到列表中。单击删除待办事项按钮。只有选中的待办事项会被删除。

我对反应非常陌生,无法弄清楚这一点。在我的 deleteToDo 方法中,我试图过滤掉待办事项,只保留当前的待办事项。我不清楚我是否正确使用了 .filter。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    问题是filter() 方法应该返回一个条件,而不是值:

    deleteTodo(id) {
          const remainingToDos = this.state.todos.filter((todo, remainingToDos) => {
              return (todo.id !== remainingToDos.id)
           });
          this.setState({ todos: remainingToDos });
    }
    

    【讨论】:

      【解决方案2】:

      我相当肯定您只是让代码过于复杂。您根本没有使用已传递给您的方法的参数id。您的 deleteTodo 方法可能只是:

      deleteTodo = (id) => {
          var remainingToDos = this.state.todos.filter((todo) => {
              return todo.id === id
          });
      
          this.setState({ todos: remainingToDos })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        • 2018-03-20
        • 2016-07-15
        • 2018-12-02
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多