Förbättra ditt e-postformulär med validering
Att implementera formulärvalidering i React kan vara utmanande, särskilt när man integrerar React Hook Form med andra bibliotek. I den här guiden kommer vi att utforska hur du lägger till React Hook Form och Zod-validering till en befintlig e-postkontaktformulärfunktion.
Genom att följa detta steg-för-steg tillvägagångssätt kommer du att lära dig hur du förbättrar ditt formulärs funktionalitet, vilket säkerställer att ditt kontaktformulär för e-post är robust och pålitligt. Låt oss dyka in i processen och göra din formulärvalidering sömlös.
Kommando | Beskrivning |
---|---|
useForm | En krok som tillhandahålls av React Hook Form för att hantera formulärtillstånd och validering. |
zodResolver | En resolverfunktion för att integrera Zod-schemavalidering med React Hook Form. |
renderToStaticMarkup | En funktion från React DOM Server för att rendera React-komponenter till statiska HTML-strängar. |
nodemailer.createTransport | Skapar ett transportobjekt för att skicka e-post med Nodemailer. |
bodyParser.json | Mellanprogram för att analysera JSON-begäran i Express. |
transporter.sendMail | Funktion för att skicka e-post med det konfigurerade transportobjektet i Nodemailer. |
replyTo | Ett alternativ i Nodemailer för att ställa in svarsadressen för ett e-postmeddelande. |
Implementering av validerings- och e-postfunktioner
Frontend-skriptet integrerar React Hook Form och Zod för formulärvalidering. Kroken useForm hanterar formulärtillstånd och funktionen zodResolver kopplar Zod-validering till formuläret. När formuläret skickas bearbetar funktionen handleSubmit data. Funktionen renderToStaticMarkup konverterar React-komponenterna till statiska HTML-strängar, som sedan används för att generera e-postinnehållet. Denna inställning säkerställer att data valideras innan e-postmeddelandet skickas, vilket ger robust validering på klientsidan.
Backend-skriptet är byggt med Node.js med Express. Mellanvaran bodyParser.json analyserar JSON-begäran, och nodemailer.createTransport konfigurerar e-posttransporttjänsten. När API-slutpunkten träffas skickar funktionen transporter.sendMail e-postmeddelandet med hjälp av de angivna uppgifterna. Alternativet svara till ställer in svarsadressen, vilket säkerställer korrekt e-postkommunikation. Denna kombination av frontend- och backend-skript ger en heltäckande lösning för hantering av formulärinlämning och e-postfunktionalitet med validering.
Integrering av React Hook Form och Zod för e-postvalidering
Frontend: Reagera med React Hook Form och 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;
Ställa in backend för e-postsändning
Backend: Node.js med 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');
});
Integrering av validering på klientsidan och serversidan
För att effektivt hantera formulärvalidering och e-postfunktionalitet är det avgörande att integrera både klient- och server-sidevalidering. Medan validering på klientsidan säkerställer en bättre användarupplevelse genom att ge omedelbar feedback, är validering på serversidan avgörande för att upprätthålla dataintegritet och säkerhet. Genom att använda React Hook Form med Zod på klientsidan kan du definiera scheman och validera användarinmatningar effektivt. Detta tillvägagångssätt förhindrar att ogiltiga data bearbetas och skickas till servern, vilket minimerar fel och förbättrar datakvaliteten.
På serversidan säkerställer användning av Express med mellanprogram som body-parser och Nodemailer att backend säkert kan hantera och bearbeta data. Validering på serversidan fungerar som ett andra försvarsskikt och verifierar att mottagna data överensstämmer med det förväntade formatet och värdena. Denna valideringsstrategi med två lager är robust och omfattande och ger en säker och användarvänlig upplevelse.
Vanliga frågor om att integrera React Hook Form och Zod
- Hur integrerar jag React Hook Form med Zod?
- Använd zodResolver-funktionen från paketet @hookform/resolvers/zod för att koppla Zod-validering med React Hook Form.
- Vad är syftet med renderToStaticMarkup?
- renderToStaticMarkup konverterar React-komponenter till statiska HTML-strängar, som kan användas för e-postinnehåll eller andra statiska HTML-behov.
- Hur kan jag hantera formulärinlämning med React Hook Form?
- Använd funktionen handleSubmit från React Hook Form för att hantera formulärinlämningar och validera data innan du bearbetar den.
- Vad gör nodemailer.createTransport?
- nodemailer.createTransport skapar ett transportobjekt för att skicka e-post med en specificerad tjänst och autentiseringsdetaljer.
- Varför är validering på serversidan viktig?
- Verifiering på serversidan säkerställer att data som tas emot av servern är giltig, upprätthåller dataintegriteten och skyddar mot skadlig indata.
Slutliga tankar om formulärvalidering och inlämning
Att integrera React Hook Form och Zod för formulärvalidering i dina React-applikationer förbättrar dataintegriteten och användarupplevelsen. Genom att kombinera validering på klientsidan med bearbetning på serversidan med Node.js och Express skapar du en robust lösning för hantering av formulärinlämningar. Detta tillvägagångssätt säkerställer att data är korrekt validerade och säkert behandlade, vilket minskar fel och förbättrar tillförlitligheten. Genom att implementera dessa metoder kan du avsevärt förbättra funktionaliteten och säkerheten för dina webbformulär.