我正在创建一个MERN TODO应用程序,允许用户添加、编辑和删除TODO列表项.我已经创建了一个模式表单,当用户单击其待办事项上的更新按钮时将显示该表单.我目前只想让我的函数(UpdateNewToDo)工作,该函数从子元素获取所有信息以更新数据库.它似乎在最后一秒失败了,我不明白为什么.任何建议都将不胜感激. 当我按下模式中的更新按钮时,我收到的错误是:

Pros.updateNewToDo不是函数

TypeError: Pros.updateNewToDo不是函数

Home.js
import React, { useEffect, useState } from 'react'

import ToDoList from '../components/ToDoList';

const Home = () => {
    const [toDos, setToDos] = useState(null);

    useEffect(() => {
        const fetchToDos = async () => {
          const response = await fetch("/api/ToDo");
          const json = await response.json();

          if (response.ok) {
            setToDos(json);
          }
        };
        fetchToDos();
      }, []);

  //This is a function that will get the todo item that needs to be updated in the child components
      function updateNewToDo(id, Name){
        console.log("update the employee")
      }

  return (
    <div className='Home'>
        <div className='toDos'>
            {toDos && toDos.map((toDo) => <ToDoList key={toDo._id} props={toDo} id={toDo._id} updateNewToDo={updateNewToDo} />)}
        </div>
    </div>
  )
}

export default Home

ToDoList.js
import React from "react";
import EditToDo from "./EditToDo";

const ToDoList = ( {props} ) => {
  return (
    <div className="toDoList">
      <h4>To Do: </h4>
      <p>{props.Name}</p>
      <span>delete</span>
      <EditToDo Name={props.Name} updateNewToDo={props.updateNewToDo} id={props._id} />
    </div>
  );
};

export default ToDoList;

EditToDo.js
import { useState } from "react";
import Button from "react-bootstrap/Button";
import Modal from "react-bootstrap/Modal";

function EditToDo(props) {
  const [Name, setName] = useState(props.Name);
  const [show, setShow] = useState(false);

  const handleClose = () => setShow(false);
  const handleShow = () => setShow(true);

  return (
    <>
      <Button variant="primary" onClick={handleShow}>
        Update
      </Button>

      <Modal
        show={show}
        onHide={handleClose}
        backdrop="static"
        keyboard={false}
      >
        <Modal.Header closeButton>
          <Modal.Title>Update To Do</Modal.Title>
        </Modal.Header>
        <Modal.Body>
          <form
            onSubmit={(e) => {
              e.preventDefault();
              console.log('Hello from EditToDo');
              console.log(props.id, Name)
              props.updateNewToDo(props._id, Name);
            }}
            id="editModal"
            className="w-full max-w-sm"
          >
            <div className="md:flex md:items-center mb-6">
              <div className="md:w-1/3">
                <label
                  className="block text-gray-500 font-bold md:text-right mb-1 md:mb-0 pr-4"
                  for="name"
                >
                  To Do
                </label>
              </div>
              <div className="md:w-2/3">
                <input
                  className="bg-gray-200 appearance-none border-2 border-gray-200 rounded w-full py-2 px-4 text-gray-700 leading-tight focus:outline-none focus:bg-white focus:border-purple-500"
                  id="name"
                  type="text"
                  value={Name}
                  onChange={(e) => {
                    setName(e.target.value);
                  }}
                />
              </div>
            </div>
          </form>
        </Modal.Body>
        <Modal.Footer>
          <button
            onClick={handleClose}
            className="bg-slate-400 hover:bg-blue-400 text-white font-bold py-2 px-4 border-b-4 border-blue-700 hover:border-blue-500 rounded"
          >
            Close
          </button>

          <button
            form="editModal"
            className="bg-blue-500 hover:bg-blue-400 text-white font-bold py-2 px-4 border-b-4 border-blue-700 hover:border-blue-500 rounded"
          >
            Update
          </button>


        </Modal.Footer>
      </Modal>
    </>
  );
}

export default EditToDo;

推荐答案

<ToDoList>组件的props 之一被命名为props,这造成了混淆,也是您出错的原因.

更改该组件的代码:

const ToDoList = ({
  props, // Actually the toDo item
  updateNewToDo // The prop with such name
}) => {
  return (
    <div className="toDoList">
      <h4>To Do: </h4>
      <p>{props.Name}</p>
      <span>delete</span>
      <EditToDo Name={props.Name} updateNewToDo={updateNewToDo /* Directly the prop variable */} id={props._id} />
    </div>
  );
};

根据REACT约定,功能组件的第一个参数实际上被命名为props.它是一个对象,其属性是实际的props .

但在这里您使用的是参数析构(也是Reaction中的常见做法),因此没有理由使用该名称.

您可以重命名该props :

const ToDoList = ({
  toDo, // Actually the toDo item
  updateNewToDo // The prop with such name
}) => {
  return (
    <div className="toDoList">
      <h4>To Do: </h4>
      <p>{toDo.Name}</p>
      <span>delete</span>
      <EditToDo Name={toDo.Name} updateNewToDo={updateNewToDo /* Directly the prop variable */} id={toDo._id} />
    </div>
  );
};

// Usage:
<ToDoList
  key={toDo._id}
  toDo={toDo}
  updateNewToDo={updateNewToDo}
/>

或者避免参数解构:

const ToDoList = (props) => { // No parameter destructuring 
  return (
    <div className="toDoList">
      <h4>To Do: </h4>
      <p>{props.props.Name}</p>
      <span>delete</span>
      <EditToDo Name={props.props.Name} updateNewToDo={props.updateNewToDo} id={props.props._id} />
    </div>
  );
};

Node.js相关问答推荐

Mongoose-如何从父文档填充到子文档

Nest Js - 在 multer 拦截器中如何设置最大文件上传大小并进行可选文件上传

在 NodeJS 中使用 post 时出现错误 500TypeError: 无法解构 'req.body' 的属性 'name',因为它未定义

在 MacOS Ventura 上使用 NVM 安装 node ?

suppress AWS SDK v2 弃用消息

使用 create-expo-app 时如何更改 webpack-config.js 中的哈希函数?

在 Atlas 触发器(Node JS)中正确初始化 Firebase 管理 SDK

Discord.js V14 interaction.editReply 给出了一个无效的 webhook 令牌错误

为什么我的react 表单不能正常工作?

MERN 堆栈项目中的 React [create-react-app] 正在提供依赖项

分块 WebSocket 传输

Webpack TypeScript module.hot 不存在

Node.js 支持 =>(箭头函数)

具有多个条件的mongoose 查找

如何将子集合添加到 Firestore 中的文档?

如何在 Node.js 中使用 chmod

已安装全局 NPM 包但未找到命令

Node.js 17.0.1 Gatsby 错误-数字信封 routine ::不支持 ... ERR_OSSL_EVP_UNSUPPORTED

使用 Node.js 我得到错误:EISDIR,读取

expressjs app.VERB 调用中的 next() 和 next('route') 有什么区别?