<input> ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ form input ์„ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<input />

๋ ˆํผ๋Ÿฐ์Šค

<input>

input ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด, <input> ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ ๋ฅผ ๋ Œ๋”๋ง ํ•˜์„ธ์š”.

<input name="myInput" />

์•„๋ž˜์— ๋” ๋งŽ์€ ์˜ˆ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Props

<input> ์€ ์ผ๋ฐ˜์ ์ธ ์—˜๋ฆฌ๋จผํŠธ props ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

input์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜ props ๋“ค ์ค‘์˜ ํ•˜๋‚˜๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.

  • checked: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…. ์ฒดํฌ๋ฐ•์Šค input ๋˜๋Š” ๋ผ๋””์˜ค ๋ฒ„ํŠผ์—์„œ ์„ ํƒ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • value: ๋ฌธ์ž์—ด ํƒ€์ž…. ํ…์ŠคํŠธ input์˜ ๊ฒฝ์šฐ ํ…์ŠคํŠธ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. (๋ผ๋””์˜ค ๋ฒ„ํŠผ์˜ ๊ฒฝ์šฐ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.)

๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” onChange ํ•ธ๋“ค๋Ÿฌ๋„ ํ•จ๊ป˜ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ <input> props ๋“ค์€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” input๋“ค์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ <input> props ๋“ค์€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” input๊ณผ ์ œ์–ด๋˜๋Š” input ๋ชจ๋‘์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • accept: ๋ฌธ์ž์—ด ํƒ€์ž…. type="file" input์—์„œ ํ—ˆ์šฉํ•  ํŒŒ์ผ ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • alt: ๋ฌธ์ž์—ด ํƒ€์ž…. type="image" input์—์„œ ๋Œ€์ฒด ์ด๋ฏธ์ง€ ํ…์ŠคํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • capture: ๋ฌธ์ž์—ด ํƒ€์ž…. type="file" input์œผ๋กœ ์บก์ฒ˜ํ•œ ๋ฏธ๋””์–ด(๋งˆ์ดํฌ, ๋น„๋””์˜ค ๋˜๋Š” ์นด๋ฉ”๋ผ)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • autoComplete: ๋ฌธ์ž์—ด ํƒ€์ž…. ์ž๋™ ์™„์„ฑ ๋™์ž‘๋“ค ์ค‘ ๊ฐ€๋Šฅํ•œ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • autoFocus: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…. true์ผ ๊ฒฝ์šฐ React๋Š” ๋งˆ์šดํŠธ ์‹œ ์—˜๋ฆฌ๋จผํŠธ์— ํฌ์ปค์Šค๋ฅผ ๋งž์ถฅ๋‹ˆ๋‹ค.
  • dirname: ๋ฌธ์ž์—ด ํƒ€์ž…. ์—˜๋ฆฌ๋จผํŠธ ๋ฐฉํ–ฅ์„ฑ์— ๋Œ€ํ•œ ํผ ํ•„๋“œ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • disabled: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…. true์ผ ๊ฒฝ์šฐ, input์€ ์ƒํ˜ธ์ž‘์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ ํ๋ฆฟํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.
  • children: <input> ์€ ์ž์‹์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • form: ๋ฌธ์ž์—ด ํƒ€์ž…. input์ด ์†ํ•˜๋Š” <form>์˜ id๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋žต ์‹œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ ํผ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  • formAction: ๋ฌธ์ž์—ด ํƒ€์ž…. type="submit" ๊ณผ type="image"์˜ ๋ถ€๋ชจ <form action> ์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  • formEnctype: ๋ฌธ์ž์—ด ํƒ€์ž…. type="submit" ๊ณผ type="image"์˜ ๋ถ€๋ชจ <form enctype> ์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  • formMethod: ๋ฌธ์ž์—ด ํƒ€์ž…. type="submit" ๊ณผ type="image"์˜ ๋ถ€๋ชจ <form method> ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  • formNoValidate: ๋ฌธ์ž์—ด ํƒ€์ž…. type="submit" ๊ณผ type="image"์˜ ๋ถ€๋ชจ <form noValidate> ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  • formTarget: ๋ฌธ์ž์—ด ํƒ€์ž…. <form target> for type="submit" ๊ณผ type="image"์˜ ๋ถ€๋ชจ <form target> ์„ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  • height: ๋ฌธ์ž์—ด ํƒ€์ž…. type="image" ์˜ ์ด๋ฏธ์ง€ ๋†’์ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • list: ๋ฌธ์ž์—ด ํƒ€์ž…. <datalist> ์˜ id ๋ฅผ ์ž๋™ ์™„์„ฑ ์˜ต์…˜๋“ค๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • max: ์ˆซ์ž ํƒ€์ž…. ์ˆซ์ž ์™€ ๋‚ ์งœ input๋“ค์˜ ์ตœ๋Œ“๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • maxLength: ์ˆซ์ž ํƒ€์ž…. ํ…์ŠคํŠธ์™€ ๋‹ค๋ฅธ input๋“ค์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • min: ์ˆซ์ž ํƒ€์ž…. ์ˆซ์ž ์™€ ๋‚ ์งœ input๋“ค์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • minLength: ์ˆซ์ž ํƒ€์ž…. ํ…์ŠคํŠธ์™€ ๋‹ค๋ฅธ input๋“ค์˜ ์ตœ์†Œ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • multiple: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…. type="file" ๊ณผ type="email" ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐ’์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • name: ๋ฌธ์ž์—ด ํƒ€์ž…. ํผ๊ณผ ์ œ์ถœ ๋˜๋Š” input์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • onChange: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜. ์ œ์–ด๋˜๋Š” input ํ•„์ˆ˜ ์š”์†Œ๋กœ ๊ฐ€๋ น ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ input ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ € input ์ด๋ฒคํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • onChangeCapture: ์บก์ฒ˜ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋˜๋Š” onChange
  • onInput: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€์˜ ์šฉ๋ฒ•์— ๋น„์ถฐ๋ดค์„ ๋•Œ React์—์„œ๋Š” ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” onChange๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ด€์Šต์ ์ž…๋‹ˆ๋‹ค.
  • onInputCapture: ์บก์ฒ˜ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋˜๋Š” onInput
  • onInvalid: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜. ํผ ์ œ์ถœ ์‹œ input์ด ์œ ํšจํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‹คํ–‰๋˜๋ฉฐ invalid ๋‚ด์žฅ ์ด๋ฒคํŠธ์™€ ๋‹ฌ๋ฆฌ React onInvalid ์ด๋ฒคํŠธ๋Š” ๋ฒ„๋ธ”๋ง๋ฉ๋‹ˆ๋‹ค.
  • onInvalidCapture: ์บก์ฒ˜ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋˜๋Š” onInvalid
  • onSelect: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜. <input> ๋‚ด๋ถ€์˜ ์„ ํƒ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋œ ํ›„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. React๋Š” onSelect ์ด๋ฒคํŠธ๋ฅผ ํ™•์žฅํ•˜์—ฌ ์„ ํƒ ์‚ฌํ•ญ์ด ๋น„๊ฑฐ๋‚˜ ํŽธ์ง‘ ์‹œ ์„ ํƒ ์‚ฌํ•ญ์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ฒŒ ๋  ๋•Œ๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • onSelectCapture: ์บก์ฒ˜ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋˜๋Š” onSelect
  • pattern: ๋ฌธ์ž์—ด ํƒ€์ž…. value๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•˜๋Š” ํŒจํ„ด์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • placeholder: ๋ฌธ์ž์—ด ํƒ€์ž…. input ๊ฐ’์ด ๋น„์—ˆ์„ ๋•Œ ํ๋ฆฐ ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • readOnly: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…. true์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ input์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • required: ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…. true์ผ ๊ฒฝ์šฐ ํผ์ด ์ œ์ถœํ•  ๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • size: ์ˆซ์ž ํƒ€์ž…. ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋‹จ์œ„๋Š” ์ œ์–ด์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • src: ๋ฌธ์ž์—ด ํƒ€์ž…. type="image" input์˜ ์ด๋ฏธ์ง€ ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • step: ์–‘์ˆ˜ ๋˜๋Š” 'any' ๋ฌธ์ž์—ด. ์œ ํšจํ•œ ๊ฐ’ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • type: ๋ฌธ์ž์—ด ํƒ€์ž…. input types ์ค‘์˜ ํ•˜๋‚˜
  • width: ๋ฌธ์ž์—ด ํƒ€์ž…. type="image" input์˜ ์ด๋ฏธ์ง€ ๋„ˆ๋น„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

  • ์ฒดํฌ๋ฐ•์Šค์—๋Š” value (๋˜๋Š” defaultValue)๊ฐ€ ์•„๋‹Œ checked (๋˜๋Š” defaultChecked)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ input ์˜์—ญ์€ ๋ฌธ์ž์—ด value prop์„ ๋ฐ›์„ ๊ฒฝ์šฐ ์ œ์–ด๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
  • ์ฒดํฌ๋ฐ•์Šค ๋˜๋Š” ๋ผ๋””์˜ค ๋ฒ„ํŠผ์ด ๋ถˆ๋ฆฌ์–ธ checked prop์„ ๋ฐ›์„ ๊ฒฝ์šฐ ์ œ์–ด๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
  • input์€ ์ œ์–ด๋˜๋ฉด์„œ ๋™์‹œ์— ๋น„์ œ์–ด๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • input์€ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ์ œ์–ด ๋˜๋Š” ๋น„์ œ์–ด ์ƒํƒœ๋ฅผ ์˜ค๊ฐˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ œ์–ด๋˜๋Š” input์—” ๋ชจ๋‘ ๋ฐฑ์—… ๊ฐ’์„ ๋™๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ input ํ‘œ์‹œ

input์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด <input> ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•˜์„ธ์š”. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์ŠคํŠธ input์ด ๋ฉ๋‹ˆ๋‹ค. ์ฒดํฌ๋ฐ•์Šค์—๋Š” type="checkbox"๋ฅผ, ๋ผ๋””์˜ค ๋ฒ„ํŠผ์—๋Š” type="radio" ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ input ํƒ€์ž…๋“ค ์ค‘์˜ ํ•˜๋‚˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

export default function MyForm() {
  return (
    <>
      <label>
        Text input: <input name="myInput" />
      </label>
      <hr />
      <label>
        Checkbox: <input type="checkbox" name="myCheckbox" />
      </label>
      <hr />
      <p>
        Radio buttons:
        <label>
          <input type="radio" name="myRadio" value="option1" />
          Option 1
        </label>
        <label>
          <input type="radio" name="myRadio" value="option2" />
          Option 2
        </label>
        <label>
          <input type="radio" name="myRadio" value="option3" />
          Option 3
        </label>
      </p>
    </>
  );
}


input์— ๋ผ๋ฒจ ์ œ๊ณตํ•˜๊ธฐ

์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  <input> ์€ <label> ํƒœ๊ทธ ์•ˆ์— ๋‘๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๋‹น ๋ผ๋ฒจ์ด ํ•ด๋‹น input๊ณผ ์—ฐ๊ด€๋จ์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ผ๋ฒจ์„ ํด๋ฆญํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” input์— ์ž๋™์ ์œผ๋กœ ํฌ์ปค์Šค๋ฅผ ๋งž์ถฅ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ๊ด€๋œ input์— ํฌ์ปค์Šค๋ฅผ ๋งž์ถœ ๋•Œ ๋ผ๋ฒจ ์บก์…˜์„ ์ฝ๊ฒŒ ๋˜๋ฏ€๋กœ ์ด ๋ฐฉ์‹์€ ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด์„œ๋„ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

<label> ์•ˆ์— <input> ์„ ๊ฐ์Œ€ ์ˆ˜ ์—†๋‹ค๋ฉด, <input id> ์™€ <label htmlFor>์— ๋™์ผํ•œ ID๋ฅผ ์ „๋‹ฌํ•ด์„œ ์—ฐ๊ด€์„ฑ์„ ๋ถ€์—ฌํ•˜์„ธ์š”. ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค ๊ฐ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๋ ค๋ฉด useId๋กœ ๊ทธ๋Ÿฌํ•œ ID๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.

import { useId } from 'react';

export default function Form() {
  const ageInputId = useId();
  return (
    <>
      <label>
        Your first name:
        <input name="firstName" />
      </label>
      <hr />
      <label htmlFor={ageInputId}>Your age:</label>
      <input id={ageInputId} name="age" type="number" />
    </>
  );
}


input์— ์ดˆ๊นƒ๊ฐ’ ์ œ๊ณตํ•˜๊ธฐ

input์˜ ์ดˆ๊นƒ๊ฐ’์€ ์„ ํƒ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ input์„ ์œ„ํ•œ defaultValue ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•˜์„ธ์š”. ๋Œ€์‹  ์ฒดํฌ๋ฐ•์Šค์™€ ๋ผ๋””์˜ค ๋ฒ„ํŠผ์€ defaultChecked ๋ถˆ๋ฆฌ์–ธ์œผ๋กœ ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

export default function MyForm() {
  return (
    <>
      <label>
        Text input: <input name="myInput" defaultValue="Some initial value" />
      </label>
      <hr />
      <label>
        Checkbox: <input type="checkbox" name="myCheckbox" defaultChecked={true} />
      </label>
      <hr />
      <p>
        Radio buttons:
        <label>
          <input type="radio" name="myRadio" value="option1" />
          Option 1
        </label>
        <label>
          <input
            type="radio"
            name="myRadio"
            value="option2"
            defaultChecked={true} 
          />
          Option 2
        </label>
        <label>
          <input type="radio" name="myRadio" value="option3" />
          Option 3
        </label>
      </p>
    </>
  );
}


ํผ ์ œ์ถœ ์‹œ input ๊ฐ’ ์ฝ๊ธฐ

inputs๊ณผ <button type="submit"> ๋ฐ”๊นฅ์„ <form> ์œผ๋กœ ๊ฐ์‹ธ๋ฉด ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ <form onSubmit> ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ˜„์žฌ URL์— ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ ํ›„ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋™์ž‘์€ e.preventDefault()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํผ ๋ฐ์ดํ„ฐ๋Š” new FormData(e.target)๋กœ ์ฝ์œผ์„ธ์š”.

export default function MyForm() {
  function handleSubmit(e) {
    // ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    e.preventDefault();

    // ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
    const form = e.target;
    const formData = new FormData(form);

    // formData๋ฅผ ์ง์ ‘ fetch body๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    fetch('/some-api', { method: form.method, body: formData });

    // ๋˜๋Š” ์ˆœ์ˆ˜ object๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    const formJson = Object.fromEntries(formData.entries());
    console.log(formJson);
  }

  return (
    <form method="post" onSubmit={handleSubmit}>
      <label>
        Text input: <input name="myInput" defaultValue="Some initial value" />
      </label>
      <hr />
      <label>
        Checkbox: <input type="checkbox" name="myCheckbox" defaultChecked={true} />
      </label>
      <hr />
      <p>
        Radio buttons:
        <label><input type="radio" name="myRadio" value="option1" /> Option 1</label>
        <label><input type="radio" name="myRadio" value="option2" defaultChecked={true} /> Option 2</label>
        <label><input type="radio" name="myRadio" value="option3" /> Option 3</label>
      </p>
      <hr />
      <button type="reset">Reset form</button>
      <button type="submit">Submit form</button>
    </form>
  );
}

Note

<input name="firstName" defaultValue="Taylor" /> ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ชจ๋“  <input>์— name์„ ๋ถ€์—ฌํ•˜์„ธ์š”. ํ•ด๋‹น name์€ { firstName: "Taylor" } ์˜ˆ์‹œ์ฒ˜๋Ÿผ ํผ ๋ฐ์ดํ„ฐ์˜ key๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค.

์ฃผ์˜ํ•˜์„ธ์š”!

๊ธฐ๋ณธ์ ์œผ๋กœ <form> ๋‚ด๋ถ€์˜ ์–ด๋Š <button>์ด๋“  ํผ์„ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋œป๋ฐ–์ธ๊ฐ€์š”? ์ปค์Šคํ…€ Button React ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ <button> ๋Œ€์‹  <button type="button"> ๋ฐ˜ํ™˜์„ ๊ณ ๋ คํ•˜์„ธ์š”. ๋ช…์‹œ์„ฑ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด ํผ ์ œ์ถœ์šฉ ๋ฒ„ํŠผ์œผ๋กœ๋Š” <button type="submit">์„ ์‚ฌ์šฉํ•˜์„ธ์š”.


state ๋ณ€์ˆ˜๋กœ input ์ œ์–ดํ•˜๊ธฐ

<input /> ๊ณผ ๊ฐ™์€ input์€ ์ œ์–ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. <input defaultValue="Initial text" />์™€ ๊ฐ™์€ ์ดˆ๊นƒ๊ฐ’์„ ์ „๋‹ฌํ•œ๋Œ€๋„ JSX๋Š” ๋‹น์žฅ์˜ ๊ฐ’์„ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ  ์ดˆ๊นƒ๊ฐ’๋งŒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ œ์–ด๋˜๋Š” input์„ ๋ Œ๋”๋งํ•˜๋ ค๋ฉด, value (๋˜๋Š” ์ฒดํฌ๋ฐ•์Šค์™€ ๋ผ๋””์˜ค์—๋Š” checked) prop ์„ ์ „๋‹ฌํ•˜์„ธ์š”. React๋Š” ์ „๋‹ฌํ•œ value๋ฅผ ํ•ญ์ƒ ๊ฐ–๋„๋ก input์— ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Form() {
const [firstName, setFirstName] = useState(''); // state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
// ...
return (
<input
value={firstName} // ์ž…๋ ฅ ๊ฐ’์ด state ๋ณ€์ˆ˜์™€ ์ผ์น˜ํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.
onChange={e => setFirstName(e.target.value)} // input์„ ํŽธ์ง‘ํ•  ๋•Œ๋งˆ๋‹ค state ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
/>
);
}

์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค UI๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๋Š” ๋“ฑ state๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ œ์–ด๋œ input์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

function Form() {
const [firstName, setFirstName] = useState('');
return (
<>
<label>
First name:
<input value={firstName} onChange={e => setFirstName(e.target.value)} />
</label>
{firstName !== '' && <p>Your name is {firstName}.</p>}
...

๋˜ํ•œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋Š” ๋“ฑ์˜ input state๋ฅผ ์กฐ์ •ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

function Form() {
// ...
const [age, setAge] = useState('');
const ageAsNumber = Number(age);
return (
<>
<label>
Age:
<input
value={age}
onChange={e => setAge(e.target.value)}
type="number"
/>
<button onClick={() => setAge(ageAsNumber + 10)}>
Add 10 years
</button>

์ œ์–ด๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ๋˜๋Š” value๋Š” undefined ๋‚˜ null์ด ๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ firstName ํ•„๋“œ์ฒ˜๋Ÿผ ์ดˆ๊นƒ๊ฐ’์„ ๋น„์›Œ๋‘์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ state ๋ณ€์ˆ˜๋ฅผ ๋นˆ ๋ฌธ์ž์—ด('')๋กœ ์ดˆ๊ธฐํ™” ํ•˜์„ธ์š”.

import { useState } from 'react';

export default function Form() {
  const [firstName, setFirstName] = useState('');
  const [age, setAge] = useState('20');
  const ageAsNumber = Number(age);
  return (
    <>
      <label>
        First name:
        <input
          value={firstName}
          onChange={e => setFirstName(e.target.value)}
        />
      </label>
      <label>
        Age:
        <input
          value={age}
          onChange={e => setAge(e.target.value)}
          type="number"
        />
        <button onClick={() => setAge(ageAsNumber + 10)}>
          Add 10 years
        </button>
      </label>
      {firstName !== '' &&
        <p>Your name is {firstName}.</p>
      }
      {ageAsNumber > 0 &&
        <p>Your age is {ageAsNumber}.</p>
      }
    </>
  );
}

์ฃผ์˜ํ•˜์„ธ์š”!

input์— onChange ์—†์ด value๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น input์— ํƒ€์ดํ•‘์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. value๋ฅผ ์ „๋‹ฌํ•˜์—ฌ input์„ ์ œ์–ดํ•˜๋ฉด ํ•ญ์ƒ ํ•ด๋‹น value๋ฅผ ๊ฐ€์ง€๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ state ๋ณ€์ˆ˜๋ฅผ value๋กœ ์ „๋‹ฌํ•ด๋„ onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด์—์„œ ํ•ด๋‹น state ๋ณ€์ˆ˜๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด React๋Š” ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค input์„ ์ฒ˜์Œ ์ง€์ •ํ•œ value๋กœ ๋˜๋Œ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”ํ•˜๊ธฐ

์ œ์–ด๋œ input์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค state๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. state๋ฅผ ํฌํ•จํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํฐ ํŠธ๋ฆฌ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•  ๊ฒฝ์šฐ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ํผ์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์„ธ์š”.

function App() {
const [firstName, setFirstName] = useState('');
return (
<>
<form>
<input value={firstName} onChange={e => setFirstName(e.target.value)} />
</form>
<PageContent />
</>
);
}

<PageContent />๋Š” input state์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ input state๋ฅผ ์ž์ฒด ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function App() {
return (
<>
<SignupForm />
<PageContent />
</>
);
}

function SignupForm() {
const [firstName, setFirstName] = useState('');
return (
<form>
<input value={firstName} onChange={e => setFirstName(e.target.value)} />
</form>
);
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค SignupForm๋งŒ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

PageContent๊ฐ€ ๊ฒ€์ƒ‰ input ๊ฐ’์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ useDeferredValue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ๋ฆฌ๋ Œ๋”๋ง ์ค‘์—๋„ ์ œ์–ด๋œ input์ด ์‘๋‹ตํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฌธ์ œํ•ด๊ฒฐ

ํ…์ŠคํŠธ input์— ํƒ€์ดํ•‘์„ ํ•ด๋„ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

onChange ์—†์ด value๋งŒ ์ „๋‹ฌํ•˜์—ฌ input์„ ๋ Œ๋”๋งํ•˜๋ฉด ์ฝ˜์†”์— ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

// ๐Ÿ”ด ๋ฒ„๊ทธ: ์ œ์–ด๋˜๋Š” input์— onChange ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
<input value={something} />
Console
ํผ ํ•„๋“œ์— onChange ํ•ธ๋“ค๋Ÿฌ ์—†์ด value prop๋งŒ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ๊ธฐ ์ „์šฉ ํ•„๋“œ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ defaultValue๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ onChange ๋˜๋Š” readOnly๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.

์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ œ์•ˆํ•˜๋“ฏ ์ดˆ๊นƒ๊ฐ’๋งŒ ์ง€์ •ํ•˜๋ ค๋ฉด defaultVallue๋ฅผ ๋Œ€์‹  ์ „๋‹ฌํ•˜์„ธ์š”.

// โœ… ์ข‹์€ ์˜ˆ: ์ œ์–ด๋˜์ง€ ์•Š๋Š” input์— ์ดˆ๊นƒ๊ฐ’ ์ „๋‹ฌ
<input defaultValue={something} />

input์„ state ๋ณ€์ˆ˜๋กœ ์ œ์–ดํ•˜๋ ค๋ฉด onChange ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

// โœ… ์ข‹์€ ์˜ˆ: ์ œ์–ด๋˜๋Š” input์— onChange ์ „๋‹ฌ
<input value={something} onChange={e => setSomething(e.target.value)} />

๊ฐ’์ด ์˜๋„์ ์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด readOnly prop์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

// โœ… ์ข‹์€ ์˜ˆ: ์ œ์–ด๋˜๋Š” ์ฝ๊ธฐ ์ „์šฉ input์— onChange ์ƒ๋žต
<input value={something} readOnly={true} />

์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•ด๋„ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

onChange ์—†์ด checked๋งŒ ์ „๋‹ฌํ•˜์—ฌ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด ์ฝ˜์†”์— ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

// ๐Ÿ”ด ๋ฒ„๊ทธ: ์ œ์–ด๋˜๋Š” ์ฒดํฌ๋ฐ•์Šค์— onChange ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
<input type="checkbox" checked={something} />
Console
ํผ ํ•„๋“œ์— onChange ํ•ธ๋“ค๋Ÿฌ ์—†์ด checked prop์„ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ๊ธฐ ์ „์šฉ ํ•„๋“œ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ defaultChecked๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ onChange ๋˜๋Š” readOnly๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.

์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ œ์•ˆํ•˜๋“ฏ ์ดˆ๊นƒ๊ฐ’๋งŒ ์ง€์ •ํ•˜๋ ค๋ฉด defaultChecked๋ฅผ ๋Œ€์‹  ์ „๋‹ฌํ•˜์„ธ์š”.

// โœ… ์ข‹์€ ์˜ˆ: ์ œ์–ด๋˜์ง€ ์•Š๋Š” ์ฒดํฌ๋ฐ•์Šค์— ์ดˆ๊นƒ๊ฐ’ ์ „๋‹ฌ
<input type="checkbox" defaultChecked={something} />

์ฒดํฌ๋ฐ•์Šค๋ฅผ state ๋ณ€์ˆ˜๋กœ ์ œ์–ดํ•˜๋ ค๋ฉด onChange ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

// โœ… ์ข‹์€ ์˜ˆ: ์ œ์–ด๋˜๋Š” ์ฒดํฌ๋ฐ•์Šค์— onChange ์ „๋‹ฌ
<input type="checkbox" checked={something} onChange={e => setSomething(e.target.checked)} />

์ฃผ์˜ํ•˜์„ธ์š”!

์ฒดํฌ๋ฐ•์Šค์—์„œ๋Š” e.target.value๊ฐ€ ์•„๋‹Œ e.target.checked๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์˜๋„์ ์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ์ด๋ผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด readOnly prop์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

// โœ… ์ข‹์€ ์˜ˆ: ์ œ์–ด๋˜๋Š” ์ฝ๊ธฐ ์ „์šฉ input์— onChange ์ƒ๋žต
<input type="checkbox" checked={something} readOnly={true} />

ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์ž…๋ ฅ ์ปค์„œ๊ฐ€ input์˜ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค

input์„ ์ œ์–ดํ•  ๊ฒฝ์šฐ onChange ์•ˆ์—์„œ state ๋ณ€์ˆ˜๋ฅผ DOM์—์„œ ๋ฐ›์•„์˜จ input ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

state ๋ณ€์ˆ˜๋Š” e.target.value (ํ˜น์€ ์ฒดํฌ๋ฐ•์Šค์—์„œ๋Š” e.target.checked) ์™ธ์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

function handleChange(e) {
// ๐Ÿ”ด ๋ฒ„๊ทธ: input์„ e.target.value ์™ธ์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
setFirstName(e.target.value.toUpperCase());
}

๋น„๋™๊ธฐ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.

function handleChange(e) {
// ๐Ÿ”ด ๋ฒ„๊ทธ: input์„ ๋น„๋™๊ธฐ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
setTimeout(() => {
setFirstName(e.target.value);
}, 100);
}

์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๋ ค๋ฉด e.target.value๋กœ ๋™๊ธฐ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.

function handleChange(e) {
// โœ… ์ œ์–ด๋˜๋Š” input์„ e.target.value๋กœ ๋™๊ธฐ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
setFirstName(e.target.value);
}

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค input์ด DOM์—์„œ ์ œ๊ฑฐ๋œ ํ›„ ๋‹ค์‹œ ์ถ”๊ฐ€๋˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ๋ฆฌ๋ Œ๋”๋ง๋งˆ๋‹ค state๋ฅผ ์žฌ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ น input์ด๋‚˜ input์˜ ๋ถ€๋ชจ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋งค๋ฒˆ ๋‹ค๋ฅธ key ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ์ •์˜๋ฅผ ์ค‘์ฒฉ์‹œํ‚ค๋Š” ๊ฒฝ์šฐ(์ด๋Š” ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ โ€˜๋‚ด๋ถ€โ€™ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•ญ์ƒ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋กœ ๊ฐ„์ฃผ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค)์— ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. โ€œA component is changing an uncontrolled input to be controlled(์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ์–ด๋˜์ง€ ์•Š๋Š” input์„ ์ œ์–ด ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค)โ€

์ปดํฌ๋„ŒํŠธ์— value๋ฅผ ์ œ๊ณตํ•  ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด๋‚ด ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ๋‚จ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

React๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋น„์ œ์–ดํ•  ๊ฒƒ์ธ์ง€ ์ œ์–ดํ•  ๊ฒƒ์ธ์ง€ ์˜๋„๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—” value={undefined}๋ฅผ ์ „๋‹ฌํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๋‹ค์‹œ value="some string"์„ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ œ์–ด๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ null์ด๋‚˜ undefined๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด value๋ฅผ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

value๊ฐ€ API๋‚˜ state ๋ณ€์ˆ˜์—์„œ ์˜จ๋‹ค๋ฉด null์ด๋‚˜ undefined๋กœ ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด('')์„ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ value๊ฐ€ ๋ฌธ์ž์—ด์ž„์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด value={someValue ?? ''}๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฒดํฌ๋ฐ•์Šค์— checked๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ถˆ๋ฆฌ์–ธ์ž„์„ ๋ณด์žฅํ•˜์„ธ์š”.