axios 如何在提交ReactJS表单后刷新项目列表

sqxo8psd  于 2023-01-13  发布在  iOS
关注(0)|答案(1)|浏览(169)

你好,我正在开发一个待办事项列表应用程序使用reactjs与axios。我设法查看,并添加数据到数据库,我现在的问题是,我不知道如何加载更新后的数据后,提交的形式。
这是从数据库中获取所有数据的代码,文件名为FetchData.js

import { useEffect, useState} from 'react';
import axios from 'axios';

const FetchData = () => {
  const [data, setData] = useState({});
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const { data: response } = await axios.get('http://localhost/todolistci/backend/index.php/todos/view', { crossDomain: true });
        setData(response);
      } catch (error) {
        console.error(error);
      }
      setLoading(false);
    };

    fetchData();
  }, []);

  return {
    data,
    loading,
  };
};

export default FetchData;

这是我查看来自FetchData.js的项目列表的方式。文件名为List.js

import React from 'react';
import ListItem from './ListItem'
import FetchData from './FetchData';

function List() {
  const {
    data,
    loading,
  } = FetchData();

  return (
    <ul>
      {loading && <div>Loading</div>}
      {!loading && (
        <>
          {data.map(item => (<ListItem key={item.id} id={item.id} name={item.name} complete={item.complete} />))}
        </>
      )}
    </ul>
  )
}

export default List

现在这是我提交的表单.文件名是FormToDo.js

import React, {useState} from 'react';
import axios from 'axios';

function FormToDo() {
  
    const [formValue, setformValue] = useState({
      name: '',
    });

    const handleSubmit = async(e) => {
      e.preventDefault();
      // store the states in the form data
      const nameFormData = new FormData();
      nameFormData.append("name", formValue.name)
    
      try {
        // make axios post request
        const response = await axios({
          method: "post",
          url: "http://localhost/todolistci/backend/index.php/create",
          data: nameFormData,
          headers: { "Content-Type": "multipart/form-data" },
        });
      } catch(error) {
        console.log(error)
      }

      //empty the text field
      setformValue({name: ''});

      //I need to update the list of data in here
    }
  
    const handleChange = (event) => {
      setformValue({
        ...formValue,
        [event.target.name]: event.target.value
      });
    }

  return (
    <div>
        <form  onSubmit={handleSubmit}>
            <input type="text" name="name" id="name" required placeholder="Enter To Do" 
            value={formValue.name} onChange={handleChange} onKeyDown={handleChange} />
            <button type="submit">+</button>
        </form>
    </div>
  )
}

export default FormToDo

这是我正在制作的todo应用程序的图像。enter image description here
帮帮我。谢谢。

yv5phkfx

yv5phkfx1#

您的示例没有描述在axios发布数据并得到响应后如何返回列表。
你需要的是在数据库更新后进行变异。
一种方法是将“fetchData”从useEffect移动到“FetchData”,并添加一个变异函数,该函数获取数据并在返回中可用

const FetchData = () => {
  const [data, setData] = useState({});
  const [loading, setLoading] = useState(true);

  const fetchData = async () => {
    try {
      const { data: response } = await axios.get(
        "http://localhost/todolistci/backend/index.php/todos/view",
        { crossDomain: true }
      );
      setData(response);
    } catch (error) {
      console.error(error);
    }
    setLoading(false);
  };

  const mutate = () => fetchData();

  useEffect(() => {
    fetchData();
  }, []);

  return {
    data,
    loading,
    mutate,
  };
};

然后在数据发布后调用mutate。
第二种解决方案是将浏览器推到列表页面,并确保fetchData运行。
第三种解决方案(我会选择)是使用SWR- React Hooks for Data Fetching,它可以帮助您获取和修改数据,您可以在他们的文档中看到axios示例

相关问题