DEV Community

Cover image for Understanding The Use Of Context API In React JS
Shrikant Yadav
Shrikant Yadav

Posted on • Originally published at reacttonext.com

Understanding The Use Of Context API In React JS

React JS, known for its efficient and flexible JavaScript library for building user interfaces, often requires sharing data between components without passing props at every level. This is where the Context API in React JS comes into play. The Context API enables the seamless transmission of data through the component tree without the need for prop drilling at each hierarchical level.

What is Context API?

The Context API is a React mechanism that facilitates the sharing of specific data across all levels of an application. It’s designed to solve the problem of prop drilling, where props are passed down through multiple levels of a component tree.

Common Uses of Context API

Here are five common scenarios where the Context API is particularly useful:

  • Theme Management
  • User Authentication
  • Global State Management
  • Language Localization
  • Notification System

Let’s dive into each use case with examples to understand how the Context API can be implemented effectively.

1. Theme Management

When building a web application, managing themes can become cumbersome if we pass theme-related props through multiple components. The Context API simplifies this process.

Example:

// ThemeContext.js
import React, { createContext, useState } from 'react';

export const ThemeContext = createContext();

export const ThemeProvider = ({ children }) => {
    const [theme, setTheme] = useState('light');

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

// App.js
import React, { useContext } from 'react';
import { ThemeProvider, ThemeContext } from './ThemeContext';

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

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

const App = () => (
    <ThemeProvider>
        <ThemeToggle />
    </ThemeProvider>
);

export default App;
Enter fullscreen mode Exit fullscreen mode

2. User Authentication

Managing user authentication states such as login status, user data, and tokens can be simplified using the Context API.

Example:

// AuthContext.js
import React, { createContext, useState } from 'react';

export const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
    const [user, setUser] = useState(null);

    const login = (userData) => {
        setUser(userData);
    };

    const logout = () => {
        setUser(null);
    };

    return (
        <AuthContext.Provider value={{ user, login, logout }}>
            {children}
        </AuthContext.Provider>
    );
};

// App.js
import React, { useContext } from 'react';
import { AuthProvider, AuthContext } from './AuthContext';

const UserProfile = () => {
    const { user, logout } = useContext(AuthContext);

    if (!user) return <p>Please log in.</p>;

    return (
        <div>
            <p>Welcome, {user.name}!</p>
            <button onClick={logout}>Logout</button>
        </div>
    );
};

const App = () => (
    <AuthProvider>
        <UserProfile />
    </AuthProvider>
);

export default App;
Enter fullscreen mode Exit fullscreen mode

3. Global State Management

For managing global states like app settings or configurations, the Context API provides a straightforward solution.

Example:

// AppContext.js
import React, { createContext, useState } from 'react';

export const AppContext = createContext();

export const AppProvider = ({ children }) => {
    const [settings, setSettings] = useState({});

    return (
        <AppContext.Provider value={{ settings, setSettings }}>
            {children}
        </AppContext.Provider>
    );
};

// App.js
import React, { useContext } from 'react';
import { AppProvider, AppContext } from './AppContext';

const SettingsComponent = () => {
    const { settings, setSettings } = useContext(AppContext);

    const updateSetting = () => {
        setSettings({ ...settings, newSetting: true });
    };

    return (
        <div>
            <p>Current Settings: {JSON.stringify(settings)}</p>
            <button onClick={updateSetting}>Update Settings</button>
        </div>
    );
};

const App = () => (
    <AppProvider>
        <SettingsComponent />
    </AppProvider>
);

export default App;
Enter fullscreen mode Exit fullscreen mode

4. Language Localization

Handling multiple languages in an application can be efficiently managed using the Context API to switch between languages seamlessly.

Example:

// LanguageContext.js
import React, { createContext, useState } from 'react';

export const LanguageContext = createContext();

export const LanguageProvider = ({ children }) => {
    const [language, setLanguage] = useState('en');

    return (
        <LanguageContext.Provider value={{ language, setLanguage }}>
            {children}
        </LanguageContext.Provider>
    );
};

// App.js
import React, { useContext } from 'react';
import { LanguageProvider, LanguageContext } from './LanguageContext';

const LanguageSelector = () => {
    const { language, setLanguage } = useContext(LanguageContext);

    return (
        <select value={language} onChange={(e) => setLanguage(e.target.value)}>
            <option value="en">English</option>
            <option value="es">Spanish</option>
        </select>
    );
};

const App = () => (
    <LanguageProvider>
        <LanguageSelector />
    </LanguageProvider>
);

export default App;
Enter fullscreen mode Exit fullscreen mode

5. Notification System

A global notification system can be implemented using the Context API to manage alerts, messages, and notifications across the application.

Example:

// NotificationContext.js
import React, { createContext, useState } from 'react';

export const NotificationContext = createContext();

export const NotificationProvider = ({ children }) => {
    const [notifications, setNotifications] = useState([]);

    const addNotification = (message) => {
        setNotifications([...notifications, { id: Date.now(), message }]);
    };

    const removeNotification = (id) => {
        setNotifications(notifications.filter(notification => notification.id !== id));
    };

    return (
        <NotificationContext.Provider value={{ notifications, addNotification, removeNotification }}>
            {children}
        </NotificationContext.Provider>
    );
};

// App.js
import React, { useContext } from 'react';
import { NotificationProvider, NotificationContext } from './NotificationContext';

const NotificationList = () => {
    const { notifications, removeNotification } = useContext(NotificationContext);

    return (
        <ul>
            {notifications.map(notification => (
                <li key={notification.id}>
                    {notification.message}
                    <button onClick={() => removeNotification(notification.id)}>Dismiss</button>
                </li>
            ))}
        </ul>
    );
};

const App = () => (
    <NotificationProvider>
        <NotificationList />
    </NotificationProvider>
);

export default App;
Enter fullscreen mode Exit fullscreen mode

Conclusion

The Context API in React JS is a powerful tool to manage state and share data across components without the hassle of prop drilling. From theme management to user authentication, global state management, language localization, and notification systems, the Context API simplifies the development process and makes your code more maintainable.

Top comments (0)