The useReducer hook helps you manage complex state in your React Native app in a clear and organized way.
useReducer hook in React Native
const [state, dispatch] = useReducer(reducer, initialState);
function reducer(state, action) {
switch (action.type) {
case 'ACTION_TYPE':
return { ...state, /* new state changes */ };
default:
return state;
}
}reducer is a function that takes current state and an action, then returns new state.
dispatch is a function you call to send an action to the reducer.
const [count, dispatch] = useReducer((state, action) => {
switch (action.type) {
case 'increment':
return state + 1;
case 'decrement':
return state - 1;
default:
return state;
}
}, 0);const initialState = { on: false };
function toggleReducer(state, action) {
switch (action.type) {
case 'toggle':
return { on: !state.on };
default:
return state;
}
}
const [state, dispatch] = useReducer(toggleReducer, initialState);This app shows a number that you can increase or decrease by pressing buttons. It uses useReducer to manage the count state clearly.
import React, { useReducer } from 'react'; import { View, Text, Button, StyleSheet } from 'react-native'; const initialState = { count: 0 }; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } } export default function Counter() { const [state, dispatch] = useReducer(reducer, initialState); return ( <View style={styles.container}> <Text style={styles.countText}>Count: {state.count}</Text> <View style={styles.buttonRow}> <Button title="-" onPress={() => dispatch({ type: 'decrement' })} /> <Button title="+" onPress={() => dispatch({ type: 'increment' })} /> </View> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#f0f0f0' }, countText: { fontSize: 32, marginBottom: 20 }, buttonRow: { flexDirection: 'row', width: '40%', justifyContent: 'space-around' } });
Always return a new state object from the reducer; do not modify the existing state directly.
Use descriptive action types to keep your code easy to understand.
useReducer is great for complex state but might be overkill for simple state changes.
useReducer helps manage complex state by using a reducer function and actions.
It keeps state logic organized and easy to follow.
Use dispatch to send actions that update the state.
Practice
useReducer hook in React Native?Solution
Step 1: Understand the role of useReducer
useReduceris designed to handle complex state changes by using a reducer function and dispatching actions.Step 2: Compare with other options
Fetching data, styling, and navigation are handled by other hooks or libraries, notuseReducer.Final Answer:
To manage complex state logic using a reducer function and actions -> Option CQuick Check:
useReducer = complex state management [OK]
- Confusing useReducer with useEffect for data fetching
- Thinking useReducer is for styling or navigation
- Believing useReducer automatically fetches data
useReducer in a React Native component?Solution
Step 1: Recall useReducer return value
useReducerreturns an array with two elements: current state and dispatch function.Step 2: Match correct destructuring syntax
Array destructuring uses square brackets, soconst [state, dispatch]is correct.Final Answer:
const [state, dispatch] = useReducer(reducer, initialState); -> Option DQuick Check:
useReducer returns [state, dispatch] array [OK]
- Using object destructuring {} instead of array []
- Naming dispatch as setState incorrectly
- Assigning useReducer result to a single variable
state.count after dispatching { type: 'increment' }?
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
}
const [state, dispatch] = useReducer(reducer, initialState);
dispatch({ type: 'increment' });Solution
Step 1: Analyze reducer behavior for 'increment'
The reducer returns a new state with count increased by 1 from current state.count.Step 2: Calculate new count value
Initial count is 0, so after increment it becomes 0 + 1 = 1.Final Answer:
1 -> Option AQuick Check:
Increment action adds 1 to count [OK]
- Forgetting to return new state object
- Assuming state changes without dispatch
- Confusing increment with decrement
useReducer setup:
const initialState = { count: 0 };
function reducer(state, action) {
if (action.type === 'increment') {
state.count += 1;
return state;
}
return state;
}
const [state, dispatch] = useReducer(reducer, initialState);
dispatch({ type: 'increment' });Solution
Step 1: Check reducer state mutation
The reducer modifiesstate.countdirectly, which is not recommended in React.Step 2: Understand why mutation is wrong
React expects reducers to return new state objects to detect changes and update UI correctly.Final Answer:
Mutating state directly instead of returning a new object -> Option BQuick Check:
Reducers must return new state objects, not mutate [OK]
- Mutating state instead of copying
- Forgetting to return new state
- Assuming dispatch is undefined without context
isVisible state using useReducer. Which reducer function correctly toggles the state when dispatching { type: 'toggle' }?Solution
Step 1: Identify correct state update pattern
The reducer must return a new state object withisVisibletoggled using!state.isVisible.Step 2: Check each option
function reducer(state, action) { if (action.type === 'toggle') return { isVisible: !state.isVisible }; return state; } returns a new object with toggled value. function reducer(state, action) { if (action.type === 'toggle') state.isVisible = !state.isVisible; return state; } mutates state directly. function reducer(state, action) { if (action.type === 'toggle') return state.isVisible = !state.isVisible; return state; } returns a boolean, not an object. function reducer(state, action) { if (action.type === 'toggle') return { isVisible: state.isVisible }; return state; } returns unchanged state.Final Answer:
function reducer(state, action) { if (action.type === 'toggle') return { isVisible: !state.isVisible }; return state; } -> Option AQuick Check:
Return new state object with toggled boolean [OK]
- Mutating state directly instead of returning new object
- Returning boolean instead of state object
- Returning unchanged state without toggling
Ready to prove it?
Pass the test and this pattern moves unknown
