You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中POST请求后触发GET请求实现无刷新显示新增条目的方法

解决方案

你这个问题本质是子组件操作完成后触发父组件的数据重新拉取,按下面几步改即可:

第一步:改造useAxiosGet自定义hook,暴露重新请求的方法

你当前的useAxiosGet应该仅在组件初始化时发一次GET请求,我们给它新增一个可手动触发刷新的refetch方法:

// useAxiosGet.js 改造后代码示例
import { useState, useEffect, useCallback } from 'react';
import axios from 'axios';

export default function useAxiosGet(url) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  // 把请求逻辑封装为可复用方法,用useCallback缓存避免不必要的重渲染
  const fetchData = useCallback(async () => {
    setLoading(true);
    try {
      const res = await axios.get(url);
      setData(res.data);
      setError(null);
    } catch (err) {
      setError(err);
    } finally {
      setLoading(false);
    }
  }, [url]);

  // 组件初始化时自动调用一次
  useEffect(() => {
    fetchData();
  }, [fetchData]);

  // 向外返回refetch方法,外部可手动调用触发重新请求
  return { data, loading, error, refetch: fetchData };
}

第二步:修改App组件,把refetch方法通过props传递给ModalForm

// App.js 修改后代码
const App = () => {
    // 解构拿到refetch方法
    const { data: books, loading, error, refetch: fetchBooks } = useAxiosGet(API_URL)
    // 其余原有代码

    return (
        // 其余原有渲染代码
        {/* 把刷新方法作为props传给子组件 */}
        <ModalForm onSubmitSuccess={fetchBooks} />
    );
}

第三步:修改ModalForm组件,post请求成功后调用父组件传入的刷新方法

// ModalForm.js 修改后代码
// 接收父组件传入的onSubmitSuccess props
const ModalForm = ({ onSubmitSuccess }) => {
    // 原有打开弹窗的逻辑代码

    function submit(e) {
        e.preventDefault();
        axios.post(API_URL, {
            name: data.name,
            description: data.description,
            count: data.count,
            imageURL: data.imageURL,
            price: data.price
        })
        .then(res => {
            console.log(res.data);
            // post成功后调用父组件传的刷新方法,触发GET请求更新列表
            onSubmitSuccess?.();
        })
        .catch((err) => {
            console.log(err);
        })
        setData({
            name: "",
            description: "",
            count: "",
            imageURL: "",
            price: ""
        })
    }

    function handle(e){
        const newData={...data}
        newData[e.target.id] = e.target.value
        setData(newData)
        console.log(newData)
    }

    return (// 原有渲染代码);
}
可选优化方案

如果你不想每次新增都额外发一次GET请求,也可以在post成功后直接把后端返回的新条目加到父组件的books列表里,性能更高:

  • 父组件把更新books列表的方法传给子组件
  • post成功后拿到返回的新条目,直接调用该方法更新本地列表,无需再发GET请求

内容的提问来源于stack exchange,提问作者Nazar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:24:08