Skip to main content

Lifting State Up in Component Composition (Live Playground)

In React applications, it's common to have multiple components that need to share and manipulate state. Lifting state up is a technique used to manage shared state by moving the state to the nearest common ancestor of the components that need access to it. In this tutorial, we'll demonstrate how to lift state up in a React application.

Lifting State Up Example

Consider a simple example where we have two sibling components, InputA and InputB, that need to share the state of an input field.

First, let's create the InputA and InputB components without lifting state up:

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

function InputA() {
const [value, setValue] = useState('');

return (
<div>
<label>Input A:</label>
<input value={value} onChange={e => setValue(e.target.value)} />
</div>
);
}

function InputB() {
const [value, setValue] = useState('');

return (
<div>
<label>Input B:</label>
<input value={value} onChange={e => setValue(e.target.value)} />
</div>
);
}

In this example, both InputA and InputB components manage their state independently. To make them share the state, we'll lift the state up to their nearest common ancestor.

Let's create a Parent component and move the state management there:

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

function Parent() {
const [value, setValue] = useState('');

return (
<div>
<h1>Lifting State Up Example</h1>
<InputA value={value} onValueChange={setValue} />
<InputB value={value} onValueChange={setValue} />
</div>
);
}

function InputA(props) {
return (
<div>
<label>Input A:</label>
<input value={props.value} onChange={e => props.onValueChange(e.target.value)} />
</div>
);
}

function InputB(props) {
return (
<div>
<label>Input B:</label>
<input value={props.value} onChange={e => props.onValueChange(e.target.value)} />
</div>
);
}

export default Parent;

In the updated code, we've created a Parent component that manages the shared state. It then passes the state and a callback function (onValueChange) down to both InputA and InputB components as props. This way, InputA and InputB can share and manipulate the state managed by the Parent component.

Live Playground, Try it Yourself

Benefits of Lifting State Up

Lifting state up offers several benefits:

  1. Improved maintainability: By centralizing state management in the nearest common ancestor, you reduce the complexity of managing shared state across multiple components.
  2. Easier debugging: With state managed in one place, it's easier to track and debug state-related issues.
  3. Better performance: Lifting state up can lead to fewer unnecessary re-renders, improving the performance of your application.

Conclusion

Lifting state up is a powerful technique for managing shared state in React applications. By moving state management to the nearest common ancestor, you can improve the maintainability, debuggability, and performance of your React application. In this tutorial, we demonstrated how to lift state up using a simple example with two sibling components sharing state. As your application grows in complexity, this technique will become even more valuable in keeping your codebase organized and efficient.