0Pricing
React Native Academy · Lesson

Consuming Context with useContext

Read context values inside any nested component using the useContext hook, avoiding the need to pass props through intermediate components.

Consuming Context with useContext is a free React Native Academy lesson on CoddyKit — lesson 2 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the React Native Academy learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.

Reading Context with useContext

The useContext(ContextObject) hook lets any function component subscribe to a context and read its current value. It replaces the older Consumer render prop pattern with a simple hook call. The component automatically re-renders whenever the context value changes.

import { useContext } from 'react';
import { ThemeContext } from '../context/ThemeContext';

function Header() {
  const { theme } = useContext(ThemeContext);

  return (
    <View style={{ backgroundColor: theme === 'dark' ? '#1a1a2e' : '#fff' }}>
      <Text>My App</Text>
    </View>
  );
}

No Prop Drilling Required

The main benefit of useContext is that the consuming component does not need to receive props from its parent. The Header component in the previous example can be anywhere in the tree — three levels deep, inside a modal, or in a completely different branch — and it still reads the same theme value directly from context.

// Without context: theme prop drills through App→Screen→Section→Card→Header
// With context: Header reads theme directly from context
function DeepComponent() {
  const { user } = useContext(AuthContext); // no props needed
  return <Text>Welcome, {user.name}</Text>;
}

Calling Actions from Context

Context can expose not just data but also functions that update the data. Call these functions directly from the consuming component without knowing where the state lives. The Provider handles the state update and all consumers that depend on the value re-render automatically.

function LogoutButton() {
  const { logout } = useContext(AuthContext);

  return (
    <Button title='Sign Out' onPress={logout} />
  );
}

Using Multiple Contexts in One Component

A component can consume multiple contexts by calling useContext multiple times with different context objects. Each call is independent — a change in ThemeContext only causes re-renders in ThemeContext consumers, not in AuthContext consumers (unless they also depend on ThemeContext).

function ProfileScreen() {
  const { user } = useContext(AuthContext);
  const { theme } = useContext(ThemeContext);

  return (
    <View style={styles[theme]}>
      <Text style={styles[theme + 'Text']}>
        {user.name}
      </Text>
    </View>
  );
}

Context Value is the Latest Render

useContext always gives you the most recent value provided by the nearest matching Provider. When the Provider re-renders with a new value, React propagates the update to all consumers immediately, even if intermediate components between the Provider and consumer did not re-render. This is one of the key advantages over passing props through potentially non-rendering intermediaries.

Creating a useAuth Custom Hook

Instead of importing and calling useContext(AuthContext) in every component, wrap it in a custom useAuth hook. This abstracts away the context object import, makes the calling code more readable, and lets you add error checks or derived values in one place.

// context/AuthContext.js
export function useAuth() {
  const ctx = useContext(AuthContext);
  if (!ctx) throw new Error('useAuth must be inside AuthProvider');
  return ctx;
}

// In any component
function NavBar() {
  const { user, logout } = useAuth(); // clean and simple
  return <Text>{user.email}</Text>;
}

Guarding Routes with Context

A common pattern is to read auth state from context and conditionally render either the authenticated app stack or the login screen. The root navigator reads the user from AuthContext — when user is null it renders the auth screens, and when it is set it renders the main app screens.

function RootNavigator() {
  const { user } = useAuth();

  return (
    <NavigationContainer>
      {user ? <AppStack /> : <AuthStack />}
    </NavigationContainer>
  );
}

Conditional Rendering Based on Context

Components can use context values to make render decisions. A premium feature component checks the user's subscription tier from context and renders either the full feature or a paywall CTA. This logic lives in the consuming component, keeping the Provider generic and reusable.

function PremiumFeature({ children }) {
  const { user } = useAuth();
  const isPro = user?.subscription === 'pro';

  if (!isPro) {
    return <UpgradePrompt />;
  }

  return children;
}

Context in List Items

Context works inside FlatList renderItem components too. Each list item can read from context without props. Be mindful that if the context value changes, every visible list item will re-render — use React.memo and ensure the context value is stable (memoized) to mitigate the impact.

const CartItem = React.memo(({ item }) => {
  const { addToCart } = useContext(CartContext);

  return (
    <View style={styles.row}>
      <Text>{item.name}</Text>
      <Button title='Add' onPress={() => addToCart(item)} />
    </View>
  );
});

Context vs Props: When to Use Each

Use props for data that is naturally owned by the parent and directly relevant to the child's display. Use context for global or cross-cutting concerns: authentication, theme, language, cart state. Over-using context for local data makes components harder to understand and reuse in isolation, because their dependencies are implicit rather than explicit.

The useContext Return Value

useContext returns exactly the value passed to the nearest Provider's value prop. If no Provider is found above the component, it returns the default value given to createContext(). Destructure the returned object directly at the call site for cleaner, more readable code.

// Full value object
const themeContext = useContext(ThemeContext);
themeContext.theme; // 'light' or 'dark'

// Destructured (preferred)
const { theme, toggleTheme } = useContext(ThemeContext);

// From custom hook
const { user, login, logout } = useAuth();

Quick Check

Test your understanding of consuming context with useContext from this lesson.

Lesson Recap

In this lesson you learned: useContext(ContextObject) reads the nearest Provider's value without prop drilling, a component can consume multiple contexts by calling useContext multiple times, and wrapping useContext in a custom hook gives a clean API with error checking. Next up we build a theme context with a dark mode toggle.

Frequently asked questions

Is the “Consuming Context with useContext” lesson free?

Yes — the full text of “Consuming Context with useContext” is free to read here on the web, and the React Native Academy course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the React Native Academy course, upgrade to CoddyKit PRO.

What will I learn in “Consuming Context with useContext”?

Read context values inside any nested component using the useContext hook, avoiding the need to pass props through intermediate components. You practise React Native Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.

Do I need any experience to start React Native Academy?

No prior experience is required. React Native Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 2 of 4, so you can start here or from the beginning and move at your own pace.

How long does the “Consuming Context with useContext” lesson take?

Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.

Can I write and run code in this React Native Academy lesson?

Yes. Every React Native Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.

All lessons in this course

  1. Creating and Providing a Context
  2. Consuming Context with useContext
  3. A Theme Context with Dark Mode Toggle
  4. Avoiding Context Performance Issues
← Back to React Native Academy