1_normal form (#์ผ๋ฐ˜ FORM ์™€ React Hook fom ๋น„๊ต)

2024. 12. 1. 23:09ยท[ํ”„๋ก ํŠธ์—”๋“œ(FE) ๊ฐœ๋ฐœ]/React Hook Form
728x90
๋ฐ˜์‘ํ˜•

ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜

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'

Image

์™œ, ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑด๊ฐ€? (#mutable, read-only)

  1. [์‚ฌ์ „ ์ „์ œ] ๋ฆฌ์•กํŠธ๋Š” 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)
      
      
      

์‹ ๋ขฐ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ์ถœ์ฒ˜์˜ ๊ด€์ ์—์„œ ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ

- react ๊ฐ€ form ์˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์–ดํ•˜์ง€ ์•Š๋Š”๋‹ค. 

- ๊ทธ๋Ÿผ ๋ˆ„๊ฐ€? ์–ด๋–ป๊ฒŒ? 

- 
์ด ๊ฒฝ์šฐ, value ์†์„ฑ์ด, '์‹ ๋ขฐ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ์ถœ์ฒ˜' ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. 

Image

  • ์ œ์–ด 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 ์ฝ”๋“œ ํ†ตํ•ฉ์ด ์–ด๋ ค์›€

Image

  • 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 ๊ณต์‹๋ฌธ์„œ
  • ์ œ์–ด ์ปดํฌ๋„ŒํŠธ, ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ ํ†บ์•„๋ณด๊ธฐ
  • Image
728x90
๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'[ํ”„๋ก ํŠธ์—”๋“œ(FE) ๊ฐœ๋ฐœ] (feat. ์ฃผ๋‹ˆ์–ด) > React Hook Form' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[_INTRO_] RFH ์„ ์ฒ˜์Œ ํ˜น์€ ๋‹ค์‹œ ๊ณต๋ถ€ํ•œ๋‹ค๋ฉด ๋ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค  (0) 2024.12.01
'[ํ”„๋ก ํŠธ์—”๋“œ(FE) ๊ฐœ๋ฐœ]/React Hook Form' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [_INTRO_] RFH ์„ ์ฒ˜์Œ ํ˜น์€ ๋‹ค์‹œ ๊ณต๋ถ€ํ•œ๋‹ค๋ฉด ๋ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค
๋ถ€์‹œ๋งค๋‚˜_HA
๋ถ€์‹œ๋งค๋‚˜_HA
๐ŸŒ„ ๋งˆ์Œ์ฑ™๊น€ | ๐Ÿฆพ ์—ฐ์Šต | ๐Ÿฑ‍๐Ÿ Creator | ๐Ÿ“š[stackList] Nodejs, React, Three.js, Javascript, Blockchain, Blender, Unreal, Unity, Python, AI prompting
    ๋ฐ˜์‘ํ˜•
    250x250
  • ๋ถ€์‹œ๋งค๋‚˜_HA
    Hello creators ๐Ÿ™Œ
    ๋ถ€์‹œ๋งค๋‚˜_HA
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (221)
      • [ํ”„๋ก ํŠธ์—”๋“œ(FE) ๊ฐœ๋ฐœ] (feat. ์ฃผ๋‹ˆ์–ด) (8)
        • TIL (4)
        • React Hook Form (2)
        • Git (Github, Gitlab) (1)
      • [WEB & AI] (75)
        • Next YTMusic ํด๋ก  ์ฝ”๋”ฉ (with ne.. (0)
        • ํ”„๋ก ํŠธ&๋ฐฑ์—”๋“œ (15)
        • ์ฝ”๋”ฉ์• ํ”Œ (1)
        • JavaScript (0)
        • ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ_์›น๊ฐœ๋ฐœ์ข…ํ•ฉ๋ฐ˜ (44)
        • ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž ๊ณผ์ •_KGA (7)
        • ์•Œ๊ณ ๋ฆฌ์ฆ˜&์ž๋ฃŒ๊ตฌ์กฐ (1)
        • [AI] (0)
        • AI_Art (0)
        • Python (6)
        • [ํšŒ๊ณ ] (1)
      • [3D & 2D ๊ทธ๋ž˜ํ”ฝ์Šค] (133)
        • 2D ์ด๋ฏธ์ง€ (0)
        • ์†๋งต (4)
        • ๋””์ง€ํ„ธ ํŽ˜์ธํŒ… (8)
        • ๋…ธ๋ง๋งต (17)
        • ์–ธ๋ฆฌ์–ผ_์ž…๋ฌธ (43)
        • ์–ธ๋ฆฌ์–ผ_์ค‘๊ธ‰ (12)
        • ์–ธ๋ฆฌ์–ผ_PBL (1)
        • ์”จํฌ๋””, C4D (2)
        • ์„ญ์Šคํ„ด์Šค (18)
        • ๋งฅ์Šค, 3ds Max (19)
        • World Machine (1)
        • ์ง€๋ธŒ๋Ÿฌ์‰ฌ, Zbrush (6)
        • 3D Coat (2)
        • Unity (0)
      • [๊ธฐํƒ€] (3)
        • [E-Book ์ œ์ž‘] (0)
        • ์ธ๋””์ž์ธ(Indesign) (1)
        • [์ค€๋น„๊ณผ์ •] (1)
      • [์ผ์ƒ] (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฉ”ํƒ€๋ฒ„์Šค ๋ฐฐ๊ฒฝ ์ž…๋ฌธ
    ๊ฐœ๋ฐœ ๊ฐ•์˜ ์ถ”์ฒœ
    ๊ฐœ๋ฐœ์ž ๊ฐ•์˜ ์ถ”์ฒœ
    ๋ฐฐ๊ฒฝ ๋ชจ๋ธ๋ง ๊ฐ•์˜
    ๋ฉ”ํƒ€๋ฒ„์Šค ํฌ๋ฆฌ์—์ดํ„ฐ ๊ฐ•์ขŒ
    ๋ฉ”ํƒ€๋ฒ„์Šค ํฌ๋ฆฌ์—์ดํ„ฐ ์ž…๋ฌธ
    3D ๋ชจ๋ธ๋ง ๊ฐ•์˜
    3d ๋งฅ์Šค ์ž…๋ฌธ ๊ฐ•์˜
    3D ๋ชจ๋ธ๋ง ์ž…๋ฌธ
    css
    3ds Max ๊ฐ•์ขŒ
    ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ
    ๊ฐœ๋ฐœ์ž ์ปค๋ฆฌํ˜๋Ÿผ
    ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ
    JavaScript
    ์›น๊ฐœ๋ฐœ์ข…ํ•ฉ๋ฐ˜
    3d ๋ฐฐ๊ฒฝ ๋””์ž์ธ ๊ฐ•์ขŒ
    ๊ฐœ๋ฐœ์ž ๊ธฐ์ดˆ ๊ฐ•์˜ ์ถ”์ฒœ
    ๊ฐœ๋ฐœ ์ผ์ง€
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    ์ˆ˜์—… ๋ฆฌ๋ทฐ
    ์›น๊ฐœ๋ฐœ์ข…ํ•ฉ๋ฐ˜ ํ›„๊ธฐ
    3ds Max ์ž…๋ฌธ
    ๊ฐœ๋ฐœ ํšŒ๊ณ 
    ๋ฉ”ํƒ€๋ฒ„์Šค ๋ฐฐ๊ฒฝ ๊ฐ•์ขŒ
    ์–ธ๋ฆฌ์–ผ ๊ฐ•์ขŒ
    ์›น ๊ฐœ๋ฐœ ๊ฐ•์˜
    ์–ธ๋ฆฌ์–ผ 4
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ์ดˆ
    3d ๋ฐฐ๊ฒฝ ๋””์ž์ธ ์ž…๋ฌธ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
๋ถ€์‹œ๋งค๋‚˜_HA
1_normal form (#์ผ๋ฐ˜ FORM ์™€ React Hook fom ๋น„๊ต)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”