Mastering React Hooks: A Practical Guide for Web Dev

Introduction

React Hooks empower functional components with state and lifecycle features. This guide covers essential hooks, best practices, and examples to enhance your React projects.

Written At

2025-05-24

Updated At

2025-05-24

Reading time

5 minutes

Step 1: Understand Core Hooks (useState, useEffect)

Why it matters: These hooks replace class component features like state and lifecycle methods.

What to do:

  1. Use useState to manage local state:
    javascript
    const [count, setCount] = useState(0);
  2. Use useEffect for side effects (e.g., API calls):
    javascript
    useEffect(() => {
      fetchData();
    }, [dependencies]);

Example:

A counter component using both hooks:

javascript
function Counter() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    document.title = `Count: ${count}`;
  }, [count]);
  return (
    <button onClick={() => setCount(count + 1)}>
      Clicked {count} times
    </button>
  );
}

Step 2: Leverage useReducer for Complex State

Why it matters: useReducer simplifies state logic for multi-action scenarios.

What to do:

  1. Define a reducer function:
    javascript
    function reducer(state, action) {
      switch (action.type) {
        case 'increment':
          return { count: state.count + 1 };
        default:
          return state;
      }
    }
  2. Initialize useReducer:
    javascript
    const [state, dispatch] = useReducer(reducer, { count: 0 });

Example:

A todo list using useReducer:

javascript
dispatch({ type: 'add', payload: 'New Task' });

Step 3: Optimize Performance with useMemo/useCallback

Why it matters: These hooks prevent unnecessary re-renders.

What to do:

  1. Memoize expensive calculations:
    javascript
    const result = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  2. Cache functions with useCallback:
    javascript
    const handleClick = useCallback(() => {
      // logic
    }, [dependencies]);

Example:

A filtered list using useMemo:

javascript
const filteredList = useMemo(
  () => items.filter(item => item.price > 100),
  [items]
);