← Back
gist react react-hook-form typescript

Login form with react-hook-form

A simple Login component with react-hook-form:

src/components/login/Login.tsx:

import React from "react";
import { useForm } from "react-hook-form";

export type LoginData = {
username: string;
password: string;
};

type Props = {
onLogin: (data: LoginData) => void;
};

const Login: React.FC<Props> = ({ onLogin }) => {
const { register, handleSubmit, errors } = useForm<LoginData>();

return (
<div>
<form onSubmit={handleSubmit(onLogin)}>
<div>
<label htmlFor="username">Username</label>
<input
ref={register({ required: true, minLength: 4 })}
type="text"
name="username"
placeholder="Username"
/>

{errors.username && (
<div>Username must have at least four characters</div>
)}
</div>

<div>
<label htmlFor="password">Password</label>
<input
ref={register({ required: true })}
type="password"
name="password"
placeholder="Password"
/>

{errors.password && <div>Password is required</div>}
</div>

<div>
<button type="submit">Login</button>
</div>
</form>
</div>
);
};

export default Login;

Usage example:

src/pages/login.tsx:

import React, { useState } from "react";
import Login, { LoginData } from "../components/login/Login";
import ky from "ky";

const LoginPage = () => {
const [user, setUser] = useState<any>(null);

async function handleLogin(data: LoginData) {
const user = await ky.post("https://example.com", { json: data }).json();
setUser(user);
}
return (
<div>
<Login onLogin={handleLogin} />
{user && <pre>{JSON.stringify(user)}</pre>}
</div>
);
};

export default LoginPage;