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

React 18.2.0中useEffect获数据后无法更新useState的posts状态

问题分析与解决方案

你的代码存在两个关键问题,导致了当前的现象:

1. 控制台打印posts为空是setState异步特性导致

setPosts 是异步更新状态的,调用后当前作用域内的 posts 变量不会立即更新,所以你紧接着打印的还是初始的空数组。这是React的正常机制,状态实际上已进入更新队列,若要验证状态是否真的更新,可以在组件顶层添加打印,或者用useEffect监听posts变化:

useEffect(() => {
  console.log("更新后的posts:", posts)
}, [posts])

2. UI不渲染是因为map回调未返回JSX元素

你在 posts.map 的回调中编写了JSX,但未明确返回它。箭头函数的隐式返回需要用圆括号包裹JSX,或者显式添加 return 关键字,否则回调函数无返回值,React不会渲染任何内容。

修改后的完整代码

import './App.css';
import { useEffect, useState } from 'react';
import axios from 'axios';

function App() {
  const [posts, setPosts] = useState([])

  useEffect(() => {
    (async () => {
      const response = await axios.get("https://jsonplaceholder.typicode.com/posts")
      const data = response.data
      setPosts(data)
    })()
  },[])

  return (
    <div className="App">
      <ul>
        {/* 用圆括号实现箭头函数隐式返回JSX */}
        {posts.map(post => (
          <li key={post.id}>
            <h3>{post.title}</h3>
            <p>{post.body}</p>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default App;

另外补充:原代码直接将 <li> 放在 <div> 下不符合HTML规范,修改后的代码将所有列表项包裹在 <ul> 中,更符合语义化要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:40:34