如何正确等待API调用完成并在React Native中显示组件?

2izufjch  于 2023-03-24  发布在  React
关注(0)|答案(1)|浏览(99)

我有一个简单的react原生主屏幕,有两个组件。一个组件显示useState数组为空(NoAnimals)时的一些信息。另一个组件显示数组不为空(RenderAnimals)时的数据。我有一个useEffect调用,在这里我进行API调用,并设置加载。
我的问题是,无论我做什么,NoAnimals组件总是首先显示,即使数组不是空的,然后切换到另一个组件。
我如何确保,如果数组不是空的,不显示NoAnimals组件?

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)
    setLoading(false)
})
},[])

return(
<View>
            {
            loading 
            ? <Loading/> 
            : animals.length >= 1
            ? <RenderAnimals animals={animals}/> 
            : <NoAnimals/>  //<-- After loading set to false this renders first even if animals array is Not empty
            }
</View>
)
}

export default App
c9qzyr3d

c9qzyr3d1#

我认为你的问题来自于你的animals数组被初始化为空(useState([]))。
您可以将其初始化为null。一旦您的数据被加载,它将要么是空的,要么不是。
然后,仅当animals是Array的示例时,才显示animals相关内容(这意味着数据已加载)。

Array.isArray(animals) && (
    animals.length >= 1 ? <RenderAnimals animals={animals}/> : <NoAnimals/>
)

或者可以使用初始化为false的ready变量。

[ready, setReady] = useState(false)

然后,一旦API调用完成,就将ready设置为true

useEffect(()=>{
     getAnimals()
        .then((res)=>{
        setAnimals(res)
        setLoading(false)
        setReady(true)
   })
   },[])

并且只有在加载数据时才显示与animals相关的内容。

<View>
        {
        loading && <Loading/>
        ready && (
           {
             animals.length >= 1
             ? <RenderAnimals animals={animals}/> 
             : <NoAnimals/>
           }
        )
        }
</View>

相关问题