Aprimore seu formulário de e-mail com validação
Implementar a validação de formulário no React pode ser desafiador, especialmente ao integrar o React Hook Form com outras bibliotecas. Neste guia, exploraremos como adicionar React Hook Form e validação Zod a uma função de formulário de contato de e-mail existente.
Seguindo esta abordagem passo a passo, você aprenderá como aprimorar a funcionalidade do seu formulário, garantindo que seu formulário de contato por e-mail seja robusto e confiável. Vamos mergulhar no processo e tornar a validação do seu formulário perfeita.
Comando | Descrição |
---|---|
useForm | Um gancho fornecido pelo React Hook Form para lidar com o estado e a validação do formulário. |
zodResolver | Uma função de resolução para integrar a validação do esquema Zod com React Hook Form. |
renderToStaticMarkup | Uma função do React DOM Server para renderizar componentes do React em strings HTML estáticas. |
nodemailer.createTransport | Cria um objeto de transporte para enviar emails usando Nodemailer. |
bodyParser.json | Middleware para analisar corpos de solicitação JSON no Express. |
transporter.sendMail | Função para enviar emails utilizando o objeto de transporte configurado no Nodemailer. |
replyTo | Uma opção no Nodemailer para definir o endereço de resposta de um email. |
Implementando Validação e Funcionalidade de Email
O script frontend integra React Hook Form e Zod para validação de formulário. O gancho useForm lida com o estado do formulário e a função zodResolver conecta a validação do Zod ao formulário. Quando o formulário é enviado, a função handleSubmit processa os dados. A função renderToStaticMarkup converte os componentes React em strings HTML estáticas, que são então usadas para gerar o conteúdo do email. Essa configuração garante que os dados sejam validados antes do envio do e-mail, fornecendo uma validação robusta do lado do cliente.
O script de back-end é criado usando Node.js com Express. O middleware bodyParser.json analisa corpos de solicitação JSON e nodemailer.createTransport configura o serviço de transporte de e-mail. Quando o endpoint da API é atingido, a função transporter.sendMail envia o e-mail usando os detalhes fornecidos. A opção replyTo define o endereço de resposta, garantindo a comunicação adequada por e-mail. Essa combinação de scripts de front-end e back-end fornece uma solução abrangente para lidar com envio de formulários e funcionalidade de e-mail com validação.
Integrando React Hook Form e Zod para validação de email
Frontend: Reaja com React Hook Form e Zod
import React from 'react';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import * as z from 'zod';
const schema = z.object({
fullName: z.string().min(1, "Full Name is required"),
senderEmail: z.string().email("Invalid email address"),
phone: z.string().min(10, "Phone number is too short"),
message: z.string().min(1, "Message is required"),
});
const ContactForm = () => {
const { register, handleSubmit, formState: { errors } } = useForm({
resolver: zodResolver(schema)
});
const onSubmit = async (data) => {
const finalHtml = renderToStaticMarkup(
<ContactFormEmail message={data.message} senderEmail={data.senderEmail} />
);
const finalText = renderToStaticMarkup(
<ContactFormEmail message={data.message} senderEmail={data.senderEmail} />
);
try {
const res = await fetch('/api/sendEmail.json', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
from: 'john@doe.com',
to: 'john@doe.com',
subject: 'New message from contact form',
reply_to: data.senderEmail,
html: finalHtml,
text: finalText
})
});
} catch (error) {
setError('root', { message: error.response.data.message });
}
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('fullName')} placeholder="Full Name" />
{errors.fullName && <p>{errors.fullName.message}</p>}
<input {...register('senderEmail')} placeholder="Email" />
{errors.senderEmail && <p>{errors.senderEmail.message}</p>}
<input {...register('phone')} placeholder="Phone" />
{errors.phone && <p>{errors.phone.message}</p>}
<textarea {...register('message')} placeholder="Message" />
{errors.message && <p>{errors.message.message}</p>}
<button type="submit">Send</button>
</form>
);
};
export default ContactForm;
Configurando o back-end para envio de e-mail
Back-end: Node.js com Express
const express = require('express');
const nodemailer = require('nodemailer');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'your-email@gmail.com',
pass: 'your-password'
}
});
app.post('/api/sendEmail.json', (req, res) => {
const { from, to, subject, reply_to, html, text } = req.body;
const mailOptions = {
from, to, subject, replyTo: reply_to, html, text
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return res.status(500).send({ message: error.message });
}
res.status(200).send({ message: 'Email sent successfully' });
});
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
Integrando validação do lado do cliente e do lado do servidor
Para lidar com eficácia com a validação de formulários e a funcionalidade de e-mail, é crucial integrar a validação do lado do cliente e do lado do servidor. Embora a validação do lado do cliente garanta uma melhor experiência do usuário ao fornecer feedback imediato, a validação do lado do servidor é essencial para manter a integridade e a segurança dos dados. Usar o React Hook Form com Zod no lado do cliente permite definir esquemas e validar entradas do usuário com eficiência. Essa abordagem evita que dados inválidos sejam processados e enviados ao servidor, minimizando erros e melhorando a qualidade dos dados.
No lado do servidor, usar o Express com middleware como body-parser e Nodemailer garante que o back-end possa manipular e processar os dados com segurança. A validação do lado do servidor atua como uma segunda camada de defesa, verificando se os dados recebidos estão em conformidade com o formato e os valores esperados. Esta estratégia de validação de camada dupla é robusta e abrangente, proporcionando uma experiência segura e fácil de usar.
Perguntas frequentes sobre a integração do React Hook Form e Zod
- Como faço para integrar o React Hook Form com o Zod?
- Use a função zodResolver do pacote @hookform/resolvers/zod para conectar a validação do Zod com o React Hook Form.
- Qual é o propósito de renderToStaticMarkup?
- renderToStaticMarkup converte componentes React em strings HTML estáticas, que podem ser usadas para conteúdo de e-mail ou outras necessidades de HTML estático.
- Como posso lidar com o envio de formulários com React Hook Form?
- Use a função handleSubmit do React Hook Form para gerenciar envios de formulários e validar dados antes de processá-los.
- O que nodemailer.createTransport faz?
- nodemailer.createTransport cria um objeto de transporte para enviar e-mails usando um serviço especificado e detalhes de autenticação.
- Por que a validação do lado do servidor é importante?
- A validação no lado do servidor garante que os dados recebidos pelo servidor sejam válidos, mantendo a integridade dos dados e protegendo contra entradas maliciosas.
Considerações finais sobre validação e envio de formulários
A integração do React Hook Form e Zod para validação de formulário em seus aplicativos React melhora a integridade dos dados e a experiência do usuário. Ao combinar a validação do lado do cliente com o processamento do lado do servidor usando Node.js e Express, você cria uma solução robusta para lidar com envios de formulários. Essa abordagem garante que os dados sejam devidamente validados e processados com segurança, reduzindo erros e melhorando a confiabilidade. A implementação dessas práticas pode melhorar significativamente a funcionalidade e a segurança dos seus formulários web.