๐ Context API & Local Storage in React

๐ 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!
Subscribe to my newsletter
Read articles from Karan Kumar directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
