首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除todo - MERN堆栈

删除todo - MERN堆栈
EN

Stack Overflow用户
提问于 2021-09-10 03:49:27
回答 1查看 344关注 0票数 0

单击delete按钮时,我一直试图删除待办事项,但浏览器却抛出一个运行时错误:"TypeError: props.deleteTodo不是函数“

我也双重检查了方法名,它们匹配,我不知道为什么onclick函数没有被识别。任何帮助都将不胜感激。

这是我的密码:

代码语言:javascript
复制
import React, { Component } from "react";
import { Link } from "react-router-dom";
import axios from "axios";

const Todo = props => (
  <tr>
    <td className={props.todo.todo_status === "Completed" ? 'completed' : props.todo.todo_status === "In Progress" ? 'inprogress' : ''}>{props.todo.todo_desc}</td>
    <td className={props.todo.todo_status === "Completed" ? 'completed' : props.todo.todo_status === "In Progress" ? 'inprogress' : ''}>{props.todo.todo_responsible}</td>
    <td className={props.todo.todo_status === "Completed" ? 'completed' : props.todo.todo_status === "In Progress" ? 'inprogress' : ''}>{props.todo.todo_priority}</td>
    <td className={props.todo.todo_status === "Completed" ? 'completed' : props.todo.todo_status === "In Progress" ? 'inprogress' : ''}>{props.todo.todo_status}</td>
    <td className={props.todo.todo_status === "Completed" ? 'completed' : props.todo.todo_status === "In Progress" ? 'inprogress' : ''}>
      <Link to={'/edit/' + props.todo._id}>Edit</Link>&emsp;
      <button type="button" className="btn-danger" onClick={() => { props.deleteTodo(props.todo._id); }}>Delete</button>
    </td>
  </tr>
)

export default class TodoList extends Component {

  constructor(props) {
    super(props);
    this.deleteTodo = this.deleteTodo.bind(this);
    this.state = { todos: [] };
  }

  componentDidMount() {
    axios.get('http://localhost:8082/todos/')
      .then(res => {
        this.setState({ todos: res.data })
      })
      .catch(function (error) {
        console.log(error);
      });
  };

  deleteTodo = (id) => {
    axios.delete("http://localhost:8082/todos/delete/" + id)
      .then(res => {
        console.log(res.data)
        this.props.history.push("/");
      })
      .catch(err => {
        console.log("Error Deleting Todo");
      })
  };

  componentDidUpdate() {
    axios.get('http://localhost:8082/todos/')
      .then(res => {
        this.setState({ todos: res.data })
      })
      .catch(function (error) {
        console.log(error);
      });
  }

  todoList() {
    return this.state.todos.map(function (currentTodo, i) {
      return (
        <Todo
          todo={currentTodo}
          key={i} />
      );
    });
  };

  render() {
    return (
      <div>
        <h3>Todos List</h3>
        <table className="table table-hover" style={{ marginTop: 20 }}>
          <thead>
            <tr>
              <th>Description</th>
              <th>Responsible</th>
              <th>Priority</th>
              <th>Status</th>
              <th>Actions</th>
            </tr>
          </thead>
          <tbody>
            {this.todoList()}
          </tbody>
        </table>
      </div>
    )
  }
}

误差图像

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-10 03:53:02

您定义并绑定了deleteTodo,但在调用<Todo时并没有将它作为来自父级的支持传递。这是:

代码语言:javascript
复制
todoList(){
    return this.state.todos.map(function (currentTodo,i){
        return (
            <Todo 
                todo={ currentTodo } 
                key={ i } />
        );
    });
};

应该是

代码语言:javascript
复制
todoList(){
    return this.state.todos.map((currentTodo, i) => (
        <Todo
            todo={currentTodo}
            key={i}
            deleteTodo={this.deleteTodo} />
    ));
};

您也可以删除行。

代码语言:javascript
复制
this.deleteTodo = this.deleteTodo.bind(this);

完全如此,因为您使用的是带有箭头函数的类字段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69127043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档