Aula 8

React

Formulários em React

📌

📅 Versão atualizada em 18/06/2025

Nessa versão foram incluídos os seguintes tópicos:

✔️ Como funcionam os Formulários em React

✔️ Gerenciando Inputs com Estado

✔️ Estilizando Formulários com Material UI

Formulários em React são usados para capturar dados do usuário e processá-los. Existem duas formas principais de trabalhar com formulários:

Gerenciando Inputs com Estado

Estados são frequentemente usados em formulários para controlar inputs e manipular dados enviados pelo usuário.

Exemplo 1

Este exemplo mostra como capturar o nome do usuário usando um estado simples em um formulário controlado.


import React, { useState } from "react";

function FormularioControlado() {
  const [nome, setNome] = useState("");

  const handleChange = (e) => {
    setNome(e.target.value);
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    alert(`Olá, ${nome}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Escreva aqui o seu nome:
        <input
          type="text"
          value={nome}
          onChange={handleChange}
        />
      </label>
      <button type="submit">Enviar</button>
    </form>
  );
}

export default FormularioControlado;

  
Exemplo 2

Neste exemplo, capturamos os valores de vários campos (nome e e-mail) usando um estado representado como um objeto.


import React, { useState } from "react";

function FormularioMultiCampos() {
  const [formData, setFormData] = useState({
    nome: "",
    email: ""
  });

  const handleChange = (e) => {
    const { name, value } = e.target; // Extrai o nome e valor do campo
    setFormData({ ...formData, [name]: value }); // Atualiza o campo correspondente no estado
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    alert(`Nome: ${formData.nome}, Email: ${formData.email}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Nome:
        <input
          type="text"
          name="nome"
          value={formData.nome}
          onChange={handleChange}
        />
      </label>
      <br />
      <label>
        Email:
        <input
          type="email"
          name="email"
          value={formData.email}
          onChange={handleChange}
        />
      </label>
      <br />
      <button type="submit">Enviar</button>
    </form>
  );
}

export default FormularioMultiCampos;

  

Benefícios de Formulários Controlados

Trabalhar com formulários controlados em React oferece as seguintes vantagens:

Usando Validadores

Adicione validação para garantir que os dados inseridos pelos usuários atendam aos critérios exigidos.

          
import React, { useState } from 'react';

const FormWithValidation = () => {
  const [formData, setFormData] = useState({ name: '', email: '' });
  const [errors, setErrors] = useState({ name: '', email: '' });

  const validate = () => {
    const newErrors = {};
    if (!formData.name) newErrors.name = 'Nome é obrigatório';
    if (!formData.email) {
      newErrors.email = 'Email é obrigatório';
    } else if (!/\S+@\S+\.\S+/.test(formData.email)) {
      newErrors.email = 'Email inválido';
    }
    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    if (validate()) {
      alert('Formulário enviado!');
    }
  };

  return (
    <form;onSubmit={handleSubmit}>
      <div>
        <label>
          Nome:
          <input
          type="text"
          value={formData.name}
            onChange={(e) =>
              setFormData({ ...formData, name: e.target.value })
              />
              </label>
              {errors.name && <span>{errors.name}</span>}
              </div>
      <div>
      <label>
          Email:
          <input
            type="email"
            value={formData.email}
            onChange={(e) =>
              setFormData({ ...formData, email: e.target.value })
            />
        </label>
        {errors.email && <span>{errors.email}</span>}
      </div>
      <button type="submit">Enviar<button>
    
  );
}

export default FormWithValidation;

Passar Dados de um Formulário para Outro

Use props para passar dados entre componentes pai e filho.

Exemplo:


import React, { useState } from 'react';

const ParentForm = () => {
  const [parentData, setParentData] = useState('');

  return (
    <div>
      <h1>Formulário Pai</h1>
      <ChildForm onFormSubmit={(data) => setParentData(data)} />
      <h2>Dados Recebidos do Filho: {parentData}</h2>
    </div>
  );
}

const ChildForm = ({ onFormSubmit }) => {
  const [childData, setChildData] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    onFormSubmit(childData);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={childData}
        onChange={(e) => setChildData(e.target.value)}
        placeholder="Digite algo"
      />
      <button type="submit">Enviar ao Pai<button>
    
  );
}

export default ParentForm;

    

Como Usar Elementos de Formulários com Material-UI em React

Material-UI (MUI) é uma biblioteca popular de componentes React que segue os princípios de design do Google Material Design. Ela oferece componentes pré-estilizados para criar interfaces modernas e responsivas. Quando se trata de formulários, o MUI fornece componentes como <TextField>, <Checkbox>, e <Select>, tornando mais fácil estilizar e gerenciar elementos de formulário.

Exemplo 1

Este exemplo mostra como criar um campo de texto básico e capturar os dados digitados pelo usuário.


import React, { useState } from "react";
import TextField from "@mui/material/TextField";
import Button from "@mui/material/Button";

function FormularioTexto() {
  const [nome, setNome] = useState("");

  const handleChange = (e) => {
    setNome(e.target.value); // Atualiza o estado com o valor do campo
  };

  const handleSubmit = () => {
    alert(\`Nome enviado: \${nome}\`);
  };

  return (
    <div style={{ display: "flex", flexDirection: "column", gap: "10px", width: "300px" }}>
      <TextField
        label="Nome"
        variant="outlined"
        value={nome}
        onChange={handleChange}
      />
      <Button variant="contained" color="primary" onClick={handleSubmit}>
        Enviar
      </Button>
    </div>
  );
}

export default FormularioTexto;

  
Exemplo 2

Este exemplo demonstra como usar um checkbox e um campo de seleção no Material-UI.


import React, { useState } from "react";
import { FormControl, InputLabel, MenuItem, Select, Checkbox, FormControlLabel, Button } from "@mui/material";

function FormularioSelectCheckbox() {
  const [opcao, setOpcao] = useState("");
  const [aceito, setAceito] = useState(false);

  const handleSelectChange = (e) => {
    setOpcao(e.target.value); // Atualiza a opção selecionada
  };

  const handleCheckboxChange = (e) => {
    setAceito(e.target.checked); // Atualiza o estado do checkbox
  };

  const handleSubmit = () => {
    alert(\`Opção: \${opcao}, Aceito: \${aceito}\`);
  };

  return (
    <div style={{ display: "flex", flexDirection: "column", gap: "15px", width: "300px" }}>
      <FormControl fullWidth>
        <InputLabel>Opções</InputLabel>
        <Select value={opcao} onChange={handleSelectChange}>
          <MenuItem value="opcao1">Opção 1</MenuItem>
          <MenuItem value="opcao2">Opção 2</MenuItem>
          <MenuItem value="opcao3">Opção 3</MenuItem>
        </Select>
      </FormControl>

      <FormControlLabel
        control=<Checkbox checked={aceito} onChange={handleCheckboxChange} />
        label="Aceito os termos"
      />

      <Button variant="contained" color="primary" onClick={handleSubmit}>
        Enviar
      </Button>
    </div>
  );
}

export default FormularioSelectCheckbox;

  

Benefícios do Uso do Material-UI em Formulários

Trabalhar com formulários no Material-UI oferece as seguintes vantagens: