No React, formulários funcionam de maneira semelhante ao HTML tradicional, mas com algumas diferenças importantes devido ao conceito de estado e eventos controlados. Em vez de apenas enviar dados ao servidor ao submeter o formulário, o React mantém os valores dos campos de entrada sincronizados com o estado do componente. Isso é feito através de formulários controlados e não controlados.

1. Formulários Controlados

Em formulários controlados, o estado do React mantém os valores dos campos. Isso significa que o valor de cada campo é controlado por uma variável no estado do componente, permitindo controle total sobre o que é exibido e processado.

Exemplo de Formulário Controlado com useState

Aqui está um exemplo de um formulário de login que usa o estado para controlar os valores dos campos:

import React, { useState } from 'react';

function FormularioLogin() {
  const [email, setEmail] = useState('');
  const [senha, setSenha] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    console.log('Email:', email);
    console.log('Senha:', senha);
    // Processar o login
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Email:
        <input
          type="email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
        />
      </label>
      <label>
        Senha:
        <input
          type="password"
          value={senha}
          onChange={(e) => setSenha(e.target.value)}
        />
      </label>
      <button type="submit">Entrar</button>
    </form>
  );
}

export default FormularioLogin;

Neste exemplo:

Vantagens dos Formulários Controlados

2. Formulários Não Controlados

Em formulários não controlados, os valores dos campos não são armazenados no estado, mas diretamente nos elementos do DOM. O React pode acessar o valor do campo diretamente com uma referência (ref) apenas quando necessário.

Exemplo de Formulário Não Controlado com useRef

Aqui está um exemplo de formulário de login usando o useRef para acessar os valores:

import React, { useRef } from 'react';

function FormularioLogin() {
  const emailRef = useRef();
  const senhaRef = useRef();

  const handleSubmit = (e) => {
    e.preventDefault();
    console.log('Email:', emailRef.current.value);
    console.log('Senha:', senhaRef.current.value);
    // Processar o login
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Email:
        <input type="email" ref={emailRef} />
      </label>
      <label>
        Senha:
        <input type="password" ref={senhaRef} />
      </label>
      <button type="submit">Entrar</button>
    </form>
  );
}

export default FormularioLogin;

Neste exemplo:

Vantagens dos Formulários Não Controlados

3. Escolhendo entre Formulários Controlados e Não Controlados

4. Exemplos de Validação em Formulários Controlados

Para adicionar validações, use o estado para verificar condições e exibir mensagens conforme necessário:

const handleEmailChange = (e) => {
  setEmail(e.target.value);
  if (!e.target.value.includes('@')) {
    setErroEmail('Email inválido');
  } else {
    setErroEmail('');
  }
};

React facilita a criação de formulários altamente dinâmicos, onde a experiência do usuário é controlada diretamente pelo estado do aplicativo.