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

如何在React中使用自定义Axios Hook立即获取并使用API响应?

解决自定义Axios Hook调用后无法立即获取响应的问题

你的问题核心在于React状态更新是异步的:调用fetchData后,setResponse不会立刻更新response变量,所以紧接着的if(response.status === 200)判断拿到的还是初始状态(空数组),导致首次点击走else分支。

下面提供最直接的解决方案,无需额外新增状态:

修改自定义Hook,让fetchData直接返回响应

调整useAxiosFunction中的fetchData函数,在设置response状态后直接返回响应结果,同时在catch块抛出错误,方便调用方处理:

const useAxiosFunction = () => {
    const [response, setResponse] = useState([]);
    const [error, setError] = useState('');
    const [loading, setLoading] = useState(false); 
    const [controller, setController] = useState();

    const fetchData = async (configObj) => {        
        try {
            setLoading(true);
            const ctrl = new AbortController();
            setController(ctrl);
            const res = await axios({...configObj, 
                signal: ctrl.signal                
            });            
            setResponse(res);
            return res; // 直接返回响应结果
        } catch (err) {            
            setError(err.response.data);
            throw err; // 抛出错误供调用方捕获
        } finally {
            setLoading(false);
        }
    }

    useEffect(() => {        
        return () => controller && controller.abort();
    }, [controller]);
    
    return [response, error, loading, fetchData];
}

修改调用逻辑,用await直接获取响应

将handleClickTransfer改为async函数,通过await获取fetchData返回的响应,直接使用该返回值进行判断,无需依赖React状态更新:

const [response, error, loading, fetchData] = useAxiosFunction();

const handleClickTransfer = async (codOp, cvu, alias, email, comment) => {        
    try {
        const res = await fetchData({
            method: "GET",
            url: `${process.env.REACT_APP_ORQ_URL}/${process.env.REACT_APP_ORQ_VER}/consultaPagos/codigoOrdenPago/${codOp}`,   
            data: {"comment": refComment.current},        
            ...getHeadersToken()                        
        });

        if(res.status === 200){
            modalProps.current = modalTransferencias(res.data.payments, codOp, cvu, alias, email, comment);
            handleShow();
        }
    } catch (err) {
        console.log(err.response.data);
    }
}

这种方式既保留了原Hook中response、loading、error状态的功能(供其他组件逻辑使用),又能在点击事件中立即拿到最新的响应结果,完美解决你的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:32:55