Pull-to-refresh lets users update content by pulling down on the screen. It feels natural and easy, like flipping a page to see new stuff.
Pull-to-refresh in React Native
import { RefreshControl, ScrollView } from 'react-native'; <ScrollView refreshControl={ <RefreshControl refreshing={refreshing} onRefresh={onRefresh} /> } > {/* Your scrollable content here */} </ScrollView>
refreshing is a boolean state 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 fruits. When you pull down, it adds a new fruit after a short delay, showing the refresh effect.
import React, { useState, useCallback } from 'react'; import { View, Text, ScrollView, RefreshControl, StyleSheet } from 'react-native'; export default function PullToRefreshExample() { const [refreshing, setRefreshing] = useState(false); const [items, setItems] = useState(['Apple', 'Banana', 'Cherry']); const onRefresh = useCallback(() => { setRefreshing(true); setTimeout(() => { setItems(prevItems => [...prevItems, 'New Fruit']); setRefreshing(false); }, 1500); }, []); return ( <ScrollView contentContainerStyle={styles.container} refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />} > {items.map((item, index) => ( <Text key={index} style={styles.item}>{item}</Text> ))} </ScrollView> ); } const styles = StyleSheet.create({ container: { padding: 20 }, item: { fontSize: 18, marginVertical: 8 } });
Always set refreshing to false after your data loads to stop the spinner.
Use useCallback for onRefresh to avoid unnecessary re-renders.
Pull-to-refresh works only inside scrollable views like ScrollView or FlatList.
Pull-to-refresh lets users update content by pulling down on a list.
Use RefreshControl inside a scrollable component with refreshing and onRefresh props.
Remember to update the refreshing state to show and hide the loading spinner.
Practice
RefreshControl in a React Native app?Solution
Step 1: Understand the role of RefreshControl
RefreshControlis a component used inside scrollable views to provide pull-to-refresh behavior.Step 2: Identify its main purpose
Its main purpose is to let users pull down on a list to trigger a refresh action, usually to update content.Final Answer:
To enable pull-to-refresh functionality in scrollable lists -> Option AQuick Check:
Pull-to-refresh = RefreshControl usage [OK]
- Confusing RefreshControl with navigation or styling
- Thinking it adds animations to buttons
- Using it outside scrollable components
RefreshControl inside a ScrollView?Solution
Step 1: Recall correct RefreshControl usage
TherefreshControlprop expects aRefreshControlcomponent with propsrefreshingandonRefresh.Step 2: Match correct syntax
<ScrollView refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />} /> correctly passesrefreshingandonRefreshinside<RefreshControl />as a JSX element.Final Answer:
<ScrollView refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />} /> -> Option DQuick Check:
refreshControl prop = RefreshControl component with correct props [OK]
- Passing props directly to ScrollView instead of RefreshControl
- Calling RefreshControl as a function instead of JSX
- Using wrong prop names like refresh or refreshHandler
const [refreshing, setRefreshing] = React.useState(false);
const onRefresh = React.useCallback(() => {
setRefreshing(true);
setTimeout(() => setRefreshing(false), 2000);
}, []);
return (
<ScrollView refreshControl={
<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
}>
<Text>Pull down to refresh</Text>
</ScrollView>
);Solution
Step 1: Understand the refreshing state changes
When the user pulls down,onRefreshsetsrefreshingto true, showing the spinner.Step 2: Analyze the timeout effect
After 2 seconds,setRefreshing(false)hides the spinner automatically.Final Answer:
The spinner shows for 2 seconds, then hides automatically -> Option BQuick Check:
refreshing true then false after timeout = spinner shows then hides [OK]
- Assuming spinner never hides without manual reset
- Thinking refreshing starts as true initially
- Confusing useCallback dependencies causing crashes
const [refreshing, setRefreshing] = React.useState(false);
function onRefresh() {
setRefreshing(true);
fetchData();
setRefreshing(false);
}
return (
<FlatList
data={data}
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />}
renderItem={({item}) => <Text>{item}</Text>}
/>
);Solution
Step 1: Check refreshing state timing
The function callssetRefreshing(false)immediately afterfetchData(), without waiting for data to load.Step 2: Understand spinner behavior
This causes the spinner to hide right away, not showing the loading state properly.Final Answer:
setRefreshing(false) is called immediately, hiding spinner too soon -> Option CQuick Check:
Refreshing state must stay true until data loads [OK]
- Calling setRefreshing(false) too early
- Misnaming refreshControl prop
- Assuming FlatList can't use RefreshControl
SectionList that fetches new data asynchronously. Which approach correctly ensures the spinner shows during fetch and hides after completion?
const [refreshing, setRefreshing] = React.useState(false);
const onRefresh = async () => {
// What goes here?
};Solution
Step 1: Set refreshing true before fetching
CallsetRefreshing(true)to show spinner before starting data fetch.Step 2: Await fetchData and then set refreshing false
Useawait fetchData()to wait for data, then callsetRefreshing(false)to hide spinner after completion.Final Answer:
setRefreshing(true); await fetchData(); setRefreshing(false); -> Option AQuick Check:
Show spinner before await, hide after await [OK]
- Setting refreshing false before fetch completes
- Not awaiting fetchData causing spinner to hide early
- Switching order of setRefreshing calls
Ready to prove it?
Pass the test and this pattern moves unknown
