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

React合并双API数据时触发无限重渲染的问题求解

解决无限重渲染循环的方法

问题根源

你直接在组件的顶层渲染逻辑中调用setAllData,每次组件渲染时都会执行这个if判断。一旦nbaData和animeData不为空,就会触发setAllData更新allData状态,而状态更新又会导致组件重新渲染,进而再次执行setAllData,形成无限循环。

修复方案

将allData的更新逻辑移到useEffect中,通过监听nbaData和animeData的变化来触发更新,避免在渲染阶段直接修改状态。同时修正数据处理逻辑,确保生成符合预期的数组格式:

const [nbaData, setNbaData] = useState(null)
const [animeData, setAnimeData] = useState(null)
const [allData, setAllData] = useState(null)

const getData = async () => {
    // 获取NBA数据
    const nbaRes = await fetch(`https://www.balldontlie.io/api/v1/games?start_date=2023-03-10&end_date=2023-03-10`)
    const nbaResult = await nbaRes.json()
    if (nbaResult?.data) {
        setNbaData(nbaResult.data)
    }
    // 获取动漫数据
    const animeRes = await fetch(`https://animechan.vercel.app/api/random`)
    const animeResult = await animeRes.json()
    if (animeResult) {
        setAnimeData(animeResult)
    }
}

// 使用useEffect监听nbaData和animeData的变化,生成allData
useEffect(() => {
    if (nbaData && animeData) {
        // 提取动漫名称(假设animeData里的title字段是动漫名)
        const animeTitle = animeData.title
        const newAllData = nbaData.map(item => {
            // 每个球队缩写对应动漫名
            return { [item.home_team.abbreviation]: animeTitle }
        })
        setAllData(newAllData)
    }
}, [nbaData, animeData]) // 依赖数组:只有当nbaData或animeData变化时才执行

useEffect(() => {
    getData()
}, [])

额外说明

  1. 原代码中for(let key in animeData)的逻辑会在第一次循环就return,导致每个数组项只取animeData的第一个键值对。如果你的目标是让所有球队对应同一个动漫名,直接提取animeData中的目标字段(比如title)即可,无需循环遍历对象键。
  2. 增加了可选链?.判断nbaResult.data,避免数据结构异常导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:35:29