Formulário em React com validação acessível (React Hook Form + Zod)
Gere um formulário React com esquema de validação, mensagens de erro acessíveis, envio seguro, erros do servidor por campo e uma lista de testes para o verificar. Pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Inclui 5 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.
Intermédio · Código · Pendente de revisão editorial
Prompt
Atua como programador frontend sénior especializado em formulários acessíveis e validação robusta em React.
Contexto:
- Campos e regras: {{campos}}
- O que acontece ao enviar: {{envio}}
- Biblioteca: {{biblioteca}}
- Estilos: {{estilos}}
- Idioma das mensagens de erro: {{idioma_mensagens}}
Se faltar algo importante (formato de erro do servidor, campos opcionais, regras condicionais), pergunta-me antes de escreveres código.
Entregáveis:
1. O esquema de validação tipado (com {{biblioteca}}), com mensagens claras que expliquem como corrigir o erro, e como reutilizá-lo no servidor.
2. O componente do formulário em TypeScript: etiquetas visíveis associadas a cada campo, `aria-invalid`, `aria-describedby` para a mensagem de erro e o texto de ajuda, e foco no primeiro campo com erro ao enviar.
3. Momento de validação sensato: sem erros enquanto o utilizador ainda não saiu do campo e revalidação enquanto corrige.
4. Estado de envio: botão desativado ou com indicador, prevenção de duplo envio e mensagem de sucesso anunciada numa região `aria-live`.
5. Erros do servidor: como associá-los ao campo certo ou mostrá-los como erro geral.
6. Uma lista de casos de teste (manuais ou automáticos), incluindo uso só com teclado e leitor de ecrã.
Restrições:
- A validação no cliente é conveniência, não segurança: lembra-o e indica o que validar sempre no servidor.
- Nunca registes dados pessoais nem palavras-passe na consola.
- Não inventes endpoints: usa [PREENCHER] se não os indiquei.
- Usa os atributos `autocomplete` e `inputmode` adequados.
Formato: um bloco de código por ficheiro com o respetivo nome e uma breve explicação de cada decisão.Como utilizar
- Enumera os campos com as regras reais (obrigatório, comprimento, formato). 2. Indica que endpoint ou Server Action recebe os dados. 3. Cola o código, testa o formulário só com o teclado e pede ajustes concretos.
Exemplo de utilização
Campos: nome (obrigatório), email (válido), telefone (opcional, formato português), mensagem (20-1000 caracteres) · Envio: POST /api/contacto · Biblioteca: React Hook Form + Zod · Estilos: Tailwind CSS.
Exemplo de resultado
1. Esquema partilhado (contactoSchema.ts)
import { z } from 'zod';
const telefonePT = /^(?:\+351\s?)?[29]\d{2}\s?\d{3}\s?\d{3}$/;
export const contactoSchema = z.object({
nome: z.string().trim().min(1, 'Escreva o seu nome'),
email: z.string().trim().email('Escreva um email válido, por exemplo nome@dominio.pt'),
telefone: z
.string()
.trim()
.regex(telefonePT, 'Escreva um número português de 9 dígitos, por exemplo 912 345 678')
.or(z.literal('')),
mensagem: z
.string()
.trim()
.min(20, 'A mensagem deve ter pelo menos 20 caracteres')
.max(1000, 'A mensagem não pode ultrapassar os 1000 caracteres'),
privacidade: z.literal(true, {
errorMap: () => ({ message: 'Tem de aceitar a política de privacidade para continuar' }),
}),
});
export type ContactoInput = z.infer<typeof contactoSchema>;
Este mesmo esquema é importado em /api/contacto com contactoSchema.safeParse(body): a validação no cliente é conveniência, a do servidor é a que protege. No formulário usa-se zodResolver(contactoSchema) com mode: 'onTouched', e cada campo leva aria-invalid e aria-describedby a apontar para o respetivo erro…
Dados-chave
- Categoria
- Programação e desenvolvimento · React
- Tipo de resultado
- Código
- Nível
- Intermédio
- Pensado para
- ChatGPT, Claude, Gemini e Microsoft Copilot
- Verificado em
- Pendente de verificação editorial
- Variáveis
- Campos e regras, O que acontece ao enviar, Biblioteca, Estilos e Idioma das mensagens
- Idioma
- Português
- Preço
- Gratuito, sem registo
- Atualizado
- 07/11/2026
Perguntas frequentes
Porquê validar no servidor se já valido no navegador?
Porque qualquer pessoa pode contornar o navegador e enviar dados diretamente para a tua API. A validação no cliente melhora a experiência; a do servidor protege os dados.
O que torna uma mensagem de erro acessível?
Estar ligada ao campo com aria-describedby, o campo ter aria-invalid, o texto explicar como corrigir e o foco ir para o primeiro erro ao enviar.
Posso usá-lo sem React Hook Form?
Sim. Escolhe outra biblioteca ou «sem biblioteca» na variável e o prompt adapta o esquema e a gestão do estado.
Para que serve este prompt?
Gere um formulário React com esquema de validação, mensagens de erro acessíveis, envio seguro, erros do servidor por campo e uma lista de testes para o verificar.
Com que ferramentas de IA funciona?
Foi pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.
Como personalizo o prompt?
Clique em “Personalizar” e preencha as variáveis (Campos e regras, O que acontece ao enviar, Biblioteca, Estilos e Idioma das mensagens). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.
Preciso de experiência para o utilizar?
É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.
Este prompt é gratuito?
Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.
Posso confiar no resultado da IA?
Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.