Skip to content

Instantly share code, notes, and snippets.

@halitbatur
Created June 10, 2024 06:57
Show Gist options
  • Save halitbatur/57a1724f564a8ce2ca92873f6261e87c to your computer and use it in GitHub Desktop.
Save halitbatur/57a1724f564a8ce2ca92873f6261e87c to your computer and use it in GitHub Desktop.
Context API and state management discussion
  1. What is React.useContext, and how does it differ from traditional prop drilling?
  2. What are some common use cases for React.useContext, and when might you prefer to use it over other state management solutions like Redux or MobX?
  3. How do you create and consume a Context in a React application? Can you walk through a basic example?
  4. What are the limitations of using React.useContext for state management? How do these limitations compare to other tools like Redux or Zustand?
  5. In what situations might it be beneficial to combine React.useContext with other state management libraries? Provide an example scenario.
@Vuyo-Ngwane
Copy link

Vuyo
Konanani
Ntokozo

1.) React.useContext is a hook that allows you to access and consume context values in your functional components. Ease of Access:
Prop Drilling: Requires passing props through every level of the component tree, which can be cumbersome and error-prone.
useContext: Allows direct access to the context value without passing props through intermediate components.

2.) Can be used to pass down a theme to various components without using props. Manages user authentication state and provides user information to various components.

3.) // MyContext.js
import React, { createContext } from 'react';

// Create a context
const MyContext = createContext();

export default MyContext;

import React, { useContext } from 'react';
import MyContext from './MyContext'; // Import the context

function ChildComponent() {
const value = useContext(MyContext);

return

{value}
;
}

export default ChildComponent;

4.) Some of the limitations include React.useContext not having middleware, thus some of the functions have to be performed manually. useContext is limited to sharing state between components that are siblings or ancestors in the component tree. It does not provide a centralized store for managing global state across the entire application.

5.) When working on large scale applications it becomes more effective, e.g. combined tools such as Redux van be utilised for managing the global application state. It can also be used to manage the local UI State. Examples include an e-commerce application global State (Manage user authentication, cart items, and other global states that need to be accessed and updated across the entire application).We can use LocalStorage to Manage theme settings (e.g., light/dark mode) that are only relevant to specific parts of the application, such as a settings page or a specific component tree.

@thabiso-makolana
Copy link

Thabiso
Siyabonga

  1. is a hook in React that allows components to subscribe to context changes. Context provides a way to pass data through the component tree without having to pass props down manually at every level.
  2. Common Use Cases for React.useContext
  • Theme Management: Switching between light and dark themes across the application.
  • Localization: Providing localization data and functions to translate strings

When to Use React.useContext Over Redux or MobX:

  • Simplicity: For small to medium-sized applications where the complexity of Redux or MobX is unnecessary.
  • Component-Specific State: When the state is only relevant to a specific part of the component tree.
  • Avoiding Boilerplate: When you want to avoid the boilerplate code associated with Redux or MobX.
  1. Create a Context:
    `import React, { createContext, useContext, useState } from 'react';

const MyContext = createContext();

const MyProvider = ({ children }) => {
const [value, setValue] = useState('Hello World');
return (
<MyContext.Provider value={{ value, setValue }}>
{children}
</MyContext.Provider>
);
};
`

Consume the Context:
`const MyComponent = () => {
const { value, setValue } = useContext(MyContext);

return (


{value}


<button onClick={() => setValue('Hello React')}>Change Value

);
};

// Using the provider and component in an application
const App = () => (



);

export default App;
`
4. Limitations of React.useContext:

  • Performance: Re-rendering all consumers when the context value changes can lead to performance issues.
  • Debugging: Limited debugging tools compared to Redux, which has extensive middleware and developer tools.

Comparison with Redux and Zustand:

  • Redux: Provides more control over state changes and is better suited for large-scale applications with complex state interactions. Redux's middleware ecosystem and dev tools make it more powerful for debugging and managing side effects.
  • Zustand: More lightweight than Redux, but offers more performance and control compared to useContext. It provides fine-grained reactivity, meaning only components that depend on a piece of state will re-render when that state changes.
  1. Scenario:
    Imagine you have a large e-commerce application. You use Redux to manage the global state, such as the shopping cart, user authentication, and product listings, because it provides robust state management and debugging tools. However, you have a feature for toggling the UI theme (light/dark mode) that doesn't need to interact with the global state and is better suited for context.

@PamelaGwala
Copy link

@Tumelo2748
@katleho Mafalela

1)is a hook in React that allows you to access the context API more conveniently. It enables you to share state and other values across a component tree without having to pass props down manually at every level, a process known as "prop drilling."
2)UseContext can used in a situation like an app that has different themes like dark mode and light mode so in this case a useContext will be useful. We prefer React.useContext over Redux or MobX when it comes to simplicity and minimalism, performance consideration and smaller applications.
3)
import React, { createContext, useState, useContext } from 'react';
import ReactDOM from 'react-dom';

// 1. Create a Context
const ThemeContext = createContext();

// 2. Create a Provider Component
const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light');
const toggleTheme = () => setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));

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

// 3. Consume the Context in a Component
const ThemedComponent = () => {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
<div style={{ background: theme === 'light' ? '#fff' : '#333', color: theme === 'light' ? '#000' : '#fff', padding: '20px' }}>

Current theme: {theme}


Toggle Theme

);
};

// Wrap your application with the Provider
const App = () => (



);

ReactDOM.render(, document.getElementById('root'));

  • first we creating the Context: ThemeContext is created using createContext().
  • Provider Component: ThemeProvider manages the theme state and provides it to its children via the ThemeContext.Provider.
  • Consuming the Context: ThemedComponent uses useContext(ThemeContext) to access the theme and a function to toggle it.
    Wrapping the Application: The App component wraps its children with ThemeProvider to provide theme context to the entire application.

4)React.useContext is a convenient way to manage state within a React application, but it comes with limitations compared to specialized state management libraries like Redux or Zustand. While it simplifies state management and reduces boilerplate, it may lead to performance issues, especially in large applications with frequent state updates. Additionally, managing complex state and debugging can be more challenging with React.useContext compared to Redux, which offers a structured approach and advanced tooling. Zustand provides a middle ground with simpler API and better performance optimizations, making it suitable for applications that require more advanced state management than React.useContext but do not need the full complexity of Redux. Ultimately, the choice between these tools depends on the specific needs and complexity of your application.

5)Combining React.useContext with Redux or other state management libraries allows for a flexible approach to managing different aspects of state in a React application. By leveraging the lightweight simplicity of React.useContext for localized state needs, such as theme preferences, alongside the robustness of Redux for complex state management tasks like user authentication, developers can achieve a well-structured and efficient state management solution tailored to the specific requirements of their application.

@Gracepinkie
Copy link

@Geraldmutsw
@Gracepinkie(sinethemba),
Lethukuthula

1.useContext is a react hook that allows functional components to access data from a react context without explicitly passing props through every level of the component tree. this helps avoid prop drilling, which can become cumbersome and error-prone in deeply nested component hierarchies.

  1. Use Cases for React.useContext : useContext is ideal for sharing data across multiple components without the need for prop drilling and When you only need to access a specific context value within a subtree, useContext is concise and efficient.
    .When to Prefer useContext Over Redux or MobX: If your state management needs are small or local (e.g., a few components sharing a theme), useContext is lightweight and straightforward and useContext reduces boilerplate and makes your code cleaner.

3.to create a context you use React.createContext() to create a context object. first you import create context "import React, {createContext} from 'react'" then declare the variable that will hold the created context "const ThemeContext = createContext({theme: 'light'})" then after we export the function "export default ThemeContext".

.To consume the context you will firstly wrap for example my parent component with a provider component to enable the child components to have access to the context. first you call in the useContext hook and pass in the created context as the parameter/argument "const {them, setTheme} = useContext(ThemeContext)" then call whatever that is in the context like return(<div style{{backgroundColor: theme}})>

4.Context is useful for smaller state operations, such as passing data between sibling components. It's also great for reducing prop drilling and making your code cleaner. However, it should not be used for global state, modular-level state, or app state.

  1. Scenario :an e-commerce application built with Redux for managing product data, shopping cart, and user authentication. You might use useContext to manage a separate state for UI themes (light/dark mode) that needs to be accessed by various components throughout the app. This way, you leverage Redux for complex state like product inventory, while keeping theme management simpler with useContext.

@PhamelaMhlaba
Copy link

Team Members(Phamela and Mpho)
Answers.

1 . React.useContext is a hook that allows components to access context values directly, avoiding the need to pass props through multiple levels of the component tree.

Differences from Prop Drilling:

  • Simplifies Component Structure: No need to pass props through every level.
  • Direct Access: Components can access context values directly.
  • Reduces Coupling: Easier to manage and refactor.
  1. Common Use Cases for `React.useContext:
  • Theming: Managing light/dark mode or custom themes.
  • Localization: Handling language preferences.
  • User Authentication: Accessing user info and authentication state.
  • Global State: Sharing non-complex global data like UI state.

When to Prefer useContext Over Redux or MobX:

  • Simplicity: For small to medium-sized apps with less complex state.
  • Minimal Setup: Avoiding the boilerplate and configuration of Redux/MobX.
  • Performance: When the app doesn’t require advanced state management features like middleware or time-travel debugging.
  1. Create Context: React.createContext() sets up the context.
    const MyContext = React.createContext();

    Provide Context: Use <Context.Provider> to supply value.
    const MyProvider = ({ children }) => {
    const value = { /* shared state or value */ };
    return (
    <MyContext.Provider value={value}>
    {children}
    </MyContext.Provider>
    );
    };

    Consume Context: Use useContext(Context) to access value.
    const MyComponent = () => {
    const contextValue = useContext(MyContext);
    return (

    {/* use contextValue here */}

);
};

  1. Limitations of `React.useContext:
  • Re-renders: All consuming components re-render on value change.
  • Scalability: Harder to manage complex state logic.
  • Debugging: Fewer tools for tracking state changes.
  • Middleware: No built-in support for side effects.

Compared to Redux or Zustand:

  • Redux: Redux is great at handling complicated state, has useful tools for developers, but needs more initial setup.
  • Zustand: Zustand has an easy-to-use interface, makes your app faster when updating, requires less initial setup, and doesn't come with as many extra tools as Redux.

React.useContext is best for simple state needs; use Redux or Zustand for more complex state management.

  1. Combining React.useContext with state management libraries is useful for optimizing performance and separating concerns.

Example:

  • Redux: Handles global state like user authentication.
  • useContext: Manages local UI state like themes.

@NonhlanhlaMazibuko
Copy link

Nonhlanhla Mazibuko, Hophney Lentsoana and Nhlanhla Msibi

  1. useContext is a React hook that provides a way to access context values directly within a functional component.
    It eliminates the need for prop drilling, making your component hierarchy cleaner and easier to manage.

  2. Common use cases of useContext can be Theme management; we can create a ThemeContext to manage light and dark themes across the web page. We can also use useContext to manage and provide authentication across your application. useContext combined with other React hooks like useState can be more efficient when we are working on a small-scale applications or when managing applications that have non-complex states or state management is only required for a few components only).

  3. We create a context using React.createContext(). we use the UserContext.Provider to wrap the component tree that needs access to the user context and we then we use the useContext hook to access the context value.

  4. useContext provides a single context value to all consuming components. This means that any change in the context value will trigger a re-render in all consuming components, even if the component only needs a subset of the context data. This can lead to unnecessary re-renders and degraded performance, especially in large applications. In Redux, connect or useSelector can be used to map specific pieces of state to components, reducing unnecessary re-renders. Zustand uses a subscription-based approach where components only re-render when the specific parts of the state they depend on change.

  • It can be harder to trace and debug state updates since the context API abstracts away some of the explicit state management.
  • For managing global state, using useContext can become cumbersome as your application grows. You may need to create multiple contexts for different parts of the state, leading to increased complexity in managing and providing these contexts. Redux provides a more structured and predictable approach to state management with actions, reducers, and a centralized store. This structure is beneficial for large applications with complex state interactions. Zustand offers a more flexible and straightforward API for managing state with minimal boilerplate, which can be easier to use than Redux for moderate complexity.
  1. useContext is great for simple app-wide data. For complex state or multiple stores, consider Redux + useContext. Example: Redux manages product data, useContext holds user theme preference.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment