LoginPage.jsx
import "./LoginPage.css";
const LoginPage = () => {
return (
<section className="align_center form_page">
<form className="authentication_form">
<h2>๋ก๊ทธ์ธ ํผ</h2>
<div className="form_inputs">
<div>
<label htmlFor="email">Email</label>
<input
type="email"
id="email"
className="form_text_input"
placeholder="์ด๋ฉ์ผ ์
๋ ฅ..."
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
id="password"
className="form_text_input"
placeholder="ํจ์ค์๋"
/>
</div>
<button type="submit" className="search_button form_submit">
Submit
</button>
</div>
</form>
</section>
);
};
export default LoginPage;
LoginPage.css
.form_page {
justify-content: center;
}
.authentication_form {
width: 30%;
padding: 32px 48px;
margin-top: 32px;
background-color: #fff;
}
.authentication_form h2 {
font-size: 40px;
margin-bottom: 30px;
text-align: center;
}
.form_inputs div {
display: flex;
flex-direction: column;
margin-bottom: 20px;
}
.form_inputs label {
font-size: 18px;
font-weight: 600;
margin-bottom: 3px;
}
.form_text_input {
height: 35px;
padding: 0 8px;
font-size: 17px;
font-weight: 500;
outline: none;
}
.form_submit {
height: 40px;
width: 100%;
margin: 25px 0 10px;
}
.form_error {
color: red;
}
JavaScript ๋ฅผ ์ฌ์ฉ ํ ๋์๋, ์ฐ๋ฆฌ๊ฐ ํน์ DOM ์ ์ ํํด์ผ ํ๋ ์ํฉ์ getElementById, querySelector ๊ฐ์ DOM Selector ํจ์๋ฅผ ์ฌ์ฉํด์ DOM ์ ์ ํํฉ๋๋ค.
๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ ๊ฐ๋์ฉ DOM ์ ์ง์ ์ ํํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ ํ ๋๋ ์์ต๋๋ค.
๊ทธ๋ด ๋, ๋ฆฌ์กํธ์์ ref ๋ผ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์์ ref ๋ฅผ ์ฌ์ฉ ํ ๋์๋ useRef ๋ผ๋ Hook ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋์ useRef๋ฅผ ์ฌ์ฉํด์ password input์ฐฝ์ ์ ํํ์ฌ <๋น๋ฐ๋ฒํธ ๋ณด์ด๊ฒ>๋ฅผ ํด๋ฆญํ๋ฉด
์
๋ ฅํ ๋น๋ฐ๋ฒํธ๊ฐ ๋ณด์ด๊ฒ ํด์ค๊ฑฐ๊ณ , ์จ๊ธฐ๊ธฐ๋ฅผ ํด๋ฆญํ๋ฉด ***์๊ฐ์ด ์๋ณด์ด๊ฒ ํ๋๋ก ํ๊ฒ ๋ค.
LoginPage.jsx
import { useRef } from "react";
import "./LoginPage.css";
const LoginPage = () => {
const passwordRef = useRef(null);
return (
<section className="align_center form_page">
<form className="authentication_form">
<h2>๋ก๊ทธ์ธ ํผ</h2>
<div className="form_inputs">
<div>
<label htmlFor="email">Email</label>
<input
type="email"
id="email"
className="form_text_input"
placeholder="์ด๋ฉ์ผ ์
๋ ฅ..."
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
ref={passwordRef}
id="password"
className="form_text_input"
placeholder="ํจ์ค์๋ ์
๋ ฅ..."
/>
<button
type="button"
onClick={() => console.log(passwordRef.current)}
>
๋น๋ฐ๋ฒํธ ์จ๊ธฐ๊ธฐ
</button>
<button type="button">๋น๋ฐ๋ฒํธ ๋ณด์ด๊ฒ</button>
</div>
<button type="submit" className="search_button form_submit">
Submit
</button>
</div>
</form>
</section>
);
};
export default LoginPage;
console.log๋ก ์ฐ์ด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์จ๋ค.
import { useRef } from "react";
import "./LoginPage.css";
const LoginPage = () => {
const passwordRef = useRef(null);
return (
<section className="align_center form_page">
<form className="authentication_form">
<h2>๋ก๊ทธ์ธ ํผ</h2>
<div className="form_inputs">
<div>
<label htmlFor="email">Email</label>
<input
type="email"
id="email"
className="form_text_input"
placeholder="์ด๋ฉ์ผ ์
๋ ฅ..."
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
ref={passwordRef}
id="password"
className="form_text_input"
placeholder="ํจ์ค์๋ ์
๋ ฅ..."
/>
<button
type="button"
onClick={() =>
console.log((passwordRef.current.type = "password"))
}
>
๋น๋ฐ๋ฒํธ ์จ๊ธฐ๊ธฐ
</button>
<button
type="button"
onClick={() => (passwordRef.current.type = "text")}
>
๋น๋ฐ๋ฒํธ ๋ณด์ด๊ฒ
</button>
</div>
<button type="submit" className="search_button form_submit">
Submit
</button>
</div>
</form>
</section>
);
};
export default LoginPage;
๋น๋ฐ๋ฒํธ ์จ๊ธฐ๊ธฐ๋ฅผ ํด๋ฆญํ๋ฉด
input์ type์ password๋ก
๋ณด์ด๊ฒ๋ฅผ ํด๋ฆญํ๋ฉด
input์ type์ text๋ก ํด์ ๋ณด์ด๋๋ก ์ถ๊ฐํ๋ค
1. ๋น๋ฐ๋ฒํธ ๋ณด์ด๊ฒ ํด๋ฆญ
2. ๋น๋ฐ๋ฒํธ ์จ๊ธฐ๊ธฐ ํด๋ฆญ
Usestate๋ก user์ email๊ณผ password๋ฅผ ๊ด๋ฆฌํ๋ค.
const LoginPage = () => {
const [user, setUser] = useState({
email: "",
password: "",
});
const passwordRef = useRef(null);
//๋ก๊ทธ์ธ ํด๋ฆญ ์ ์คํ
const handleSubmit = (e) => {
e.preventDefault();
console.log(user);
};
<form onSubmit={handleSubmit} className="authentication_form">
<h2>๋ก๊ทธ์ธ ํผ</h2>
<div className="form_inputs">
<div>
<label htmlFor="email">Email</label>
<input
onChange={(e) => setUser({ ...user, email: e.target.value })}
type="email"
id="email"
className="form_text_input"
placeholder="์ด๋ฉ์ผ ์
๋ ฅ..."
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
onChange={(e) => setUser({ ...user, password: e.target.value })}
type="password"
ref={passwordRef}
id="password"
className="form_text_input"
placeholder="ํจ์ค์๋ ์
๋ ฅ..."
/>
<button
type="button"
onClick={() => (passwordRef.current.type = "password")}
>
๋น๋ฐ๋ฒํธ ์จ๊ธฐ๊ธฐ
</button>
<button
type="button"
onClick={() => (passwordRef.current.type = "text")}
>
๋น๋ฐ๋ฒํธ ๋ณด์ด๊ฒ
</button>
</div>
<button type="submit" className="search_button form_submit">
Submit
</button>
</div>
</form>
onChange ๋ก ์ด๋ฉ์ผ๊ณผ ํจ์ค์๋์ ๊ฐ์ด ๋ฐ๋๋๋ง๋ค setUser์ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ submit ์
handleSubmit ํจ์๊ฐ ์คํ๋๋ฉด์ user๋ฅผ ์ถ๋ ฅํ๋ค.
//๋ก๊ทธ์ธ ํด๋ฆญ ์ ์คํ
const handleSubmit = (e) => {
e.preventDefault();
//console.log(user);
setUser({ email: "", password: "" });
};
submit ์ input์ฐฝ ์ด๊ธฐํ
<input
onChange={(e) => setUser({ ...user, email: e.target.value })}
value={user.email}
type="email"
id="email"
className="form_text_input"
placeholder="์ด๋ฉ์ผ ์
๋ ฅ..."
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
onChange={(e) => setUser({ ...user, password: e.target.value })}
type="password"
value={user.password}
ref={passwordRef}
id="password"
className="form_text_input"
placeholder="ํจ์ค์๋ ์
๋ ฅ..."
/>
์ด๊ธฐํ ๋ ๊ฐ ๋ฐ์๋๊ฒ value ์ถ๊ฐ
https://www.npmjs.com/package/react-hook-form
react-hook-form
Performant, flexible and extensible forms library for React Hooks. Latest version: 7.49.2, last published: 6 days ago. Start using react-hook-form in your project by running `npm i react-hook-form`. There are 3546 other projects in the npm registry using r
www.npmjs.com
Form์ ์ฌ์ฉํ ๋ ์ข ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด์
react-hook-form ์ ์ค์นํ๋ค.
QuickStart ์ ๊ฐ์ด ์์ฑํด์ค๊ฑด๋ฐ
์ผ๋จ
const { register, handleSubmit } = useForm();
const submitData = (formData) => console.log(formData);
<form onSubmit={handleSubmit(submitData)} className="authentication_form">
<h2>๋ก๊ทธ์ธ ํผ</h2>
<div className="form_inputs">
<div>
<label htmlFor="email">Email</label>
<input
{...register("email")}
// onChange={(e) => setUser({ ...user, email: e.target.value })}
//value={user.email}
type="email"
id="email"
className="form_text_input"
placeholder="์ด๋ฉ์ผ ์
๋ ฅ..."
/>
</div>
<div>
<label htmlFor="password">Password</label>
<input
{...register("password")}
useRef()๋ฅผ ์ฌ์ฉํ๋ฉด password๊ฐ ์ถ๋ ฅ๋์ง ์์ ใ
๊ทธ๋์
๋น๋ฐ๋ฒํธ ๋ณด์ด๊ธฐ / ์จ๊น ๋ฒํผ์ ์ผ๋จ ์ฃผ์์ฒ๋ฆฌ
ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํจ์ฑ ๊ฒ์ฌ๋ ํ ์ ์๋ค.
//react-hook-form ์ฌ์ฉ
const {
register,
handleSubmit,
formState: { errors },
} = useForm();
input์ ๊ฒ์ฆ์ด ํ์ํ ์์ฑ์ ์
๋ ฅ
- required
- min (์ต์๊ฐ)
- max (์ต๋๊ฐ)
- minLength (์ต์๊ธธ์ด)
- maxLength
- pattern
- validate
input์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ๋ค.
<h2>๋ก๊ทธ์ธ ํผ</h2>
<div className="form_inputs">
<div>
<label htmlFor="email">Email</label>
<input
{...register("email", { required: "์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์." })}
// onChange={(e) => setUser({ ...user, email: e.target.value })}
//value={user.email}
type="email"
id="email"
className="form_text_input"
placeholder="์ด๋ฉ์ผ ์
๋ ฅ..."
/>
{errors.email && (
<em className="form_error">{errors.email.message}</em>
)}
</div>
<div>
<label htmlFor="password">Password</label>
<input
{...register("password", {
required: "ํจ์ค์๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.",
minLength: { value: 4, message: "ํจ์ค์๋๋ ์ต์ 4์ ์ด์." },
})}
// onChange={(e) => setUser({ ...user, password: e.target.value })}
// value={user.password}
type="password"
//ref={passwordRef}
id="password"
className="form_text_input"
placeholder="ํจ์ค์๋ ์
๋ ฅ..."
/>
{errors.password && (
<em className="form_error">{errors.password.message}</em>
)}