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

如何正确使用fetch()调用Web API?React表单stockData undefined修复

修复表单提交后股票数据undefined的问题

提交表单后打印stockData得到undefined,核心原因是API请求是异步操作——更新symbol后,API请求还未完成,stockData不会立刻更新,同时原代码的useEffect依赖项设置错误,会导致不必要的重复请求。

以下是修复后的代码:

"use client";

import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";

const MY_API_KEY = process.env.NEXT_PUBLIC_MY_API_KEY;

const Home = () => {
  const [stockData, setStockData] = useState();
  const [symbol, setSymbol] = useState();
  const { register, handleSubmit } = useForm();

  useEffect(() => {
    if (!symbol) return;
    
    const fetchStockData = async () => {
      try {
        const apiCall = `https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=${symbol}&outputsize=full&apikey=${MY_API_KEY}`;
        const response = await fetch(apiCall);
        const data = await response.json();
        const dailyData = data["Time Series (Daily)"];
        setStockData(dailyData);
        // API请求完成后打印数据
        console.log(dailyData);
      } catch (error) {
        console.error("获取股票数据失败:", error);
      }
    };

    fetchStockData();
  }, [symbol]); // 仅依赖symbol,避免无限循环

  return (
    <form
      onSubmit={handleSubmit(({ symbol }) => {
        setSymbol(symbol);
        // 这里不要直接打印stockData,此时异步请求还未完成
      })}
    >
      <label>symbol</label>
      <input {...register("symbol")} />
      <input type="submit" />
    </form>
  );
};

export default Home;

关键修复点:

  • 移除useEffect依赖中的stockData:原代码中依赖stockData会导致每次setStockData后重新触发请求,造成无限循环,只需要监听symbol变化即可发起新请求。
  • 将打印逻辑移到API请求完成后:只有当异步请求成功返回数据,才能拿到有效的股票数据,此时打印才会得到正确结果。
  • 改用async/await优化异步代码可读性:比链式then更直观,同时增加错误捕获处理请求失败的情况。
  • 移除重复的outputsize参数:原URL中同时存在outputsize=compact和outputsize=full,会导致参数冲突,保留outputsize=full即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:19