我在我的反应待办事项

时间:2018-02-13 01:10:25

标签: javascript reactjs

我是Reactjs的新手,我正在开发我的第一个应用程序,当然是一个todo应用程序。然而,一切都进展顺利,直到我被要求创建一个删除按钮来删除我的待办事项。我被困住了,差不多3天一直困惑于此。任何帮助或建议将不胜感激。

反应-待办事项/ SRC / 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: [
        { description: "Walk the cat", isCompleted: true },
        { description: "Throw the dishes away", isCompleted: false },
        { description: "Buy new dishes", isCompleted: false }
      ],
      newTodoDescription: ""
    };
    this.deleteTodo = this.deleteTodo.bind(this);
  }

  deleteTodo(description) {
    this.setState({
      todos: this.state.todos.filter(
        (todos, index) => todos.description !== description
      )
    });
  }

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

  handleSubmit(e) {
    e.preventDefault();
    if (!this.state.newTodoDescription) {
      return;
    }
    const newTodo = {
      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 });
  }

  render() {
    return (
      <div className="App">
        <ul>
          {this.state.todos.map((todo, index) => (
            <ToDo
              key={index}
              description={todo.description}
              isCompleted={todo.isCompleted}
              toggleComplete={() => this.toggleComplete(index)}
            />
          ))}
        </ul>
        <form onSubmit={e => this.handleSubmit(e)}>
          <input
            type="text"
            value={this.state.newTodoDescription}
            onChange={e => this.handleChange(e)}
          />
          <input type="submit" />
        </form>
      </div>
    );
  }
}

export default App;

反应-待办事项/ SRC / ToDo.js

import React, { Component } from "react";

class ToDo extends Component {
  deleteToDo(description) {
    this.props.deleteToDo(description);
  }

  render() {
    return (
      <div className="wrapper">
        <button
          className="deleteToDo"
          onClick={e => this.deleteToDo(this.props.description)}
        >
          Delete
        </button>
        {this.props.deleteToDo}

        <li>
          <input
            type="checkbox"
            checked={this.props.isCompleted}
            onChange={this.props.toggleComplete}
          />
          <span>{this.props.description}</span>
        </li>
      </div>
    );
  }
}

export default ToDo;

反应-待办事项/ SRC / index.js

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import registerServiceWorker from "./registerServiceWorker";

ReactDOM.render(<App />, document.getElementById("root"));
registerServiceWorker();

2 个答案:

答案 0 :(得分:1)

您永远不会将“deleteTodo”功能作为道具传递给“toDo”组件。更改你创建的部分,你在该地图中的todo组件就像这样......

map.... => <toDo deleteToDo={this.deleteTodo}......... />

如果要调用子项中父项上下文中存在的函数,请记住组件的范围是自己的,必须将该函数的引用作为prop传递给该子项。

答案 1 :(得分:1)

您的代码应该是

class ToDo extends React.Component {
        deleteToDo(description) {
          this.props.deleteToDo(description);
        }
          render() {
            return (
              <div className="wrapper">

              <button className="deleteToDo" onClick = {(e) => 
                  this.deleteToDo(this.props.description)}>Delete</button> 
                  {() => this.props.deleteToDo(this.props.description)}

              <li>
                <input type="checkbox" checked={ this.props.isCompleted } 
        onChange={ this.props.toggleComplete } />
                <span>{ this.props.description }</span>
              </li>
              </div>
            );
          }
        }

    class App extends React.Component {
          constructor(props) {
            super(props);
            this.state = {
              todos: [
          { description: 'Walk the cat', isCompleted: true },
          { description: 'Throw the dishes away', isCompleted: false },
          { description: 'Buy new dishes', isCompleted: false }
              ],
              newTodoDescription: ''
            };
              this.deleteTodo = this.deleteTodo.bind(this);
          }
          deleteTodo(description) {
          const filteredTodos = this.state.todos.filter((todo, index) =>  todo.description !== description);
            this.setState({
              todos: filteredTodos
            });
          }

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

          handleSubmit(e) {
            e.preventDefault();
            if (!this.state.newTodoDescription) { return }
            const newTodo = { 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 });
          }

          render() {
            return (
              <div className="App">
                <ul>
                  { this.state.todos.map( (todo, index) =>
                    <ToDo key={ index } description={ todo.description } 
                        isCompleted={ todo.isCompleted } toggleComplete={ () => 
                        this.toggleComplete(index) } deleteToDo={this.deleteTodo} />
                  )}
                </ul>
                <form onSubmit={ (e) => this.handleSubmit(e) }>
                  <input type="text" value={ 
                    this.state.newTodoDescription } onChange={ (e) => 
                    this.handleChange(e) } />
                  <input type="submit" />
                </form>
              </div>
            );
          }
        }

您忘记从propsApp组件description参数传递ToDo

在此尝试https://jsfiddle.net/prakashk/69z2wepo/101369/#&togetherjs=B3l5GDzo8A