Skip to content

  useContext Hook

The useContext hook provides a way to share state and values across the component tree without passing props manually at every level.

1. Creating a Context

import { createContext } from "react";

const ThemeContext = createContext("light"); // default value
export default ThemeContext;

2. Providing Context

Wrap components with the Provider to pass data down.

import ThemeContext from "./ThemeContext";

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Toolbar />
    </ThemeContext.Provider>
  );
}

3. Consuming Context with useContext

import { useContext } from "react";
import ThemeContext from "./ThemeContext";

function Button() {
  const theme = useContext(ThemeContext);
  return <button className={theme}>Click Me</button>;
}
  • No need for props
  • Any component inside the Provider can access the value

4. Nested Providers

You can use multiple contexts:

<UserContext.Provider value={{ name: "Alice" }}>
  <ThemeContext.Provider value="dark">
    <Dashboard />
  </ThemeContext.Provider>
</UserContext.Provider>

Each component can consume one or both contexts.

5. Updating Context

Pass state as a value:

function App() {
  const [theme, setTheme] = useState("light");

  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      <Toolbar />
    </ThemeContext.Provider>
  );
}

Consume and update:

function ThemeToggle() {
  const { theme, setTheme } = useContext(ThemeContext);

  return (
    <button onClick={() => setTheme(theme === "light" ? "dark" : "light")}>
      Switch Theme
    </button>
  );
}

6. When to Use useContext

  • Global theme (dark/light)
  • User authentication data
  • Current language/locale
  • Global settings or configurations

Avoid overusing context for everything — prefer props for local state.