- Published on
๐ ์ปฌ๋ฌ๋ฆฌ์คํธ ํ๋ก์ ํธ #3 ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ
- ๊ธ์ด์ด
๐ ๋ชฉ์ฐจ
๐๐ป
- ์๋๋ฆฌ์ค ์ฐ๊ธฐ
- ์ฝ๋ ์ง๊ธฐ ์์
- 2.1 ๋ก๊ทธ์ธ ํผ ๋ง๋ค๊ธฐ ๐ฅ
- 2.2 ๊ตฌ์กฐ๋ถํดํ ๋น ๋ฐ ์๋ฌ๋ฉ์์ง ๊ตฌํ ๐ฅ
1. ์๋๋ฆฌ์ค ์ฐ๊ธฐ
Feature: Login
Scenario: login form์ ๋ง๋ ๋ค
Given login form ๋ ๋ํ๊ณ
When ์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๊ณ
When "๋ก๊ทธ์ธ" button์ ํด๋ฆญํ๋ฉด
Then ํ์ํฉ๋๋ค ๋ฌธ๊ตฌ๊ฐ ๋ฌ๋ค!
Then nav์ login์ด ํ๋กํ ์ฌ์ง๊ณผ ์ด๋ฆ์ผ๋ก ๋ฐ๋๋ค
์์ง์ ๋ฌธ๊ตฌ๊ฐ ๋จ๋ ๊ฒ๊น์ง๋ง ๊ตฌํํ๋ค.
2. ์ฝ๋ ์ง๊ธฐ ์์
Login.tsx ์์ฑ์ ์์ํ๋ค.
-
bun add react-hook-form ์ ํฐ๋ฏธ๋์ ์ ๋ ฅํด์ ์ค์นํ๋ค.
-
'Login.tsx'์ useForm์ import ํด์ฃผ์๋ค. ->
import { useForm } from "react-hook-form";
https://react-hook-form.com/get-started ์ฐธ์กฐ -
์ด๋ฉ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ ๊ธฐ๋ณธ ๋ก๊ทธ์ธ ํผ์ ๋ง๋ค์ด์ค๋ค.
<article className="login-form"> <form> <h2>Login</h2> <label> ์ด๋ฉ์ผ <input type="email" /> </label> <label> ๋น๋ฐ๋ฒํธ <input type="password" /> </label> <button type="submit">๋ก๊ทธ์ธ</button> </form> </article>
-
input์ ์ ๋ ฅํ ๊ฐ์ ๊ธฐ์กด ๊ฐ๊ณผ ๋น๊ตํ๊ธฐ ์ํด ๊ฐ์ ๋ณด๋ด์ฃผ์ด์ผ ํ๋๊น,
register๊ณผ handleSubmit๋ฅผ ๋ง๋ค์ด์, ๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ๋ถํด ํ ๋น(destructuring)...ํด์ค๋ค.์ฐธ๊ณ ๋ก options, config, props..๋ ๋ค ๋น์ทํ ๋ง!
function Login() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
defaultValues: {
email: '',
password: '',
//๊ธฐ๋ณธ ๊ฐ์ ๋ค ""๋ก ์ ํด๋๋๋ค.
},
})
return (
<article className="login-form">
{/* handleSubmit์ ํผ์ด ์ ์ถ ๋์์ ๋ form์ data๋ฅผ ์ ๊บผ๋ด์ค๋ค */}
{/* ์ด๊ฑธ ์๋ฒ๋ก ๋ณด๋ด์ฃผ๋ฉด ๋! */}
<form
onSubmit={handleSubmit((data) => {
alert(JSON.stringify(data))
//์ง๊ธ์ ๋ณด๋ด์ค ๊ฐ์ alert์ฐฝ์์ ๋ณด๊ฒํด์ฃผ๋ ์ ๋๋ก ๋ง๋ค์๋ค.
})}
>
<h2>Login</h2>
<label>
์ด๋ฉ์ผ
<input
type="email"
{...register('email', {
required: '์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์!',
})}
/>
</label>
{errors.email && <li role="alert">{errors.email.message}</li>}
//์๋ฌ๊ฐ ๋๋ฉด ์์ฑํ ์ธํ๋ด์ฉ๊ณผ ์ด๋ฉ์ผ์ ์๋ฌ๋ฉ์์ง๋ฅผ input์นธ ๋ฐ์์ ๋ณด์ฌ์ค๋ค.
<label>
๋น๋ฐ๋ฒํธ
<input
type="password"
{...register('password', {
required: '๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์!',
})}
/>
</label>
{errors.password && <li role="alert">{errors.password.message}</li>}
//์๋ฌ๊ฐ ๋๋ฉด ์์ฑํ ์ธํ๋ด์ฉ๊ณผ ๋น๋ฐ๋ฒํธ์ ์๋ฌ๋ฉ์์ง๋ฅผ input์นธ ๋ฐ์์ ๋ณด์ฌ์ค๋ค.
<button type="submit">๋ก๊ทธ์ธ</button>
</form>
</article>
)
}
export default Login