首页 文章

我在我的react todo应用程序中创建一个正常运行的“删除按钮”时遇到问题

提问于
浏览
0

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

反应到-DO / 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;

反应到-DO / 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;

反应到-DO / 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 回答

  • 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>
                );
              }
            }
    

    在这里,您忘记从 ToDo 组件中的 Appdescription 参数传递 props .

    试试这里https://jsfiddle.net/prakashk/69z2wepo/101369/#&togetherjs=B3l5GDzo8A

  • 1

    您永远不会将“deleteTodo”函数作为道具传递给“toDo”组件 . 改变你创建的部分,你在那个 Map 中的todo组件就像这样......

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

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

相关问题