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

React Native中如何正确等待API请求完成后再显示对应组件?

解决React Native加载完成后先显示NoAnimals组件的问题

问题原因

React的状态更新是异步批量处理的。在你的API请求回调中,setAnimals(res)和setLoading(false)会被合并执行。当loading切换为false时,animals还未更新为API返回的数据,此时animals仍是初始空数组,因此会先渲染NoAnimals组件;等animals状态更新完成后,才会重新渲染RenderAnimals。

解决方案

方案1:用animals初始状态替代独立loading状态

这种方式无需额外维护loading变量,通过animals的初始值区分加载状态:

import RenderAnimals from '.....'
import NoAnimals from '.....'
import Loading from '.....'
import {getAnimals} from './myCoolAPI'

const App = () => {
  // 初始设为null,表示未加载完成
  const [animals, setAnimals] = useState(null);

  useEffect(() => {
    getAnimals()
      .then(res => setAnimals(res));
  }, [])

  return(
    <View>
      {animals === null 
        ? <Loading /> 
        : animals.length > 0
          ? <RenderAnimals animals={animals} /> 
          : <NoAnimals />
      }
    </View>
  )
}

export default App

方案2:确保loading在animals更新后切换

若需保留loading状态,可通过监听animals变化更新loading:

import RenderAnimals from '.....'
import NoAnimals from '.....'
import Loading from '.....'
import {getAnimals} from './myCoolAPI'

const App = () => {
  const [animals, setAnimals] = useState([])
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    getAnimals().then(res => setAnimals(res));
  }, [])

  useEffect(() => {
    // 当animals状态更新后,结束加载
    setLoading(false);
  }, [animals])

  return(
    <View>
      {loading 
        ? <Loading /> 
        : animals.length > 0
          ? <RenderAnimals animals={animals} /> 
          : <NoAnimals />
      }
    </View>
  )
}

export default App

推荐方案1,它更简洁,完全避免了状态不同步的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:47:50