//
Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Tipifique corretamente os manipuladores de eventos do React para cliques, envios de formulário, alterações de entrada, eventos de teclado e callbacks de eventos personalizados. Use os tipos de evento sintético do React para segurança de tipo completa.
// Evento de clique
function handleClick(event: React.MouseEvent<HTMLButtonElement>) {
console.log("Botão clicado em", event.clientX, event.clientY);
}
// Evento de envio de formulário
function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
event.preventDefault();
const formData = new FormData(event.currentTarget);
const email = formData.get("email") as string;
console.log("Enviado:", email);
}
// Evento de alteração de entrada
function handleChange(event: React.ChangeEvent<HTMLInputElement>) {
console.log("Valor:", event.target.value);
}
// Evento de teclado
function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {
if (event.key === "Enter") {
console.log("Enter pressionado");
}
}// Componente de formulário completo
function LoginForm() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
console.log({ email, password });
};
return (
<form onSubmit={handleSubmit}>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
onKeyDown={(e) => {
if (e.key === "Escape") setEmail("");
}}
/>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit">Log In</button>
</form>
);
}SyntheticEvent. O TypeScript fornece tipos de evento genéricos como React.MouseEvent<T>, onde T é o tipo do elemento HTML.event.target é tipado como EventTarget, que é amplo. Use event.currentTarget para o elemento ao qual o manipulador está anexado -- ele é tipado como o parâmetro genérico (HTMLButtonElement, HTMLInputElement, etc.).onChange={(e) => ...}), o TypeScript infere o tipo do evento automaticamente do atributo JSX.Select e textarea:
function handleSelectChange(event: React.ChangeEvent<HTMLSelectElement>) {
console.log("Selecionado:", event.target.value);
}
function handleTextareaChange(event: React.ChangeEvent<HTMLTextAreaElement>) {
console.log("Texto:", event.target.value);
}Eventos de arrastar:
function handleDragStart(event: React.DragEvent<HTMLDivElement>) {
event.dataTransfer.setData("text/plain", "arrastado");
}Eventos de foco:
function handleFocus(event: React.FocusEvent<HTMLInputElement>) {
event.currentTarget.select();
}Props de callback de evento personalizadas:
type SearchBarProps = {
onSearch: (query: string) => void;
onClear?: () => void;
};
function SearchBar({ onSearch, onClear }: SearchBarProps) {
const [query, setQuery] = useState("");
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
onSearch(query);
};
return (
<form onSubmit={handleSubmit}>
<input value={query} onChange={(e) => setQuery(e.target.value)} />
<button type="submit">Pesquisar</button>
{onClear && <button type="button" onClick={onClear}>Limpar</button>}
</form>
);
}React.MouseEvent, React.ChangeEvent, React.FormEvent, React.KeyboardEvent, React.FocusEvent, React.DragEvent, React.TouchEvent, React.WheelEvent.currentTarget. Por exemplo, React.MouseEvent<HTMLAnchorElement> dá a currentTarget o tipo HTMLAnchorElement.React.SyntheticEvent é o tipo base para todos os eventos do React. Use-o quando não se importar com o tipo específico do evento.event.target vs event.currentTarget: target é o elemento que disparou o evento (pode ser um filho), enquanto currentTarget é o elemento ao qual o manipulador está anexado. O TypeScript tipa currentTarget de forma mais precisa.event.target.value em um evento de envio de formulário resultará em erro porque EventTarget não possui uma propriedade value. Faça um cast ou use currentTarget.event.preventDefault() no envio de formulário causa uma recarga completa da página.| Abordagem | Prós | Contras |
|---|---|---|
| Funções de seta inline | O TypeScript infere o tipo do evento automaticamente | Cria uma nova função a cada renderização |
| Funções de manipulador nomeadas | Reutilizáveis, testáveis, sem recriação | Deve anotar manualmente o tipo do evento |
Tipo React.EventHandler<E> | Alias de tipo de manipulador conciso | Menos comum, ligeiramente mais difícil de ler |
Prop de callback (ex: onSearch: (q: string) => void) | Desacopla o pai de eventos DOM | O pai não tem acesso ao evento bruto |
Manipulador envolvido com useCallback | Referência estável para filhos memoizados | Boilerplate adicional |
event.target é o elemento que disparou o evento (pode ser um elemento filho).event.currentTarget é o elemento ao qual o manipulador está anexado.currentTarget de forma mais precisa com base no parâmetro genérico.onChange={(e) => ...} obtêm seu tipo do contexto do atributo JSX.function handleChange(e: React.ChangeEvent<HTMLInputElement>).React.MouseEvent<T> -- cliques, movimento do mouse.React.ChangeEvent<T> -- alterações em input, select, textarea.React.FormEvent<T> -- envios de formulário.React.KeyboardEvent<T> -- pressionamentos de tecla.React.FocusEvent<T> -- foco e blur.event.target é tipado como EventTarget, que não possui uma propriedade value.event.currentTarget (tipado como o elemento do formulário) ou faça um cast de event.target.new FormData(event.currentTarget).type SearchBarProps = {
onSearch: (query: string) => void;
onClear?: () => void;
};onSearch(query)) em vez do evento DOM bruto.event.currentTarget.React.MouseEvent<HTMLButtonElement> significa que currentTarget é tipado como HTMLButtonElement.event.preventDefault() no topo dos manipuladores de envio de formulário.clientX, key).function handleSelectChange(event: React.ChangeEvent<HTMLSelectElement>) {
console.log("Selecionado:", event.target.value);
}React.ChangeEvent<HTMLSelectElement> -- não HTMLInputElement.value é o valor string da opção selecionada.event.persist().persist().Revisado por Chris St. John·Última atualização: 7 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥