React์˜ ๊ณ ์ˆ˜ ๐ŸŸข

[๋ฆฌ์•กํŠธ] forms ์ •๋ฆฌ โœจ

์ฝ”๋”ฉํ•˜๋Š” ํฌ๋ฃจ 2023. 9. 23. 15:51

์ฐธ๊ณ ์ž๋ฃŒ: ์ธํ”„๋Ÿฐ-๋ฆฌ์•กํŠธ๊ฐ•์˜

 

[๋ฌด๋ฃŒ] ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ(React) - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ CSS ๊ธฐ์ดˆ ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ ๋ฆฌ์•กํŠธ์˜ ๊ธฐ์ดˆ๋ฅผ ํƒ„ํƒ„ํ•˜๊ฒŒ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ๊น”๋”ํ•œ ๊ฐ•์˜์ž๋ฃŒ, ๊ผผ๊ผผํ•œ ์„ค๋ช…์œผ๋กœ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ๋ฆฌ์•กํŠธ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ๐Ÿ‘จ‍๐Ÿซ ๋ฆฌ์•กํŠธ์˜ ์„ธ๊ณ„๋กœ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ’ซ

www.inflearn.com

 

 

form์ด๋ž€?

์–‘์‹, ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ 

์—ฌ๊ธฐ์‚ฌ html์˜ ํผ๊ณผ ๋ฆฌ์•กํŠธ์˜ ํผ์€ ์ข€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. 

html ํผ์€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์—†์Œ

 

1. form 

์ด ์˜ˆ์‹œ ์ฝ”๋“œ๋งŒ ๋ด๋„, 

๋‹จ์ˆœํžˆ type, name๋งŒ ์ ์šฉ๋˜์ง€ ์ด๊ฒƒ์ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์–ดํ•  ์ˆ˜๋Š” ์—†๋‹ค 

 

 

ํ•˜์ง€๋งŒ, ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.  -> controlled component 

์ฆ‰, component element๋ž€ ๊ฐ’์ด ๋ฆฌ์•กํŠธ์˜ ํ†ต์ œ๋ฅผ ๋ฐ›๋Š” input form element 

 

๋‹ค์‹œ ํ•œ๋ฒˆ, html๊ณผ ๋ฆฌ์•กํŠธ ํผ์„ ๋น„๊ต ๋ถ„์„ํ•ด๋ณด์ž 

html์—์„œ๋Š” ๊ฐ element๊ฐ€ ๊ฐ state๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜๊ฒŒ๋Š” ์‰ฌ์šด ์ผ์ด ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ์•ˆ์— state์— ๋ชจ๋‘ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋จ ๋˜, state ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” setState๊ฐ’์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ๋‹ค. 

 

 

 

 

์ด ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด value ๊ฐ’์— ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ state์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ๋‹ค ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ ๊ทธ๋ž˜์„œ state์˜ ๊ฐ’์ด input์— ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋Š” ๊ฒƒ! 

๋˜, ์ž…๋ ฅ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ ์šฉ๋˜๋Š” onChange์— handleChangeํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. handleChangeํ•จ์ˆ˜์—์„œ๋Š” setValue ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ value๋ผ๋Š” ๊ฐ’์—  ์ ์šฉ์‹œํ‚จ๋‹ค. ๋˜, ์ฐธ๊ณ ๋กœ handleChange์˜ ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ event ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. event.target์€ ํ˜„์žฌ event๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€๊ฒŸ์„ ์˜๋ฏธํ•˜๊ณ , event.target.value๊ฐ’์€ ํ•ด๋‹น ์ด๋ฒคํŠธ ํƒ€๊ฒŸ์˜ value๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. 

 

์ฆ‰, ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์„ ์›ํ•˜๋Š”๋Œ€๋กœ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

2. ๋‹ค์–‘ํ•œ form ํƒœ๊ทธ

1) textarea ํƒœ๊ทธ : ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ๊ธด ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•œ html ํƒœ๊ทธ 

<textarea> 
์•ˆ๋…•ํ•˜์„ธ์š”. ์ง€๊ธˆ์€ ๋ฆฌ์•กํŠธ๋ฅผ ๋ฐฐ์šฐ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. 
</textarea>

์ด๋Ÿฐ ์‹์œผ๋กœ ใ…Žใ…Ž

 

 

2) select ํƒœ๊ทธ: drop-down(์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชฉ๋ก) ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” htmlํƒœ๊ทธ

์ด๋Ÿฐ ์‹์œผ๋กœ ๋“œ๋กญ๋‹ค์šด์—์„œ ํ•˜๋‚˜์˜ ์˜ต์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” form ํ•จ์ˆ˜

 

์ด๋Ÿฐ ์‹์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์˜ต์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค 

 

 

 

3)file-input ํƒœ๊ทธ: ๋””๋ฐ”์ด์Šค ์ €์žฅ์žฅ์น˜๋กœ๋ถ€ํ„ฐ ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” html ํƒœ๊ทธ

file inputํƒœ๊ทธ ์ฝ”๋“œ ๋ฐฉ์‹

์ฐธ๊ณ ๋กœ ์ด ํƒœ๊ทธ๋Š” uncontrolled component๋กœ ๊ฐ’์ด ๋ฆฌ์•กํŠธ์˜ ํ†ต์ œ๋ฅผ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. 

 

 

 

3. ์ฐธ๊ณ 

1) ๋งŒ์•ฝ, ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ input๊ฐ’์„ ์ ์šฉ์‹œํ‚ฌ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ

๊ทธ๋Ÿด๋•, ์—ฌ๋Ÿฌ๊ฐœ์˜ state๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.  -> multiple input

 

 

 

2) ๋˜๋Š” value ๊ฐ’์„ ๋„ฃ๋˜, ๊ฐ’์„ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด -> input null value

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ์ฒ˜์Œ์—๋Š” hi๋ผ๋Š” ๋ฒจ๋ฅ˜๊ฐ’์ด ์ •ํ•ด์ ธ ์žˆ๋‹ค๊ฐ€ 

1์ดˆ ๋’ค์— value ๊ฐ’์— null์ด ๋„ฃ์–ด์ง€๋ฉด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋Ÿฝ๊ฒŒ input ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค!