每次平面列表数据更改时,如何显示 activity 指示符?
How do I show an activity indicator every time my flatlist data changes?
我正在使用名为 selectedStream 的状态设置我的平面列表组件显示的数据。每次用户按下不同的组选项时,selectedStream 都会更改。我注意到 flatlist 需要 1-3 秒来刷新它当前已经显示的所有帖子。我希望有一个加载指示器,以便在指示器消失时,列表已经正确显示了新更新的数据。
<FlatList
maxToRenderPerBatch={5}
bounces={false}
windowSize={5}
ref={feedRef}
data={selectedStream}/>
每当我们处理与 UI 相关的任何事情时,有时我们可能会遇到 UI 重新渲染的延迟。但是,我们需要先弄清楚到底是什么导致了延迟。
询问您的代码的正确问题是:
Is the rendering of items taking longer than expected? Or, is the data being passed with a delay because it is dependant on an API call or any other async task?
一旦你回答了这个问题,你可能会遇到两种情况:
1. FlatList 需要更长的时间来呈现视图
这通常不会发生,因为 RN FlatList
只会呈现用户在任何给定时间可见的视图,并且会在用户滚动列表时不断呈现新视图。但是可能会出现一些闪烁的问题,可以参考下面的文章:
8 Ways to optimise your RN FlatList
2。传递数据导致延迟
这是最常见的情况,我们可以调用 API 端点并获取一些数据,然后 setState
相应地更新任何 view/list。一种通用的方法是显示某种进度条,指示应用程序正忙,从而保持适当的用户体验。最简单的方法是 条件渲染.
一个一般的例子是:
const [myList, setMyList] = useState();
function callAPIforMyList(){
// logic goes here
}
return {
{myList ? <ActivityIndicator .../> : <Flatlist .... />
}
以上代码将检查 myList
是否为 undefined
或是否有值。如果 undefined
,它将呈现 ActivityIndicator
,否则呈现 FlatList
。
另一种情况可能是 myList
可能有现有数据,但您需要 update/replace 使用新数据。这样上面的检查可能会失败,所以我们可以再检查一次:
const [myList, setMyList] = useState();
const [isAPIbusy, setAPIBusy] = useState(false)
function callAPIformyList() {
setAPIBusy(true)
/// other logics or async calls or redux-dispatch
setAPIBusy(false)
}
return {
{!isAPIBusy && myList ? (<Flatlist .... />) : (<ActivityIndicator .../>)
}
您可以使用更多 turneries 添加多个条件,例如 isAPIBusy ? <View1> : otherBoolean ? <View2> : <Default_View_When_No_Conditions_Match)/>
希望这有助于阐明您的需求。
我正在使用名为 selectedStream 的状态设置我的平面列表组件显示的数据。每次用户按下不同的组选项时,selectedStream 都会更改。我注意到 flatlist 需要 1-3 秒来刷新它当前已经显示的所有帖子。我希望有一个加载指示器,以便在指示器消失时,列表已经正确显示了新更新的数据。
<FlatList
maxToRenderPerBatch={5}
bounces={false}
windowSize={5}
ref={feedRef}
data={selectedStream}/>
每当我们处理与 UI 相关的任何事情时,有时我们可能会遇到 UI 重新渲染的延迟。但是,我们需要先弄清楚到底是什么导致了延迟。
询问您的代码的正确问题是:
Is the rendering of items taking longer than expected? Or, is the data being passed with a delay because it is dependant on an API call or any other async task?
一旦你回答了这个问题,你可能会遇到两种情况:
1. FlatList 需要更长的时间来呈现视图
这通常不会发生,因为 RN FlatList
只会呈现用户在任何给定时间可见的视图,并且会在用户滚动列表时不断呈现新视图。但是可能会出现一些闪烁的问题,可以参考下面的文章:
8 Ways to optimise your RN FlatList
2。传递数据导致延迟
这是最常见的情况,我们可以调用 API 端点并获取一些数据,然后 setState
相应地更新任何 view/list。一种通用的方法是显示某种进度条,指示应用程序正忙,从而保持适当的用户体验。最简单的方法是 条件渲染.
一个一般的例子是:
const [myList, setMyList] = useState();
function callAPIforMyList(){
// logic goes here
}
return {
{myList ? <ActivityIndicator .../> : <Flatlist .... />
}
以上代码将检查 myList
是否为 undefined
或是否有值。如果 undefined
,它将呈现 ActivityIndicator
,否则呈现 FlatList
。
另一种情况可能是 myList
可能有现有数据,但您需要 update/replace 使用新数据。这样上面的检查可能会失败,所以我们可以再检查一次:
const [myList, setMyList] = useState();
const [isAPIbusy, setAPIBusy] = useState(false)
function callAPIformyList() {
setAPIBusy(true)
/// other logics or async calls or redux-dispatch
setAPIBusy(false)
}
return {
{!isAPIBusy && myList ? (<Flatlist .... />) : (<ActivityIndicator .../>)
}
您可以使用更多 turneries 添加多个条件,例如 isAPIBusy ? <View1> : otherBoolean ? <View2> : <Default_View_When_No_Conditions_Match)/>
希望这有助于阐明您的需求。