Pull-to-refresh lets users update content by pulling down on a list. It feels natural and helps keep data fresh.
Pull-to-refresh patterns in React Native
import { RefreshControl, ScrollView } from 'react-native'; <ScrollView refreshControl={ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} /> } > {/* content here */} </ScrollView>
refreshing is a boolean that shows if the refresh is happening.
onRefresh is a function called when the user pulls down to refresh.
const [refreshing, setRefreshing] = useState(false);
const onRefresh = () => {
setRefreshing(true);
// fetch new data here
setTimeout(() => setRefreshing(false), 2000);
};<ScrollView
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />}
>
<Text>Pull down to refresh</Text>
</ScrollView>This app shows a list of items. Pulling down refreshes the list by adding a new item after a short delay.
import React, { useState, useCallback } from 'react'; import { ScrollView, RefreshControl, Text, View, StyleSheet } from 'react-native'; export default function PullToRefreshExample() { const [refreshing, setRefreshing] = useState(false); const [items, setItems] = useState(['Item 1', 'Item 2', 'Item 3']); const onRefresh = useCallback(() => { setRefreshing(true); setTimeout(() => { setItems(prev => [...prev, `New Item ${prev.length + 1}`]); setRefreshing(false); }, 1500); }, []); return ( <ScrollView contentContainerStyle={styles.container} refreshControl={ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} /> } > {items.map(item => ( <View key={item} style={styles.item}> <Text>{item}</Text> </View> ))} </ScrollView> ); } const styles = StyleSheet.create({ container: { padding: 20 }, item: { padding: 15, backgroundColor: '#eee', marginBottom: 10, borderRadius: 5 } });
Always set refreshing to false after loading finishes to hide the spinner.
Use RefreshControl only inside scrollable components like ScrollView or FlatList.
Keep the refresh action fast to avoid frustrating users.
Pull-to-refresh lets users update content by dragging down on lists.
Use RefreshControl with ScrollView or FlatList in React Native.
Control refreshing state with a boolean and update data in the refresh callback.
Practice
RefreshControl in React Native pull-to-refresh patterns?Solution
Step 1: Understand the role of RefreshControl
RefreshControlis used to show a spinner and detect pull-down gestures on scrollable lists.Step 2: Identify its purpose in pull-to-refresh
It triggers a refresh callback and shows a loading indicator while data updates.Final Answer:
To provide a visual indicator and handle the refresh action when the user pulls down on a list. -> Option CQuick Check:
RefreshControl = Visual indicator + refresh handler [OK]
- Confusing RefreshControl with navigation components
- Thinking RefreshControl styles list items
- Assuming RefreshControl loads images
FlatList in React Native?Solution
Step 1: Recall correct RefreshControl usage
React Native uses therefreshControlprop on scrollable components likeFlatListto enable pull-to-refresh.Step 2: Match correct syntax
The correct syntax is passing aRefreshControlcomponent withrefreshingandonRefreshprops insiderefreshControl.Final Answer:
<FlatList refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />} /> -> Option AQuick Check:
refreshControl prop with RefreshControl component = correct [OK]
- Using non-existent props like onPullRefresh
- Passing boolean props directly without RefreshControl
- Confusing prop names like pullToRefresh
refreshing after the user pulls down and the onRefresh function finishes?
const [refreshing, setRefreshing] = useState(false);
const onRefresh = () => {
setRefreshing(true);
fetchData().then(() => setRefreshing(false));
};Solution
Step 1: Analyze state changes during refresh
Initially,refreshingis false. WhenonRefreshruns, it setsrefreshingto true.Step 2: Understand asynchronous fetchData effect
AfterfetchDatacompletes,setRefreshing(false)runs, settingrefreshingback to false.Final Answer:
false -> Option BQuick Check:
Refreshing ends with false after fetch completes [OK]
- Assuming refreshing stays true forever
- Confusing asynchronous timing of setState
- Ignoring the promise resolution
const [refreshing, setRefreshing] = useState(false);
const onRefresh = () => {
setRefreshing(true);
fetchData();
setRefreshing(false);
};
return (
<FlatList
data={data}
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />}
/>
);Solution
Step 1: Check refresh state timing
The code callssetRefreshing(false)immediately afterfetchData(), without waiting for data to load.Step 2: Understand asynchronous fetchData
SincefetchDatais async, refreshing should be set to false only after it completes, typically in a .then() or async/await.Final Answer:
setRefreshing(false) is called immediately, not after fetchData finishes. -> Option AQuick Check:
Refreshing must end after fetch completes, not immediately [OK]
- Calling setRefreshing(false) too early
- Ignoring async nature of fetchData
- Misplacing refreshControl props
ScrollView that loads a list of items from an API. Which approach correctly updates the UI and handles the refreshing state?
A) Use refreshControl with a RefreshControl component, manage a boolean refreshing state, and update the list data inside the onRefresh callback after fetching.
B) Use onRefresh prop directly on ScrollView and update data without managing refreshing state.
C) Use a button to reload data instead of pull-to-refresh.
D) Use refreshing state only without RefreshControl component.Solution
Step 1: Understand ScrollView pull-to-refresh pattern
React Native requiresRefreshControlpassed viarefreshControlprop to enable pull-to-refresh onScrollView.Step 2: Manage refreshing state and update data
You must manage a booleanrefreshingstate to show the spinner and update the list data inside theonRefreshcallback after fetching new data.Final Answer:
Use refreshControl with RefreshControl, manage refreshing state, update data in onRefresh. -> Option DQuick Check:
RefreshControl + refreshing state + data update = correct pattern [OK]
- Trying to use onRefresh prop directly on ScrollView
- Not managing refreshing state boolean
- Skipping RefreshControl component
Ready to prove it?
Pass the test and this pattern moves unknown
