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

如何渲染React异步自定义hook返回的数据?

问题原因

所有异步函数默认返回Promise对象,你直接在组件顶层调用useFetch()拿到的是处于Pending状态的Promise实例,而非实际的接口返回值:

  • 你将Promise作为useState初始值传入,JSON.stringify处理Promise实例会返回空对象{},就是你当前看到的渲染结果
  • 你在useEffect中监听的data是固定的Promise实例,引用不会发生变化,所以useEffect回调永远不会触发,state无法更新。

解决方案

我们完全保留你要求的useFetch异步属性、不修改原有fetch和useFetch的实现,也不会在useEffect内直接编写数据获取逻辑,修改后的代码如下:

import { useState, useEffect } from 'react'

const fetch = async () => {
  /* This code can't be changed */
  return "Data to be displayed"
}

const useFetch = async () => { // This function remains asynchronous
  let data = await fetch();
  return data;
};

const App = () =>  {
  const [state, setState] = useState(null);

  useEffect(() => {
    // 仅等待useFetch返回的Promise结果,未直接编写数据获取逻辑,符合约束
    const getData = async () => {
      const fetchResult = await useFetch();
      setState(fetchResult);
    }
    getData();
  }, []);

  // 可选加载状态处理
  if (state === null) return <h1>加载中...</h1>
  return <h1>{JSON.stringify(state)}</h1>
}

export default App;

修改后App组件的逻辑后,就可以正确渲染出"Data to be displayed"字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:54:03