Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como fazer o equivalente ao appendChild no React?

Eu preciso renderizar na tela um componente que é um modal, logo após o envio de um formulário. Até funciona com o código abaixo:

  .then(() => {
                  ReactDOM.render(<CadastroEfetuado/>, document.getElementById('__next'));
                })

Porém eu perco todo o HTML presente no elemento com o id __ next . Como posso renderizar o componente sem perder tudo que ja foi renderizado antes?

1 resposta
solução!

Uma sugestão seria utilizar um estado para decidir quando o componente CadastroEfetuado seria renderizado. Assim, o valor desse estado seria inicialmente falso, e quando a sua promise do cadastro for resolvida, você alteraria o estado para verdadeiro:

function SeuComponente() {
  // Estado iniciado como falso
  const [cadastroFeito, setCadastroFeito] = useState(false);

  function handleClick() {
    // Sua Promise (o conteúdo da promise que eu escrevi não importa)
    new Promise((resolve) => {
      resolve(true);
    }).then(() => {
      // Altera o estado para verdadeiro
      setCadastroFeito(true);
    });
  }

  return (
    <div>
      {/* Seu conteúdo */}

      <button onClick={handleClick}>Cadastrar-se</button>

      {/* Se o valor de cadastroFeito for verdadeiro,
      ele irá renderizar o componente */}
      {cadastroFeito && <CadastroEfetuado />}
    </div>
  );
}

Agora, levando mais em consideração a sua pergunta do que seu exemplo, outro cenário que você poderia encontrar seria o de querer usar appendChild para vários elementos baseado numa lista de informações. Um meio de fazer isso seria usando um map:

function SeuComponente() {
  const [estados, setEstados] = useState([]);

  function handleClick() {
    new Promise((resolve) => {
      resolve(["Minas Gerais", "Rio Grande do Sul", "São Paulo"]);
    }).then((dados) => {
      setEstados(dados);
    });
  }

  return (
    <div>
      <button onClick={handleClick}>Exibir estados</button>
      <ul>
        {/* Como a lista inicia vazia, nada será renderizado,
        mas, assim que o botão ser clicado e a promise resolver,
        a lista será renderizada*/}
        {estados.map((estado) => (
          <li>{estado}</li>
        ))}
      </ul>
    </div>
  );
}