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

ReactJS中如何将fetch请求逻辑封装为独立helper函数在组件内调用

问题原因
  • getLotteries是异步函数,调用后会返回Promise实例,你没有用await或者.then()处理异步结果,代码里直接使用的response属于未声明变量,本身就会抛出引用错误。
  • 你把修改状态的逻辑写在了同步执行的位置,会在接口请求还没返回结果的时候就提前执行setIsLoading(false)和setLotteries,和你原本的执行逻辑完全不符。
  • useEffect的回调函数不能直接声明为async,所以你需要在useEffect内部定义异步执行函数,再调用它。
修正后的组件代码
import { getLotteries } from '你的helper文件路径' // 记得替换为你实际的helper文件引入路径

export const Carousel = () => {
  const [ lotteries, setLotteries ] = useState({});
  const [ isLoading, setIsLoading ] = useState(true);

  useEffect(() => {
    // 内部定义异步执行函数
    async function fetchData() {
      const res = await getLotteries() // 等待异步请求返回结果
      setLotteries(res)
      setIsLoading(false)
    }
    fetchData()
  }, [])

  // 渲染逻辑和原有保持一致即可
  return (
    <>
      {
        isLoading ? (
          <span>loading</span>
        ) : (
          <Slider >
            {
              Object.keys(lotteries).map((lottery, idx) => {
                return (
                  <Slide 
                    key={ idx }
                    title={ lottery }
                    prize={ lotteries[lottery].next.jackpot }
                    day={ lotteries[lottery].next.date.day }
                  />
                )
              })
            }
          </Slider>
        )
      }
    </>
  );
}
可选优化

可以给请求加异常捕获,避免接口报错导致页面直接崩溃:

useEffect(() => {
  async function fetchData() {
    try {
      const res = await getLotteries()
      setLotteries(res)
    } catch (err) {
      console.error('请求抽奖数据失败:', err)
      // 可自行扩展错误状态的展示逻辑,比如展示错误提示文案
    } finally {
      // 无论请求成功失败都关闭loading
      setIsLoading(false)
    }
  }
  fetchData()
}, [])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:15:11