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

React首次提交用户输入未生效导致API请求返回错误数据问题

问题根因

React 的 useState 状态更新是批量异步执行的,同一事件循环内调用 setState 后,立刻读取对应状态拿到的还是更新前的旧值。
你在提交逻辑中先执行了setOwner(enteredWallet),之后立刻调用fetchNFTHandler,此时owner还是初始的空字符串,所以拼接出的请求 URL 是错误的。第二次提交时,owner已经存储了上一次提交时设置的数值,所以才能正常请求到目标数据。

解决方案

两种常用修复方案,按需选择即可:

方案1:直接传参发起请求(推荐)

不需要依赖owner状态,提交时直接拿已经是最新值的enteredWallet作为参数传给请求方法即可,逻辑最简单高效。
修改后的完整代码:

import { useState } from "react";

// 示例输入:  0x147412d494731cbb91dbb5d7019464a536de04dc

function App() {
  const [data, setData] = useState([]);
  const [enteredWallet, setEnteredWallet] = useState("");
  // 如果没有其他场景需要用到owner状态,可以直接删掉这个状态
  const [owner, setOwner] = useState("");

  const walletChangeHandler = (event) => {
    setEnteredWallet(event.target.value);
  };

  const submittedHandler = (event) => {
    event.preventDefault();
    setOwner(enteredWallet);
    // 直接传入最新的输入值发起请求
    fetchNFTHandler(enteredWallet);
  };

  // 新增参数接收钱包地址
  function fetchNFTHandler(walletAddress) {
    fetch(
      `https://api.opensea.io/api/v1/assets?owner=${walletAddress}&order_direction=desc&offset=0&limit=10`
    )
      .then((res) => {
        return res.json();
      })
      .then((data) => {
        const transformedData = data.assets.map((element, index) => {
          return {
            title: element.name,
            id: index,
          };
        });
        setData(transformedData);
      });
  }

  return (
    <div className="App">
      <header className="App-header">
        <h3>查询该钱包地址下的资产</h3>
        <form onSubmit={submittedHandler}>
          <input
            placeholder="钱包地址"
            value={enteredWallet}
            onChange={walletChangeHandler}
          />
          <button>提交</button>
        </form>
        <div>
          {data.map((element) => (
            <li key={element.id}>{element.title}</li>
          ))}
        </div>
      </header>
    </div>
  );
}

export default App;

方案2:通过useEffect监听状态触发请求

如果你后续有其他业务逻辑需要用到owner状态,可以监听owner的变化,等状态更新完成后自动发起请求。
核心修改点:

import { useState, useEffect } from "react";

// ...其余代码保持不变

const submittedHandler = (event) => {
  event.preventDefault();
  setOwner(enteredWallet);
  // 删掉此处的fetch调用
};

// 新增useEffect监听owner变化
useEffect(() => {
  // 避免空值发起无效请求
  if (owner) {
    fetchNFTHandler();
  }
}, [owner])

// ...其余代码保持不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:06:01