<textarea>
<textarea>
๋ธ๋ผ์ฐ์ ๋ด์ฅ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ค์ ํ
์คํธ input์ ๋ ๋๋งํ ์ ์์ต๋๋ค.
<textarea />
- ๋ ํผ๋ฐ์ค
- ์ฌ์ฉ๋ฒ
- ๋ฌธ์ ํด๊ฒฐ
- ํ ์คํธ ์์ญ์ ํ์ดํ์ ํด๋ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค
- ํค๋ณด๋๋ฅผ ๋๋ฅผ ๋๋ง๋ค ํ ์คํธ ์ปค์๊ฐ ํ ์คํธ ์์ญ์ ์ฒ์์ผ๋ก ๋์๊ฐ๋๋ค
- ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฉ๋๋ค. โA component is changing an uncontrolled input to be controlled(์ปดํฌ๋ํธ๊ฐ ์ ์ด๋์ง ์๋ input์ ์ ์ด ์ํ๋ก ๋ณ๊ฒฝํฉ๋๋ค)โ
๋ ํผ๋ฐ์ค
<textarea>
ํ
์คํธ ์์ญ์ ํ์ํ๋ ค๋ฉด <textarea>
๋ธ๋ผ์ฐ์ ๋ด์ฅ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ธ์.
<textarea name="postContent" />
์๋ ๋ ๋ง์ ์์๊ฐ ์์ต๋๋ค.
Props
<textarea>
๋ ์ผ๋ฐ์ ์ธ ์๋ฆฌ๋จผํธ props๋ฅผ ์ง์ํฉ๋๋ค.
ํ
์คํธ ์์ญ์ ์ ์ดํ๋ ค๋ฉด value
prop์ ์ ๋ฌํ์ธ์.
value
: ๋ฌธ์์ด ํ์ . ํ ์คํธ ์์ญ ๋ด๋ถ์ ํ ์คํธ๋ฅผ ์ ์ดํฉ๋๋ค.
value
๋ฅผ ์ ๋ฌํ ๋ ๋ฐ๋์ ํด๋น ๊ฐ์ ์
๋ฐ์ดํธํ๋ onChange
ํธ๋ค๋ฌ๋ ํจ๊ป ์ ๋ฌํด์ผ ํฉ๋๋ค.
<textarea>
๊ฐ ์ ์ด๋์ง ์๋ ๊ฒฝ์ฐ defaultValue
prop์ ๋์ ์ ๋ฌํด๋ ๋ฉ๋๋ค.
defaultValue
: ๋ฌธ์์ด ํ์ . ํ ์คํธ ์์ญ ์ด๊น๊ฐ์ ์ง์ ํฉ๋๋ค.
๋ค์์ <textarea>
props๋ ์ ์ด๋์ง ์๋ ํ
์คํธ ์์ญ๊ณผ ์ ์ด๋๋ ํ
์คํธ ์์ญ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค.
autoComplete
: โonโ ๋๋ โoffโ. ์๋ ์์ฑ ๋์์ ์ง์ ํฉ๋๋ค.autoFocus
: ๋ถ๋ฆฌ์ธ ํ์ .true
์ผ ๊ฒฝ์ฐ React๋ ๋ง์ดํธ ์ ์๋ฆฌ๋จผํธ์ ํฌ์ปค์ค๋ฅผ ๋ง์ถฅ๋๋ค.children
:<textarea>
๋ ์์์ ๋ฐ์ง ์์ต๋๋ค. ์ด๊น๊ฐ์ ์ค์ ํ๋ ค๋ฉดdefaultValue
๋ฅผ ์ฌ์ฉํ์ธ์.cols
: ์ซ์ ํ์ . ํ๊ท ๋ฌธ์ ๋๋น์ ๊ธฐ๋ณธ ๋๋น๋ฅผ ์ง์ ํ์ธ์. ๊ธฐ๋ณธ๊ฐ์20
์ ๋๋ค.disabled
: ๋ถ๋ฆฌ์ธ ํ์ .true
์ผ ๊ฒฝ์ฐ input์ ์ํธ์์ฉ์ด ๋ถ๊ฐ๋ฅํด์ง๋ฉฐ ํ๋ฆฟํ๊ฒ ๋ณด์ ๋๋ค.form
: ๋ฌธ์์ด ํ์ . ํ ์คํธ ์์ญ input์ด ์ํ๋<form>
์id
๋ฅผ ์ง์ ํฉ๋๋ค. ์๋ต ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ ํผ์ผ๋ก ์ค์ ๋ฉ๋๋ค.maxLength
: ์ซ์ ํ์ . ํ ์คํธ์ ์ต๋ ๊ธธ์ด๋ฅผ ์ง์ ํฉ๋๋ค.minLength
: ์ซ์ ํ์ . ํ ์คํธ์ ์ต์ ๊ธธ์ด๋ฅผ ์ง์ ํฉ๋๋ค.name
: ๋ฌธ์์ด ํ์ . ํผ๊ณผ ์ ์ถ๋๋ input์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.onChange
:์ด๋ฒคํธ
ํธ๋ค๋ฌ ํจ์. ์ ์ด๋๋ ํ ์คํธ ์์ญ ํ์ ์์๋ก ๊ฐ๋ น ์ฌ์ฉ์๊ฐ ํค๋ณด๋๋ฅผ ๋๋ฅผ ๋๋ง๋ค ์คํ๋๋ ๋ฐฉ์์ผ๋ก input ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฆ์ ์คํ๋๋ฉฐ ๋ธ๋ผ์ฐ์ input
์ด๋ฒคํธ์ฒ๋ผ ๋์ํฉ๋๋ค.onChangeCapture
: ์บก์ฒ ๋จ๊ณ์์ ์คํ๋๋onChange
onInput
:์ด๋ฒคํธ
ํธ๋ค๋ฌ ํจ์. ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฆ์ ์คํ๋ฉ๋๋ค. ์ง๊ธ๊น์ง์ ์ฉ๋ฒ์ ๋น์ถฐ๋ดค์ ๋ React์์๋ ์ ์ฌํ๊ฒ ๋์ํ๋onChange
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ด์ต์ ์ ๋๋ค.onInputCapture
: ์บก์ฒ ๋จ๊ณ์์ ์คํ๋๋onInput
onInvalid
:์ด๋ฒคํธ
ํธ๋ค๋ฌ ํจ์. ํผ ์ ์ถ ์ input์ด ์ ํจํ์ง ์์ ๊ฒฝ์ฐ ์คํ๋๋ฉฐinvalid
๋ด์ฅ ์ด๋ฒคํธ์ ๋ฌ๋ฆฌ ReactonInvalid
์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง๋ฉ๋๋ค.onInvalidCapture
: ์บก์ฒ ๋จ๊ณ์์ ์คํ๋๋onInvalid
onSelect
:์ด๋ฒคํธ
ํธ๋ค๋ฌ ํจ์.<textarea>
๋ด๋ถ์ ์ ํ ์ฌํญ์ด ๋ณ๊ฒฝ๋ ํ ์คํ๋ฉ๋๋ค. React๋onSelect
์ด๋ฒคํธ๋ฅผ ํ์ฅํ์ฌ ์ ํ ์ฌํญ์ด ๋น๊ฑฐ๋ ํธ์ง ์ ์ ํ ์ฌํญ์ ์ํฅ์ ๋ผ์น๊ฒ ๋ ๋๋ ์คํ๋ฉ๋๋ค.onSelectCapture
: ์บก์ฒ ๋จ๊ณ์์ ์คํ๋๋onSelect
placeholder
: ๋ฌธ์์ด ํ์ . ํ ์คํธ ์์ญ ๊ฐ์ด ๋น์์ ๋ ํ๋ฆฐ ์์ผ๋ก ํ์๋ฉ๋๋ค.readOnly
: ๋ถ๋ฆฌ์ธ ํ์ .true
์ผ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ํ ์คํธ ์์ญ์ ํธ์งํ ์ ์์ต๋๋ค.required
: ๋ถ๋ฆฌ์ธ ํ์ .true
์ผ ๊ฒฝ์ฐ ํผ์ด ์ ์ถํ ๊ฐ์ ๋ฐ๋์ ์ ๊ณตํด์ผ ํฉ๋๋ค.rows
: ์ซ์ ํ์ . ํ๊ท ๋ฌธ์ ๋์ด์ ๊ธฐ๋ณธ ๋์ด๋ฅผ ์ง์ ํ์ธ์. ๊ธฐ๋ณธ๊ฐ์2
์ ๋๋ค.wrap
:'hard'
,'soft'
,'off'
์ค ํ๋. ํผ ์ ์ถ ์ ํ ์คํธ๋ฅผ ๊ฐ์ธ๋ ๋ฐฉ์์ ์ง์ ํฉ๋๋ค.
๊ฒฝ๊ณ
<textarea>something</textarea>
์ ๊ฐ์ด ์์์ ์ ๋ฌํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. ์ด๊ธฐ ์ฝํ ์ธ ๋กdefaultValue
๋ฅผ ์ฌ์ฉํ์ธ์.- ํ
์คํธ ์์ญ์ ๋ฌธ์์ด
value
prop์ ๋ฐ์ ๊ฒฝ์ฐ ์ ์ด๋๋ ๊ฒ์ผ๋ก ์ทจ๊ธ๋ฉ๋๋ค. - ํ ์คํธ ์์ญ์ ์ ์ด๋๋ฉด์ ๋์์ ๋น์ ์ด๋ ์ ์์ต๋๋ค.
- ํ ์คํธ ์์ญ์ ์๋ช ์ฃผ๊ธฐ ๋์ ์ ์ด ๋๋ ๋น์ ์ด ์ํ๋ฅผ ์ค๊ฐ ์ ์์ต๋๋ค.
- ์ ์ด๋๋ ํ
์คํธ ์์ญ์ ๋ชจ๋ ๋ฐฑ์
๊ฐ์ ๋๊ธฐ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋
onChange
์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ์ํฉ๋๋ค.
์ฌ์ฉ๋ฒ
ํ ์คํธ ์์ญ ํ์ํ๊ธฐ
ํ
์คํธ ์์ญ์ ํ์ํ๋ ค๋ฉด <textarea>
๋ฅผ ๋ ๋๋งํ์ธ์. rows
์ cols
์ดํธ๋ฆฌ๋ทฐํธ๋ก ํ
์คํธ ์์ญ์ ๊ธฐ๋ณธ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์๋ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ํ
์คํธ ์์ญ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค. ํฌ๊ธฐ ์กฐ์ ์ ๋นํ์ฑํํ๋ ค๋ฉด CSS์์ resize: none
์ ์ง์ ํ์ธ์.
export default function NewPost() { return ( <label> Write your post: <textarea name="postContent" rows={4} cols={40} /> </label> ); }
ํ ์คํธ ์์ญ ๋ผ๋ฒจ ์ ๊ณตํ๊ธฐ
์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ <textarea>
๋ <label>
ํ๊ทธ ์์ ๋๊ฒ ๋๋๋ฐ ์ด๋ ๊ฒ ํ๋ฉด ํด๋น ๋ผ๋ฒจ์ด ํด๋น ํ
์คํธ ์์ญ๊ณผ ์ฐ๊ด๋จ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ผ๋ฒจ์ ํด๋ฆญํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํ
์คํธ ์์ญ์ ํฌ์ปค์ค๋ฅผ ๋ง์ถฅ๋๋ค. ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ฌ์ฉ์๊ฐ ํ
์คํธ ์์ญ์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ ๋ ๋ผ๋ฒจ ์บก์
์ ์ฝ๊ฒ ๋๋ฏ๋ก ์ด ๋ฐฉ์์ ์ ๊ทผ์ฑ์ ์ํด์๋ ํ์์
๋๋ค.
<label>
์์ <textarea>
๋ฅผ ๊ฐ์ ์ ์๋ค๋ฉด <textarea id>
์ <label htmlFor>
์ ๋์ผํ ID๋ฅผ ์ ๋ฌํด์ ์ฐ๊ด์ฑ์ ๋ถ์ฌํ์ธ์. ํ ์ปดํฌ๋ํธ์ ์ฌ๋ฌ ์ธ์คํด์ค ๊ฐ ์ถฉ๋์ ํผํ๋ ค๋ฉด useId
๋ก ๊ทธ๋ฌํ ID๋ฅผ ์์ฑํ์ธ์.
import { useId } from 'react'; export default function Form() { const postTextAreaId = useId(); return ( <> <label htmlFor={postTextAreaId}> Write your post: </label> <textarea id={postTextAreaId} name="postContent" rows={4} cols={40} /> </> ); }
ํ ์คํธ ์์ญ ์ด๊น๊ฐ ์ ๊ณตํ๊ธฐ
ํ
์คํธ ์์ญ ์ด๊น๊ฐ์ ์ ํ์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. defaultValue
๋ฌธ์์ด๋ก ์ ๋ฌํ์ธ์.
export default function EditPost() { return ( <label> Edit your post: <textarea name="postContent" defaultValue="I really enjoyed biking yesterday!" rows={4} cols={40} /> </label> ); }
ํผ ์ ์ถ ์ ํ ์คํธ ์์ญ ๊ฐ ์ฝ๊ธฐ
textarea์ <button type="submit">
๋ฐ๊นฅ์ <form>
์ผ๋ก ๊ฐ์ธ๋ฉด ๋ฒํผ์ ํด๋ฆญํ์ ๋ <form onSubmit>
์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ํ์ฌ URL์ ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ํ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉฐ ์ด๋ฌํ ๋์์ e.preventDefault()
๋ฅผ ํธ์ถํ์ฌ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. ํผ ๋ฐ์ดํฐ๋ new FormData(e.target)
๋ก ์ฝ์ผ์ธ์.
export default function EditPost() { function handleSubmit(e) { // Prevent the browser from reloading the page e.preventDefault(); // Read the form data const form = e.target; const formData = new FormData(form); // You can pass formData as a fetch body directly: fetch('/some-api', { method: form.method, body: formData }); // Or you can work with it as a plain object: const formJson = Object.fromEntries(formData.entries()); console.log(formJson); } return ( <form method="post" onSubmit={handleSubmit}> <label> Post title: <input name="postTitle" defaultValue="Biking" /> </label> <label> Edit your post: <textarea name="postContent" defaultValue="I really enjoyed biking yesterday!" rows={4} cols={40} /> </label> <hr /> <button type="reset">Reset edits</button> <button type="submit">Save post</button> </form> ); }
state ๋ณ์๋ก ํ ์คํธ ์์ญ ์ ์ดํ๊ธฐ
<textarea />
์ ๊ฐ์ ํ
์คํธ ์์ญ์ ์ ์ด๋์ง ์์ต๋๋ค. <textarea defaultValue="Initial text" />
์ ๊ฐ์ ์ด๊น๊ฐ์ ์ ๋ฌํ๋๋ JSX๋ ๋น์ฅ์ ๊ฐ์ด ์๋ ์ด๊น๊ฐ๋ง์ ์ง์ ํฉ๋๋ค.
์ ์ด๋๋ ํ
์คํธ ์์ญ์ ๋ ๋๋งํ๋ ค๋ฉด value
prop์ ์ ๋ฌํ์ธ์. React๋ ์ ๋ฌํ value
๋ฅผ ํญ์ ๊ฐ๋๋ก ํ
์คํธ ์์ญ์ ๊ฐ์ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ
์คํธ ์์ญ์ state ๋ณ์๋ฅผ ์ ์ธํ์ฌ ์ ์ดํฉ๋๋ค.
function NewPost() {
const [postContent, setPostContent] = useState(''); // state ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
// ...
return (
<textarea
value={postContent} // input ๊ฐ์ด state ๋ณ์์ ์ผ์นํ๋๋ก ๊ฐ์ ํฉ๋๋ค.
onChange={e => setPostContent(e.target.value)} // ํ
์คํธ ์์ญ์ ํธ์งํ ๋๋ง๋ค state ๋ณ์๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
/>
);
}
์ด ๋ฐฉ์์ ํค๋ณด๋๋ฅผ ๋๋ฅผ ๋๋ง๋ค ๊ทธ์ ๋ํ ๋ฐ์์ผ๋ก UI ์ผ๋ถ๋ฅผ ๋ฆฌ๋ ๋๋งํ๊ณ ์ ํ ๋ ์ ์ฉํฉ๋๋ค.
import { useState } from 'react'; import MarkdownPreview from './MarkdownPreview.js'; export default function MarkdownEditor() { const [postContent, setPostContent] = useState('_Hello,_ **Markdown**!'); return ( <> <label> Enter some markdown: <textarea value={postContent} onChange={e => setPostContent(e.target.value)} /> </label> <hr /> <MarkdownPreview markdown={postContent} /> </> ); }
๋ฌธ์ ํด๊ฒฐ
ํ ์คํธ ์์ญ์ ํ์ดํ์ ํด๋ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค
onChange
์์ด value
๋ง ์ ๋ฌํ์ฌ ํ
์คํธ ์์ญ์ ๋ ๋๋งํ๋ฉด ์ฝ์์ ์๋ฌ๊ฐ ๋ํ๋ฉ๋๋ค.
// ๐ด ๋ฒ๊ทธ: ์ ์ด๋๋ ํ
์คํธ ์์ญ์ onChange ํธ๋ค๋ฌ๊ฐ ์์ต๋๋ค.
<textarea value={something} />
onChange
ํธ๋ค๋ฌ ์์ด value
prop๋ง ์ ๋ฌํ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๊ธฐ ์ ์ฉ ํ๋๋ฅผ ๋ ๋๋งํ๊ฒ ๋ฉ๋๋ค. ํ๋๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํด์ผ ํ๋ ๊ฒฝ์ฐ defaultValue
๋ฅผ ์ฌ์ฉํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ onChange
๋๋ readOnly
๋ฅผ ์ค์ ํ์ธ์.์๋ฌ ๋ฉ์์ง๊ฐ ์ ์ํ๋ฏ ์ด๊น๊ฐ๋ง ์ง์ ํ๋ ค๋ฉด defaultVallue
๋ฅผ ๋์ ์ ๋ฌํ์ธ์.
// โ
์ข์ ์: ์ ์ด๋์ง ์๋ ํ
์คํธ ์์ญ์ ์ด๊น๊ฐ ์ ๋ฌ
<textarea defaultValue={something} />
ํ
์คํธ ์์ญ์ state ๋ณ์๋ก ์ ์ดํ๋ ค๋ฉด onChange
ํธ๋ค๋ฌ๋ฅผ ์ง์ ํ์ธ์.
// โ
์ข์ ์: ์ ์ด๋๋ ํ
์คํธ ์์ญ์ onChange ์ ๋ฌ
<textarea value={something} onChange={e => setSomething(e.target.value)} />
๊ฐ์ด ๋ด๋ถ์ ์ผ๋ก ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ๋ฉด ์๋ฌ๋ฅผ ๋ง๊ธฐ ์ํด readOnly
prop์ ์ถ๊ฐํ์ธ์.
// โ
์ข์ ์: ์ ์ด๋๋ ์ฝ๊ธฐ ์ ์ฉ ํ
์คํธ ์์ญ์ onChange ์๋ต
<textarea value={something} readOnly={true} />
ํค๋ณด๋๋ฅผ ๋๋ฅผ ๋๋ง๋ค ํ ์คํธ ์ปค์๊ฐ ํ ์คํธ ์์ญ์ ์ฒ์์ผ๋ก ๋์๊ฐ๋๋ค
ํ
์คํธ ์์ญ์ ์ ์ดํ ๊ฒฝ์ฐ onChange
์์์ state ๋ณ์๋ฅผ DOM์์ ๋ฐ์์จ ํ
์คํธ ์์ญ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
state ๋ณ์๋ e.target.value
์ธ์ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
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);
}
์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ ํค๋ณด๋๋ฅผ ๋๋ฅผ ๋๋ง๋ค ํ
์คํธ ์์ญ์ด ์ ๊ฑฐ ํ ๋ค์ ์ถ๊ฐ๋๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ค์๋ก ๋ฆฌ๋ ๋๋ง๋ง๋ค state๋ฅผ ์ฌ์ค์ ํ๊ณ ์๋ค๋ฉด ๋ํ๋ ์ ์๋ ํ์์
๋๋ค. ๊ฐ๋ น ํ
์คํธ ์์ญ์ด๋ ํ
์คํธ ์์ญ์ ๋ถ๋ชจ ์ค ํ๋๊ฐ ๋งค๋ฒ ๋ค๋ฅธ key
์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ฐ๊ฑฐ๋ ์ปดํฌ๋ํธ ์ ์๋ฅผ ์ค์ฒฉ์ํค๋ ๊ฒฝ์ฐ(์ด๋ React์์ ํ์ฉ๋์ง ์์ผ๋ฉฐ ๋ ๋๋ง๋ง๋ค โ๋ด๋ถโ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ง์ดํธ๋๋ ์์ธ์ด ๋ฉ๋๋ค)์ ํด๋น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฉ๋๋ค. โ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 ?? ''}
๋ฅผ ์ ๋ฌํ์ธ์.