๐คทโ๏ธ ๋ฆฌ์กํธ ํผ ์์๋?
๋ฆฌ์กํธ์์ ํผ(form) ์์์ ์ํ๊ฐ์ ๋ค๋ฃจ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ ์ด ์ปดํฌ๋ํธ(controlled component)์ ๋น์ ์ด ์ปดํฌ๋ํธ(uncontrolled component) ๋ฐฉ์์ผ๋ก ๋๋ ์ง๋๋ค.
์ด ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ์ฅ๋จ์ ์ด ์์ผ๋ฉฐ ์ํฉ์ ๋ง๊ฒ ์ ํํด์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
2024.07.31 - [React] - ๋ฆฌ์กํธ useLayoutEffect ๊ฐ๋ ๋ฐ ์ฌ์ฉ๋ฒ
๐คทโ๏ธ ์ ์ด ์ปดํฌ๋ํธ?
์ ์ด ์ปดํฌ๋ํธ ๋ฐฉ์์ HTML์์ input, textarea, select์ ๊ฐ์ ํผ(form) ์๋ฆฌ๋จผํธ๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก state(์ํ)๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํฉ๋๋ค.
ํผ(form) ์๋ฆฌ๋จผํธ์์ ์ ๋ ฅ๋๋ ์ํ๊ฐ์ state๋ก ๊ด๋ฆฌ, ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ฆ, ๋ฆฌ์กํธ์ ์ํด ๊ฐ์ด ์ ์ด๋๋ ์ ๋ ฅํผ ์๋ฆฌ๋จผํธ๋ฅผ ์ ์ด ์ปดํฌ๋ํธ์ด๋ฉฐ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ์ค์๊ฐ์ผ๋ก ๋๊ธฐํ๋ฉ๋๋ค.
๋ฆฌ์กํธ ์ ์ด ์ปดํฌ๋ํธ ๊ณต์๋ฌธ์
https://ko.legacy.reactjs.org/docs/forms.html#controlled-components
์ ์ด ์ปดํฌ๋ํธ ์์
import React, { useState } from "react";
import "./styles.css";
export default function App() {
const [inputValue, setInputValue] = useState("");
const handleChange = (event) => {
setInputValue(event.target.value);
};
const handleSubmit = (event) => {
event.preventDefault();
alert(`Submitted value: ${inputValue}`);
};
console.log("inputValue::", inputValue);
return (
<form onSubmit={handleSubmit}>
<label>
Controlled Input:
<input type="text" value={inputValue} onChange={handleChange} />
</label>
<button type="submit">Submit</button>
</form>
);
}
useState hook์ผ๋ก input ์ํ๊ฐ์ ์ ์ดํ๋ ์์ ์ ๋๋ค.
์ฌ์ฉ์๊ฐ input ํ ์คํธ๋ฅผ ์ ๋ ฅํฉ๋๋ค.
์ค์๊ฐ ๋๊ธฐํ๋๋ฉฐ input state ๊ฐ์ ์ ์ดํฉ๋๋ค.
๐คทโ๏ธ ๋น์ ์ด ์ปดํฌ๋ํธ??
๋น์ ์ด ์ปดํฌ๋ํธ ๋ฐฉ์์ ํผ(form)์ ๋ฐ์ดํฐ๊ฐ state ์ํ ๊ฐ์ด ์๋ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฉ์์ธ DOM ์์์ ์ํด ์ ์ด๋๋ ์ปดํฌ๋ํธ์ ๋๋ค.
๋น์ ์ด ์ปดํฌ๋ํธ๋ ref๋ฅผ ์ฌ์ฉํ์ฌ DOM ์์์ ์ ๊ทผํ์ฌ input, select, textarea ๊ฐ์ ์ฝ์ด์ต๋๋ค.
๋น์ ์ด ์ปดํฌ๋ํธ ์์
import React, { useRef } from "react";
import "./styles.css";
export default function App() {
const inputRef = useRef(null);
const handleSubmit = (event) => {
event.preventDefault();
console.log(`Submitted value: ${inputRef.current.value}`);
};
return (
<form onSubmit={handleSubmit}>
<label>
Uncontrolled Input:
<input type="text" ref={inputRef} />
</label>
<button type="submit">Submit</button>
</form>
);
}
useRef hook ์ฌ์ฉํด์ ๊ฐ์ ์ป์ด์ค๋ ์์ ์ ๋๋ค.
์ฌ์ฉ์๊ฐ input ํ ์คํธ๋ฅผ ์ ๋ ฅํฉ๋๋ค.
์ ์ด ์ปดํฌ๋ํธ์ ๋ค๋ฅด๊ฒ ์ํ ๊ฐ์ ์ค์๊ฐ ๋๊ธฐํ ํ์ง ์์ผ๋ฉฐ ์ ๋ ฅ๊ฐ์ ์ป์ด์ต๋๋ค.
๐คทโ๏ธ ์ ์ด ์ปดํฌ๋ํธ vs ๋น์ ์ด ์ปดํฌ๋ํธ?
- ์ ์ด ์ปดํฌ๋ํธ:
- ์ฅ์ : ํผ์ ๋ฐ์ดํฐ๊ฐ ์ปดํฌ๋ํธ์ state์ ์ ์ฅ๋๋ฏ๋ก, ์ ํจ์ฑ ๊ฒ์ฌ, ์ต์ ๊ฐ์ ์ ์งํ๊ณ ์กฐ์ํ๋๋ฐ ์ ์ฉํฉ๋๋ค..
- ๋จ์ : ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ , state๋ฅผ ์ค์ ํ๊ณ ์ ๋ฐ์ดํธํ๋ ์ถ๊ฐ ์์ ์ด ํ์ํฉ๋๋ค.
- ๋น์ ์ด ์ปดํฌ๋ํธ:
- ์ฅ์ : ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ , ์ ๋ ฅ ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ด ๋ ์ง๊ด์ ์ด๋ฉฐ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ์์ ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์ ์ฑ๋ฅ์ ์ข์ต๋๋ค.
- ๋จ์ : ์ ๋ ฅ ๊ฐ์ ์ค์๊ฐ์ผ๋ก ๊ฒ์ฆํ๊ฑฐ๋ ์กฐ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋น์ ์ด ์ปดํฌ๋ํธ์ ๊ฐ์ ํผ์ ์ ์ถํ ๋๋ง ํ์ธํ ์ ์์ต๋๋ค.
๋๋ฐ์ด์ฑ & ์ฐ๋กํ๋ง ์์๋ณด๊ธฐ!
https://cometruedream.tistory.com/222
๐คทโ๏ธ ์ ์ด vs ๋น์ ์ด ์ปดํฌ๋ํธ ๋ง์ง๋ง์ผ๋ก
๋ฆฌ์กํธ์ ์ ์ด ์ปดํฌ๋ํธ์ ๋น์ ์ด ์ปดํฌ๋ํธ์ ๊ฐ๋ ์ ๋ํด์ ์์๋ดค์ต๋๋ค.
ํผ ์์์ ์ํ๊ฐ์ ๋ค๋ฃจ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค.
์๋น์ค์ ์ ์ ํ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ด or ๋น์ ์ด ์ปดํฌ๋ํธ ๋ฐฉ์์ ํ์ฉํ์๋ฉด ๋ ๊บผ๊ฐ์ต๋๋ค.
์ ๋ ์ ๋ ฅ ๊ฐ์ ์ค์๊ฐ ์ ํจ์ฑ ๊ฒ์ฆ์ ํ๊ฑฐ๋ ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ฉด์, ๊ฐ๋จํ ํผ์ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ฑฐ๋ ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ ๊ฒ์ฆ์ด ํ์ ์๋ ๊ฒฝ์ฐ ๋น์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฌ๋ฐ๋ ์ค๋์ ๋ ๋ณ ์ด์ธ ๋ณด๊ณ ๊ฐ์ธ์!
https://cometruedream.tistory.com/247
https://cometruedream.tistory.com/243
https://cometruedream.tistory.com/242
https://cometruedream.tistory.com/241
https://cometruedream.tistory.com/244
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
NextJS์์ Prisma๋ฅผ ์ฌ์ฉํ Vercel์ ๋ฐฐํฌ ์ค๋ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ (2) | 2024.08.09 |
---|---|
React ๊ฐ๋ฐ์๋ฅผ ์ํ TypeScript์ Hooks ์ฌ์ฉ ํ ๋ฐ ์์ (1) | 2024.08.08 |
๋ฆฌ์กํธ useLayoutEffect ๊ฐ๋ ๋ฐ ์ฌ์ฉ๋ฒ (36) | 2024.07.31 |
[React-query] ๋ฐ์ดํฐํต์ ์ ์ํ useMutation ๊ฐ๋ ๊ณผ hooks ์ฌ์ฉ๋ฒ (29) | 2024.07.16 |
[React-query] ๋ฐ์ดํฐ ํ๋ฆฌํ์นญ ์ฌ์ฉ๋ฒ ์ ๋ฆฌ (1) | 2024.06.19 |