首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中从json服务器更新数据。

中从json服务器更新数据。
EN

Stack Overflow用户
提问于 2022-08-24 12:18:35
回答 1查看 378关注 0票数 0

我试图在react中更新JSON服务器上的数据,但它没有更新它。

以下是整个代码:

代码语言:javascript
复制
import { useState, useEffect } from "react";

const EditTask = ({ task, onEdit }) => {
  const [tasks, setTasks] = useState([]);

    useEffect(() => {
        const getTasks = async () => {
          const tasksfromServer = await fetchTasks();
          setTasks(tasksfromServer);
        };
    
        getTasks();
      }, []);

        // Fetch Tasks
        const fetchTasks = async () => {
            const res = await fetch("http://localhost:5000/tasks");
            const data = await res.json();

            return data;
        };

    // Fetch Task
    const fetchTask = async (id) => {
        const res = await fetch(`http://localhost:5000/tasks/${id}`);
        const data = await res.json();

        return data;
    };

     // Edit Task
    const editTask = async (event, id) => {
      event.preventDefault()
        const taskToEdit = await fetchTask(id)
        const updateTask = { ...taskToEdit, text: event.target.text, day: event.day }

        const res = await fetch(`http://localhost:5000/tasks/${id}`, {
            method: "PUT",
            headers: {
                "Content-type": "application/json"
            },
            body: JSON.stringify(updateTask)
        })

        const data = await res.json();

        setTasks(tasks.map((task) => task.id === id ? { ...task, text: data.text, day: data.day } : task))
    }

  return (
    <form className="add-form" onSubmit={(e) => editTask(e, task.id)}>
    <div className="form-control">
      <label>Task</label>
      <input
        type="text"
        placeholder="Add Task"
        defaultValue={task.text}
      />
    </div>
    <div className="form-control">
      <label>Day & Time</label>
      <input
        type="text"
        placeholder="Add Day & Time"
        defaultValue={task.day}
      />
    </div>

    <input type="submit" value="Edit Task" className="btn btn-block" />
  </form>
  )
}

export default EditTask

我做错了什么,因为我试着以不同的方式更新它,但它仍然不起作用。但是如果我从react工具中更新它,它就会完美地工作。我已经做了两天了,但还是没明白。

EN

回答 1

Stack Overflow用户

发布于 2022-08-24 12:53:28

您应该指定一个单独的updatedTask状态来存储更新的任务,并编辑表单,以便在输入和名称属性中包含onChange事件:

代码语言:javascript
复制
import { useState, useEffect } from 'react';

const EditTask = ({ task, onEdit }) => {
  const [updatedTask, setUpdatedTask] = useState(task);

  const handleOnChange = (e) => {
    setUpdatedTask((oldTask) => {
      return {
        ...oldTask,
        [e.target.name]: e.target.value,
      };
    });
  };

  const editTask = async (event) => {
    event.preventDefault();

    try {
      await fetch(`http://localhost:5000/tasks/${updatedTask.id}`, {
        method: 'PUT',
        headers: {
          'Content-type': 'application/json',
        },
        body: JSON.stringify(updatedTask),
      });
    } catch (e) {
      console.error(e);
    }
  };

  return (
    <form className='add-form' onSubmit={editTask}>
      <div className='form-control'>
        <label>Task</label>
        <input
          type='text'
          name='text'
          placeholder='Add Task'
          value={updatedTask.text}
          onChange={handleOnChange}
        />
      </div>
      <div className='form-control'>
        <label>Day & Time</label>
        <input
          type='text'
          placeholder='Add Day & Time'
          name='day'
          value={updatedTask.day}
          onChange={handleOnChange}
        />
      </div>

      <input type='submit' value='Edit Task' className='btn btn-block' />
    </form>
  );
};

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

https://stackoverflow.com/questions/73473050

复制
相关文章

相似问题

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