Hello creators ๐
1_normal form (#์ผ๋ฐ FORM ์ React Hook fom ๋น๊ต) ๋ณธ๋ฌธ
[ํ๋ก ํธ์๋(FE) ๊ฐ๋ฐ] (feat. ์ฃผ๋์ด)/React Hook Form
1_normal form (#์ผ๋ฐ FORM ์ React Hook fom ๋น๊ต)
๋ถ์๋งค๋_HA 2024. 12. 1. 23:09728x90
๋ฐ์ํ
ํํ ๋ฐ์ํ๋ ์ค๋ฅ
const DeliveryForm = () => {
const [values, setValues] = useState({
customerName : "James",
mobile : "010-123-1237"
})
return (
<form>
<div className="form-floating mb-3">
<input
type="text"
className="form-control"
placeholder="Customer Name"
value={values.customerName}
/>
<label>Customer Name</label>
</div>
</form>
)
}
- ์ด๋ ๊ฒ ์์ฑํ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ ์๋ฌ ๋ฐ์
You provided a 'value' prop to a form field without an 'onChange' handler. This will render a read-only field. If the field should be mutable use 'defaultValue'. Otherwise, set either 'onChange' or 'readOnly'
์, ์์ ๊ฐ์ ์๋ฌ๊ฐ ์ ๋ฐ์ํ๋ ๊ฑด๊ฐ? (#mutable, read-only)
- [์ฌ์ ์ ์ ] ๋ฆฌ์กํธ๋ input form์ด read-only ์ํ์ธ๊ฐ, mutable ์ํ์ธ๊ฐ์ ๋ฐ๋ผ์, '๊ฐ์ ๋ฐ๋ ๋ฐฉ์ ๋ฐ attribute ๊ฐ ๋ค๋ฆ'
- ๋ฆฌ์กํธ์์๋, 'onChange' handler ๊ฐ ์์ด, form field ์ value ๋ฅผ ์ ๋ฌํ๋ฉด, ๋ฆฌ์กํธ๋ ํด๋น form field๋ฅผ 'read-only' ๋ก ๋ค๋ฃฌ๋ค.
- '๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ์ํ' ๋ 'mutable' ์.
- mutable ์ํ์์
1) ์ด๊ธฐ๊ฐ์ defaultValue ์์ฑ
2) ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ฉด, onChange ์์ฑ์ ํตํด์ ๋ณ๊ฒฝ
- ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ์ํ๋ 'immutable' ์.
- ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก, read-only ์ํ ์.
- ์ด๋, ๊ฐ์ ๋ฐ๋ ๊ณณ์ value
react ์์ form ์ ๋ค๋ฃจ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ์ (#useState ์ state ๊ฐ '์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ' ๊ฐ ๋๋ค. #์ ์ด ์ปดํฌ๋ํธ)
- ๋ฆฌ์กํธ์์ ํด๋น input ํ๊ทธ๊ฐ mutable ์ธ ๊ฒฝ์ฐ (#โญโญโญโญโญ ์ด๊ฒ React ์์ form ์ ๋ค๋ฃจ๋ ๋ฐฉ์)
const DeliveryForm = () => {
const [values, setValues] = useState({
customerName : "James",
mobile : "010-123-1237"
})
const handleInputChange = (event) => {
// event ํธ๋ค๋ง ๋ก์ง
}
return (
)
}
2. ์ด๊ฒ์ React ๊ฐ ์์ฒด์ ์ผ๋ก ๊ฐ๋ฐํ ๊ฑด๊ฐ? ์๋๋ฉด input ํ๊ทธ ์์ฒด๊ฐ ์ด๋ ๊ฒ ์ค๊ณ ๋ ๊ฑด๊ฐ? (#์ ์ด controlled component, ๋น์ ์ด ์ปดํฌ๋ํธ uncontrolled component)
## ์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ์ ๋ํด์ (#์ฐํ
์ฝ)
- '์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ' ๋?
: 'ํ๋์ ์ํ' ๋ 'ํ ๊ณณ' ์๋ง ์์ด์ผ ํ๋ค.
- '์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ(single source of truth)' ์์น์ ์งํค๋๋ฐ ์์ด์, ๊ธฐ์กด HTML ํ๊ทธ๋ ๋ฌธ์ ๊ฐ ๋๋ค?
- '์ ์ด ์ปดํฌ๋ํธ' ๋, FORM ์ ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์, REACT ๊ฐ ์ ์ด
- ์ด๊ฑด, ์ด์ , '์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ(single source of truth)' ์ฑ์ง์ ๊ตฌํํ๊ธฐ ์ํด์
- value, onChange ๋ฅผ ์ฌ์ฉํ๋ค.
## ์ ๋ขฐ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ์ ๊ด์ ์์ ์ ์ด ์ปดํฌ๋ํธ
- name state(useState ์ ์ฒซ ๋ฒ์งธ ์ธ์)๊ฐ, '์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ' ๊ฐ ๋๋ค.
- ์ฆ, value ์์ฑ + state ๋ฅผ ๊ฒฐํฉ -> state ๋ฅผ '์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ' ๋ก ์ฌ์ฉํจ.
- ์ด๋, value + onChange ์กฐํฉ์ ์ฐ๋ ๊ฑด react ์์ read-only ๊ฐ ์๋๋ผ, mutable ํ ์ํ๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ ๋๋ ๊ฒ
![Image](https://i.imgur.com/afxwPce.png) ![Image](https://i.imgur.com/81gM4wU.png)
- ์ด๋, value + onChange ์กฐํฉ์ ์ฐ๋ ๊ฑด react ์์ read-only ๊ฐ ์๋๋ผ, mutable ํ ์ํ๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ ๋๋ ๊ฒ
์ ๋ขฐ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ์ ๊ด์ ์์ ๋น์ ์ด ์ปดํฌ๋ํธ
- react ๊ฐ form ์ ์
๋ ฅ๊ฐ์ ์ ์ดํ์ง ์๋๋ค.
- ๊ทธ๋ผ ๋๊ฐ? ์ด๋ป๊ฒ?
-
์ด ๊ฒฝ์ฐ, value ์์ฑ์ด, '์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ' ๋ฅผ ๊ฐ๊ฒ ๋๋ค.
- ์ ์ด vs ๋น์ ์ด ๋น๊ต
``` - ์ ์ด ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ,
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅ -> onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ -> onChange ์ state ์ setState ๋ฉ์๋๊ฐ ๋ฐ์ธ๋ฉ ์ธ์ด ์์ผ๋ฏ๋ก, ๊ฐ ๊ฐฑ์ -> setState ๊ฐ ์คํ๋์์ผ๋ฏ๋ก, '๋ฆฌ๋ ๋๋ง ๋ฐ์' (#โโ์ ๋ฆฌ์กํธ๋ ์ด๋ ๊ฒ ์ค๊ณ ํ๊ฑฐ์งโโ)
- ๋น์ ์ด ์ปดํฌ๋ํธ
- ๋ฐ์ดํฐ ๊ด๋ฆฌ ์ฃผ์ฒด๊ฐ DOM
- ์ฌ์ฉ์๊ฐ submit ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฉด -> DOM ์ ์ ๊ทผํด์ ๊ฐ์ pull ํด์จ๋ค.
- ์ด๋, ref ๋ฅผ ์ฌ์ฉํด์ ์ง์ DOM ์ ์ปจํํ๊ธฐ ๋๋ฌธ์, ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์๋์ง ์์.
- ์ฌ์ฉ
- '์ค์๊ฐ์ฑ' ์ด ์๋ ๊ฒฝ์ฐ, '์ ์ด ์ปดํฌ๋ํธ' ๋ก ํ์ฉํ๊ฒ ๋จ
- '์ด๋ฆ ๋ฐ ์ฃผ์ ํ๋' ๊ฐ ์ฑ์์ก์ ๋, '์ ์ถ ๋ฒํผ ํ์ฑํ' ๋ฅผ ์ํฌ ์ ์์.
![Image](https://i.imgur.com/XwK2aZO.png) ![Image](https://i.imgur.com/AFlZ7zi.png) ![Image](https://i.imgur.com/62b0czN.png)
- ๊ถ๊ธ์ฆ
- setState ๊ฐ ์คํ๋์์ผ๋ฏ๋ก, '๋ฆฌ๋ ๋๋ง ๋ฐ์' (#โโ์ ๋ฆฌ์กํธ๋ ์ด๋ ๊ฒ ์ค๊ณ ํ๊ฑฐ์งโโ)
- ์ ์ด ์ปดํฌ๋ํธ์ ๋จ์
``` - ์ฌ์ฉ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค ๋ฆฌ๋ ๋๋ง
- ๋ชจ๋ Form Elements ์ React ์ํ๋ฅผ ์ฐ๊ฒฐ (#โโโ ์)
- non-React ์ฝ๋๋ก ์์ฑ๋ Form Elements ์ฝ๋ ํตํฉ์ด ์ด๋ ค์
- React Hook Form
``` - ๋น์ ์ด ์ปดํฌ๋ํธ ์ฌ์ฉ
- subscribe ๊ธฐ๋ฅ์ ํตํด, ์ฆ๊ฐ์ ์ธ ๋ฐ์ดํฐ ์ก์์ ์ ๋ณด์
์ ๋ฆฌํ๋ฉด
0. ์ ๋ขฐ ๊ฐ๋ฅํ ๋จ์ผ ์ถ์ฒ๋ฅผ ๋ฌ์ฑํ๊ณ ์ ํจ
1. React ์์ form ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์๋ '์ ์ด' ์ '๋น์ ์ด' ๊ฐ ์์
2. '์ ์ด' ์ ๊ฒฝ์ฐ,
- mutable ์ํ ์ด๋ฏ๋ก, value + onchange ์กฐํฉ์ ์ด์ฉํด์ ๊ด๋ฆฌ
- onchange ์ด๋ฒคํธ ์ด๊ธฐ ๋๋ฌธ์ -> ์
๋ ฅํ ๋ ๋ง๋ค ๋ณ๊ฒฝ -> ๋ฆฌ๋ ๋๋ง ์ ๋ฐ
3. ๋ฆฌ์กํธ ํ
ํผ์
- ๋น์ ์ด ๊ธฐ๋ฐ
- ์ค์๊ฐ์ฑ ๋จ์ ์ subscribe ๋ฅผ ํตํด ๊ทน๋ณต
์ถ์ฒ
- difficulities with normal ways of creating react hook forms (udemy)
- react ๊ณต์๋ฌธ์
- ์ ์ด ์ปดํฌ๋ํธ, ๋น์ ์ด ์ปดํฌ๋ํธ ํบ์๋ณด๊ธฐ
728x90
๋ฐ์ํ
'[ํ๋ก ํธ์๋(FE) ๊ฐ๋ฐ] (feat. ์ฃผ๋์ด) > React Hook Form' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[_INTRO_] RFH ์ ์ฒ์ ํน์ ๋ค์ ๊ณต๋ถํ๋ค๋ฉด ๋ด์ผ ํ๋ ๊ฒ๋ค (0) | 2024.12.01 |
---|
Comments