Lift State Up


No React, “lift state up” é uma técnica para compartilhar o estado entre componentes que não têm uma relação direta de pai e filho.

A ideia básica é mover o estado compartilhado para o componente pai mais próximo que encapsula ambos os componentes irmãos. Isso permite que o componente pai gerencie o estado e passe-o para seus filhos como props.

Claro! Vamos explorar o conceito de “lift state up” em React, começando com uma abordagem simples e depois detalhando os aspectos técnicos.

Exemplo em React

Imagine que você tem dois componentes irmãos, ComponenteA e ComponenteB, que precisam compartilhar uma informação, como uma contagem. Inicialmente, cada um pode ter seu próprio estado local:

function ComponenteA() {
  const [count, setCount] = React.useState(0);
 
  return (
    <div>
      <p>Contagem em A: {count}</p>
      <button onClick={() => setCount(count + 1)}>Incrementar A</button>
    </div>
  );
}
 
function ComponenteB() {
  const [count, setCount] = React.useState(0);
 
  return (
    <div>
      <p>Contagem em B: {count}</p>
      <button onClick={() => setCount(count + 1)}>Incrementar B</button>
    </div>
  );
}

Aqui, ComponenteA e ComponenteB gerenciam sua própria contagem. Se você quiser que ambos os componentes sincronizem suas contagens, você precisa “elevar” o estado para o componente pai em comum.

Para compartilhar o estado, você move a lógica de estado para um componente pai comum:

function ComponentePai() {
  const [count, setCount] = React.useState(0);
 
  return (
    <div>
      <ComponenteA count={count} setCount={setCount} />
      <ComponenteB count={count} setCount={setCount} />
    </div>
  );
}
 
function ComponenteA({ count, setCount }) {
  return (
    <div>
      <p>Contagem em A: {count}</p>
      <button onClick={() => setCount(count + 1)}>Incrementar A</button>
    </div>
  );
}
 
function ComponenteB({ count, setCount }) {
  return (
    <div>
      <p>Contagem em B: {count}</p>
      <button onClick={() => setCount(count + 1)}>Incrementar B</button>
    </div>
  );
}

Referências


https://youtu.be/6JnkwfrAI-U?si=h04zCkL-qyAzBwVO