Crie formulários Next.js elegantes com formulário React Hook e interface de material

Material UI (MUI) é uma biblioteca de componentes popular que implementa o sistema Material Design do Google. Ele fornece uma ampla variedade de componentes de UI pré-construídos que você pode usar para criar interfaces funcionais e visualmente atraentes.

Mesmo sendo projetado para React, você pode estender seus recursos para outras estruturas dentro do ecossistema do React, como Next.js.

Primeiros passos com o formulário React Hook e a interface do material

Formulário de gancho de reação é uma biblioteca popular que fornece uma maneira simples e declarativa de criar, gerenciar e validar formulários.

Ao integrar UIs de materiais Componentes e estilos de UI, você pode criar formulários bonitos e fáceis de usar e aplicar um design consistente ao seu aplicativo Next.js.

Para começar, crie um scaffold de um projeto Next.js localmente. Para os fins deste guia, instale a versão mais recente do Next.js que faz uso do diretório App.

 npx create-next-app@latest next-project --app 

A seguir, instale estes pacotes em seu projeto:

 npm install react-hook-form @mui/material @mui/system @emotion/react @emotion/styled 

Aqui está uma prévia do que você construirá:

Você pode encontrar o código deste projeto neste GitHub repositório.

Criação e estilo de formulários

React Hook Form fornece uma variedade de funções utilitárias, incluindo o gancho useForm.

Este gancho agiliza o processo de tratamento do estado do formulário, validação de entrada e envio, simplificando os aspectos fundamentais do gerenciamento de formulários.

Para criar um formulário que utilize esse gancho, adicione o código a seguir a um novo arquivo, src/components/form.js.

Primeiro, adicione as importações necessárias para os pacotes React Hook Form e MUI:

 "use client"
import React, {useState} from 'react';
import { useForm } from 'react-hook-form';
import { TextField, Button as MuiButton, Alert } from '@mui/material';
import { styled } from '@mui/system';

MUI fornece uma coleção de componentes de UI prontos para uso que você pode personalizar ainda mais passando acessórios de estilo.

  Um guia detalhado para campanhas de gotejamento para profissionais de marketing

No entanto, se quiser mais flexibilidade e controle sobre o design da IU, você pode optar por usar o método styled para estilizar seus elementos da IU com propriedades CSS. Nesse caso, você pode definir o estilo dos principais componentes do formulário: o contêiner principal, o próprio formulário e os campos de texto de entrada.

Logo abaixo das importações, adicione este código:

 const FormContainer = styled('div')({
  display: 'flex',
  flexDirection: 'column',
  alignItems: 'center',
  justifyContent: 'center',
  height: '100vh',
});

const StyledForm = styled('form')({
  width: '80%',
  maxWidth: '400px',
  padding: '20px',
  borderRadius: '10px',
  border: '2px solid #1E3A8A',
  boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.2)',
  backgroundColor: '#ffffff',
  textAlign: 'center',
});

const StyledTextField = styled(TextField)({
  marginBottom: '16px',
  width: '100%',
});

Manter uma base de código modular é importante no desenvolvimento. Por esse motivo, em vez de agrupar todo o código em um único arquivo, você deve definir e definir o estilo dos componentes personalizados em arquivos separados.

Dessa forma, você pode importar e usar facilmente esses componentes em diferentes partes do seu aplicativo, tornando seu código mais organizado e de fácil manutenção.

Agora, defina o componente funcional:

 export default function Form() {
  const { register, handleSubmit, formState: { errors } } = useForm();
  
  return (
    <>
      <FormContainer>
        <StyledForm>
          <StyledTextField
            label="Username"
            type="text"
          />
          <StyledTextField
            label="Password"
            type="password"
          />
          <MuiButton
            type="submit"
            variant="contained"
            color="primary"
            margin="5px"
          > Submit </MuiButton>
        </StyledForm>
      </FormContainer>
    </>
  );
}

Por fim, importe este componente em seu arquivo app/page.js. Exclua todo o código Next.js padrão e atualize-o com o seguinte:

 import Form from 'src/components/Form'

export default function Home() {
  return (
    <main >
      <Form />
    </main>
  )
}

Inicie o servidor de desenvolvimento e você verá um formulário básico com dois campos de entrada e um botão de envio em seu navegador.

  Os aplicativos de “segurança” do iPhone realmente fazem alguma coisa?

Lidando com validação de formulário

O formulário parece ótimo, mas ainda não faz nada. Para torná-lo funcional, você precisa adicionar algum código de validação. As funções do utilitário useForm hook serão úteis ao gerenciar e validar as entradas do usuário.

Primeiro, defina a seguinte variável de estado para gerenciar o status atual do formulário, dependendo se um usuário forneceu as credenciais corretas. Adicione este código dentro do componente funcional:

 const [formStatus, setFormStatus] = useState({ success: false, error: '' }); 

Em seguida, crie uma função manipuladora para validar as credenciais. Esta função simulará uma solicitação de API HTTP que normalmente ocorre quando os aplicativos cliente interagem com uma API de autenticação de back-end.

 const onSubmit = (data) => {
    if (data.username === 'testuser' && data.password === 'password123') {
        setFormStatus({ success: true, error: '' });
    } else {
        setFormStatus({ success: false, error: 'Invalid username or password' });
    }
};

Adicione uma função de manipulador de eventos onClick ao componente do botão – passando-o como um suporte – para acionar a função onSubmit quando um usuário clicar no botão enviar.

 onClick={handleSubmit(onSubmit)} 

O valor da variável de estado formStatus é importante porque determinará como você fornecerá feedback ao usuário. Se o usuário inserir as credenciais corretas, você poderá mostrar uma mensagem de sucesso. Se você tivesse outras páginas em seu aplicativo Next.js, poderia redirecioná-las para uma página diferente.

Você também deve fornecer feedback apropriado se as credenciais estiverem erradas. O Material UI oferece um ótimo componente de feedback que você pode usar junto com a técnica de renderização condicional do React para informar o usuário, com base no valor de formStatus.

  5 melhores carteiras de fibra de carbono com tecnologia de bloqueio RFID (edição 2021)

Para fazer isso, adicione o seguinte código logo abaixo da tag de abertura StyledForm.

 {formStatus.success ? (
    <Alert severity="success">Form submitted successfully</Alert>
) : formStatus.error ? (
    <Alert severity="error">{formStatus.error}</Alert>
) : null}

Agora, para capturar e validar a entrada do usuário, você pode usar a função de registro para registrar os campos de entrada do formulário, rastrear seus valores e especificar as regras de validação.

Esta função recebe vários argumentos, incluindo o nome do campo de entrada e um objeto de parâmetros de validação. Este objeto especifica as regras de validação para o campo de entrada, como o padrão específico e o comprimento mínimo.

Vá em frente e inclua o código a seguir como suporte no componente nome de usuário StyledTextField.

 {...register('username', {
    required: 'Username required',
    pattern: {
        value: /^[a-zA-Z0-9_.-]*$/,
        message: 'Invalid characters used'
    },
    minLength: {
        value: 6,
        message: 'Username must be at least 6 characters'
    },
})}

Agora, adicione o seguinte objeto como um suporte no componente de senha StyledTextField.

 {...register('password', {
    required: 'Password required',
    minLength: {
        value: 8,
        message: 'Password must be at least 8 characters'
    },
})}

Adicione o código a seguir abaixo do campo de entrada do nome de usuário para fornecer feedback visual sobre os requisitos de entrada.

Este código irá disparar um alerta com uma mensagem de erro para informar o usuário sobre os requisitos, para garantir que ele corrija quaisquer erros antes de enviar o formulário.

 {errors.username && <Alert severity="error">{errors.username.message}</Alert>} 

Por fim, inclua um código semelhante logo abaixo do campo de texto de entrada da senha:

 {errors.password && <Alert severity="error">{errors.password.message}</Alert>}

Incrível! Com essas mudanças, você deve ter um formulário funcional e visualmente atraente feito com React Hook Form e Material UI.

Aprimore seu desenvolvimento Next.js com bibliotecas do lado do cliente

Material UI e React Hook Form são apenas dois exemplos das muitas bibliotecas excelentes do lado do cliente que você pode usar para acelerar o desenvolvimento de front-end do Next.js.

As bibliotecas do lado do cliente fornecem uma variedade de recursos prontos para produção e componentes pré-construídos que podem ajudá-lo a construir melhores aplicativos front-end com mais rapidez e eficiência.