React provides useful hooks to manage shared data, access DOM elements, and improve performance.

1. useContext

useContext lets you share data between components without passing props through every level.

import { createContext, useContext } from "react"; const ThemeContext = createContext("light"); function App() { return ( <ThemeContext.Provider value="dark"> <Child /> </ThemeContext.Provider> ); } function Child() { const theme = useContext(ThemeContext); return <p>Theme: {theme}</p>; } 

Use case: Sharing themes, user details, or language preferences.

2. useRef

useRef stores a value between renders without triggering a re-render when that value changes. It can also reference DOM elements.

import { useRef } from "react"; function App() { const inputRef = useRef(null); return ( <> <input ref={inputRef} /> <button onClick={() => inputRef.current.focus()}> Focus Input </button> </> ); } 

Use case: Focusing inputs, storing timer IDs, or tracking values.

3. useMemo

useMemo caches a calculated value between renders until its dependencies change.

import { useMemo, useState } from "react"; function App() { const [number, setNumber] = useState(5); const squared = useMemo(() => { return number * number; }, [number]); return ( <> <p>Squared: {squared}</p> <button onClick={() => setNumber(number + 1)}> Increase </button> </> ); } 

Use case: Avoiding expensive recalculations when dependencies haven't changed.

Quick Summary

  • useContext → Shares data across components.
  • useRef → Stores values or references DOM elements.
  • useMemo → Caches calculated values.

Tip: Don't use useMemo everywhere. Use it when caching a calculation provides a meaningful benefit.