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

Obtendo valores dos inputs com e sem onChange

Oi. Vi todas as aulas e decidi criar um site react que serve para cadastrar livros. O App.js é composto de um Menu que é uma lista de itens. De acordo com o item clicado, é exibido o componente Biblioteca, que mostra os livros cadastrados, ou o componente Cadastro, que cadastra um livro a ser exibido na Biblioteca. Vou estar apresentado aqui o componente Cadastro. Eu fiz duas versões. A primeira (submterA), que é mais intuitiva para mim, quando form é submetido, simplesmente cria um objeto com os dados do livro e via props passa esse objeto para o App.js que preenche o vetor de livros com o novo livro recebido:

const Cadastro = (props) => {

  const submter = (evento) => {
    evento.preventDefault();

  const livro = {
      titulo: evento.target[0].value,
  resumo: evento.target[1].value,
  autores: evento.target[2].value,
};
props.getLivros(livro);
  };

  return (
<div>
  <form onSubmit={submter}>
    <label> Título </label>
    <br />
    <input type="text" name="titulo" />
    <br />
    <label> Resumo </label>
    <br />
    <input type="text" name="resumo" />
    <br />
    <label> Autores </label>
    <br />
    <input type="text" name="autores" />
    <br />
    <button> enviar </button>
  </form>
</div>
  );
};

export default Cadastro;

Isso funciona, pois todos os livros cadastrados aparecem na Biblioteca. E quando o usuário muda o texto do input, ele aparece normalmente na tela, indicando que o componente React está sendo redesenhado, certo?

Na segunda forma usei estado, onde as variáveis associadas a cada input são alteradas através do evento onChange. Fiz um teste sem a propriedade value em cada input, e os textos do usuário são desenhados normalmente, o que indica que o componente React está sendo redesenhado também, certo? E os livros cadastrados aparecem na Biblioteca também.

Bom, gostaria de perguntar primeiramente, qual a efetiva diferença entre a versão 1 e 2 para castrar os livros? Pois, ambas funcionam e a segunda, que é orientada da forma como o professor fez na aula, é menos intuitiva (sou novo em React) e quis, por questões de aprendizado, verificar se a minha ideia inicial era válida e funcionava.

Segundo, é necessário (ou obrigatório) usar o a propriedade value nos inputs? Pois, sem eles também funcionou na segunda versão. Algum problema pode ocorrer futuramente se não usarmos ela?

Na terceira versão, que é uma extensão da segunda, eu usei a propriedade value e se retirarmos o onChange, não importa o que o usuário digite, os inputs não mudam mais. Mantendo o onChange, as coisas funcionam normalmente, e os textos são redesenhados. Segue a terceira versão:

import React from "react";

const Cadastro = (props) => {
  const [titulo, setTitulo] = React.useState("");
  const [resumo, setResumo] = React.useState("");
  const [autores, setAutores] = React.useState("");

  const onCadastrarTitulo = (event) => {
setTitulo(event.target.value);
  };

  const onCadastrarResumo = (event) => {
setResumo(event.target.value);
  };

  const onCadastrarAutores = (event) => {
setAutores(event.target.value);
  };

  const submter = (evento) => {
evento.preventDefault();
   const livro = {
  titulo,
  resumo,
  autores,
};

props.getLivros(livro);
  };

  return (
<div>
  <form onSubmit={submter}>
    <label> Título </label>
    <br />
    <input
      type="text"
      name="titulo"
      onChange={onCadastrarTitulo}
      value={titulo}
    />
    <br />
    <label> Resumo </label>
    <br />
    <input type="text" name="resumo" value={resumo} />
    <br />
    <label> Autores </label>
    <br />
    <input
      type="text"
      name="autores"
      onChange={onCadastrarAutores}
      value={autores}
    />
    <br />
    <button> enviar </button>
  </form>
</div>
  );
};

export default Cadastro;

Entendo, de acordo com as aulas, que a terceira versão é a forma profissional de desenvolver em React (usando apenas javascript).

Mas esta tudo bem eu usar a primeira versão?

Obrigado pela atenção!

1 resposta
solução!

Olá Jhonatan! Tudo ok contigo?

Primeiramente, parabéns pela iniciativa de experimentar diferentes abordagens para aprender mais. Isso é muito importante no processo de aprendizado.

Vamos às suas dúvidas:

  1. A principal diferença entre a primeira e a segunda versão é a forma como você está manipulando o estado dos componentes. Na primeira versão, você está pegando os valores dos inputs diretamente do evento de submissão do formulário, enquanto na segunda versão, você está usando o hook useState para criar um estado para cada input e atualizando esses estados com o evento onChange de cada input. Ambas as versões funcionam, mas a segunda é mais comum em aplicações React porque ela permite que você manipule o estado do componente de maneira mais eficiente e reativa.

  2. A propriedade value nos inputs não é obrigatória, mas é recomendada quando você está trabalhando com componentes controlados no React (ou seja, componentes cujo estado é controlado pelo React, como é o caso da segunda e terceira versões do seu componente Cadastro). A propriedade value permite que o React controle o valor exibido no input, o que é útil quando você precisa manipular esse valor de maneira reativa (por exemplo, quando você precisa limpar o input após o formulário ser submetido).

  3. Na terceira versão, quando você remove o evento onChange, os inputs não mudam porque eles se tornam componentes controlados somente leitura. Isso acontece porque o valor exibido nos inputs é controlado pelo React através da propriedade value, e como você removeu o evento onChange, não há mais uma maneira de atualizar o estado que está sendo passado para a propriedade value.

Quanto à sua pergunta final, não há nada de errado em usar a primeira versão, especialmente se você está apenas aprendendo React. No entanto, conforme você começa a construir aplicações mais complexas, você pode achar que a segunda e terceira versões oferecem mais controle e flexibilidade.

Era isso, se precisar eu estarei por aqui.

Espero ter ajudado!

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor marque ele como solução! ✓