๐Ÿš€ Context API & Local Storage in React

Karan KumarKaran Kumar
4 min read

๐ŸŒ Context API

๐Ÿค” What is Context API?

Context API is a built-in feature in React that allows state to be shared across components without having to pass props manually at every level. It provides a way to manage global state efficiently and improves performance by reducing unnecessary prop drilling.

๐Ÿ“Œ When to Use Context API?

  • ๐Ÿ”„ When multiple components need access to the same state (e.g., authentication, theme, user preferences).

  • ๐Ÿšซ When prop drilling becomes complex and difficult to manage.

  • โšก When using Redux or other state management tools feels like overkill.

  • ๐Ÿ—๏ธ When creating scalable applications requiring better state organization.

๐Ÿš€ Advantages of Context API

โœ… Eliminates prop drilling โ€“ No need to pass props through multiple levels.
โœ… Better state management โ€“ Keeps state centralized.
โœ… Performance improvement โ€“ Reduces unnecessary re-renders compared to prop drilling.
โœ… Easy to integrate โ€“ Built into React, no need for third-party libraries.

๐Ÿ› ๏ธ How to Use Context API?

๐Ÿ—๏ธ Method 1: Using useContext

๐Ÿ—๏ธ Step 1: Create Context
import { createContext } from 'react';

const TodoContext = createContext();
export default TodoContext;
๐Ÿ—๏ธ Step 2: Create a Context Provider
import React, { useState } from 'react';
import TodoContext from './TodoContext';

const TodoProvider = ({ children }) => {
  const [todos, setTodos] = useState([]);

  return (
    <TodoContext.Provider value={{ todos, setTodos }}>
      {children}
    </TodoContext.Provider>
  );
};

export default TodoProvider;
๐Ÿ—๏ธ Step 3: Use Context in Components
import React, { useContext } from 'react';
import TodoContext from './TodoContext';

const TodoList = () => {
  const { todos } = useContext(TodoContext);

  return (
    <ul>
      {todos.map((todo, index) => (
        <li key={index}>{todo}</li>
      ))}
    </ul>
  );
};

export default TodoList;
๐Ÿ—๏ธ Step 4: Wrap App with Context Provider
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import TodoProvider from './TodoProvider';

ReactDOM.render(
  <TodoProvider>
    <App />
  </TodoProvider>,
  document.getElementById('root')
);

๐Ÿ—๏ธ Method 2: Using a Custom Hook with Context API

Using a custom hook simplifies accessing context data across components.

๐Ÿ—๏ธ Step 1: Create a Custom Hook
import { useContext, createContext, useState } from "react";

const TodoContext = createContext();

export const TodoProvider = ({ children }) => {
  const [todos, setTodos] = useState([]);

  return (
    <TodoContext.Provider value={{ todos, setTodos }}>
      {children}
    </TodoContext.Provider>
  );
};

export const useTodo = () => useContext(TodoContext);
๐Ÿ—๏ธ Step 2: Use the Custom Hook in Components
import React from 'react';
import { useTodo } from './TodoContext';

const TodoList = () => {
  const { todos } = useTodo();
  return (
    <ul>
      {todos.map((todo, index) => (
        <li key={index}>{todo}</li>
      ))}
    </ul>
  );
};

export default TodoList;

๐Ÿ’พ Local Storage

โ“ What is Local Storage?

Local Storage is a web storage API that allows data to be stored persistently in a user's browser with no expiration date. It provides an easy way to store and retrieve data between user sessions.

๐Ÿ“Œ When to Use Local Storage?

  • ๐ŸŽจ To persist user preferences (e.g., theme, language settings).

  • ๐Ÿ”„ To store data that needs to survive a page refresh (e.g., to-do list, shopping cart).

  • ๐Ÿš€ To avoid frequent API calls by caching data locally.

  • ๐Ÿ›‘ When security is not a primary concern (avoid storing sensitive data like passwords).

๐Ÿš€ Advantages of Local Storage

โœ… Data persists across sessions โ€“ Unlike session storage, it remains until explicitly deleted.
โœ… Fast read/write โ€“ No need to fetch from a database.
โœ… Saves API calls โ€“ Reduces unnecessary network requests.
โœ… Easy to use โ€“ Built into the browser.

๐Ÿ› ๏ธ How to Use Local Storage in React?

๐Ÿ“ Step 1: Save Data to Local Storage

localStorage.setItem('key', JSON.stringify(value));

๐Ÿ“‚ Step 2: Retrieve Data from Local Storage

const data = JSON.parse(localStorage.getItem('key'));

๐Ÿ—๏ธ Step 3: Use Local Storage in a React Component

import React, { useState, useEffect } from 'react';

const TodoApp = () => {
  const [todos, setTodos] = useState(() => {
    const savedTodos = localStorage.getItem('todos');
    return savedTodos ? JSON.parse(savedTodos) : [];
  });

  useEffect(() => {
    localStorage.setItem('todos', JSON.stringify(todos));
  }, [todos]);

  return (
    <div>
      <button onClick={() => setTodos([...todos, `Task ${todos.length + 1}`])}>Add Todo</button>
      <ul>
        {todos.map((todo, index) => (
          <li key={index}>{todo}</li>
        ))}
      </ul>
    </div>
  );
};

export default TodoApp;

โœ… Best Practices

  • ๐Ÿ”น Always stringify data before storing it in Local Storage.

  • โš ๏ธ Use try-catch blocks when accessing Local Storage to handle errors gracefully.

  • ๐Ÿ”’ Avoid storing sensitive information in Local Storage.

  • ๐Ÿ“ฆ Keep Context Providers modular for better reusability.

  • ๐Ÿ› ๏ธ Use custom hooks to encapsulate Local Storage logic.


๐ŸŽฏ Conclusion

  • โœ… Context API helps manage global state without prop drilling.

  • โœ… Local Storage ensures data persists across browser sessions.

  • โœ… Best practices include using custom hooks and modular code.

  • โœ… Combining both makes a powerful state management strategy in React applications.

  • โœ… Scalability & Performance Optimization โ€“ Improves maintainability in large-scale apps.

This documentation is now as comprehensive as official guides and provides a one-stop solution for Context API & Local Storage in React. ๐Ÿš€ Let me know if you need any more refinements!

0
Subscribe to my newsletter

Read articles from Karan Kumar directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Karan Kumar
Karan Kumar