React์ defaultValue vs value
๐ง Input์ ๊ฐ์ ์ด๋ป๊ฒ ๋ณ์์ ์ ์ฅํ ๊น!?
Vue.js์์๋ v-model
์ด๋ผ๋ ์์ฑ์ผ๋ก ์ฝ๊ฒ input์ ๊ฐ์ ๋ณ์์ ์ ์ฅํด์ ์ฌ์ฉํ ์ ์์๋ค.
React๋ฅผ ํ๋ฉด์ v-model๊ณผ ๊ฐ์ด Input๊ฐ์ ์ด๋ป๊ฒ ๋ณ์๋ฅผ ์ ์ฅํ ์ ์์์ง๋ฅผ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ defaultValue์ value ๋ผ๋ ์์ฑ๊ฐ์ด ๋์๊ณ , ๋์ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด๊ธฐ๋ก ํ์๋ค.
์ฐธ๊ณ ๋ก, onChange
์ด๋ฒคํธ๋ฅผ ์ด์ฉํด ์ง์ ํ ๋น์ ํด์ค์ผ ํ๋ ๋ค๋ฅธ ์ ์ด ์์ง๋ง, ์ง๊ธ ๊ธ๊ณผ๋ ์ฃผ์ ๋ ์กฐ๊ธ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์๋ ์ฝ๋๋ง ๊ฐ๋จํ ์ดํด๋ณด๋๊ฒ์ผ๋ก ํ๊ฒ ์ต๋๋ค.
const [value, setValue] = useState(initialValue);
const onChange: ChangeEventHandler<HTMLInputElement> = (event) => {
setValue(event.target.value);
};
<input value={value} onChange={onChange}/>
์์ ์ฝ๋์ฒ๋ผ, event๋ฅผ ์ด์ฉํด ์ค์ ๊ฐ์ ๋ณ์์ ํ ๋นํด์ฃผ๋ฉด ๋๋ค.
๐ defaultValue vs value
interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
defaultValue?: string | number | ReadonlyArray<string> | undefined;
}
interface AllHTMLAttributes<T> extends HTMLAttributes<T> {
value?: string | ReadonlyArray<string> | number | undefined;
}
์ค์ type์ ๋ณด๋ฉด, ๋๊ฐ์ type์ ๋ค๋ฅธ interface์ ์ ์๋์ด ์์ต๋๋ค.
์ด์ ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1๏ธโฃ defaultValue๋?
defaultValue๋ ์ฃผ๋ก ๋น์ ์ด ์ปดํฌ๋ํธ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธ๋ผ ์ฌ๊ธฐ์ ๋น์ ์ด ์ปดํฌ๋ํธ๋? ๊ธฐ์กด์ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฉ์์ ์๊ฐํ๋ฉด ๋๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ํผ์ ์ ์ถํ ๋ ๋ฒํผ์ ํด๋ฆญ ํ ๋, ์์ ๋ด๋ถ์ ๊ฐ์ ์ป์ด์๋ค. ์ด์ ์ ์ฌํ๊ฒ ๋น์ ์ด ์ปดํฌ๋ํธ์ดํดํ๋ฉฐ๋๊ณ ๊ฐ์ด ์ค์๊ฐ์ผ๋ก ๋๊ธฐํ ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค.
์์ธ๋ฌ ๋น์ ์ด ์ปดํฌ๋ํธ๋ useState
๊ฐ ์๋ ref
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Email:
<input defaultValue="example@example.com" type="email"
ref={this.email} />
</label>
<input type="submit" value="Submit" />
</form>
);
2๏ธโฃ value๋?
value๋ defaultValue์ ๋ค๋ฅด๊ฒ ์ ์ด ์ปดํฌ๋ํธ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
input, textarea, select ๋ฑ ์์ฒด์ ์ผ๋ก ์ํ๋ฅผ ์ ์งํ๊ณ ์ฌ์ฉ์ ์
๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์
๋ฐ์ดํธ๋ฅผ ํ๋ ๊ฒ์ ์ ์ด ์ปดํฌ๋ํธ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. ์ํ ์์ฑ์ด ๊ณ์ ์ ์ง๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ useState
์ ์ฌ์ฉ๋ฉ๋๋ค.
์์ธ๋ฌ ๊ฐ์ด ๊ณ์ ๋ณ๊ฒฝ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ onChange
์ด๋ฒคํธ๋ฅผ ์ง์ ํด setState
์ ๊ฐ์ด ๊ฐ์ ์ฑํฌ๋ฅผ ๋ง์ถฐ์ค์ผ ํฉ๋๋ค.
React ์ง์์์๋ Form์ ๊ตฌํํ ๋๋ value
๋ฅผ ๋ ๊ถ์ฅํฉ๋๋ค.
class NewsletterForm extends React.Component {
constructor(props) {
super(props);
this.state = {
email: ''
};
}
handleEmail = (e) => {
this.setState({
email: e.target.value
});
}
render() {
return (
<form>
<label>
Email:
<input type="email" value={this.state.email}
onChange={this.handleEmail}/>
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
export default NewsletterForm;
โ๏ธ ๊ทธ๋ผ ์ ์ด๊ฑธ ์์๋ณด๊ฒ ๋์๋๊ฐ?
๊ฐ๋ฐ ์ค์ ์๋์ ๊ฐ์ ๊ฒฝ๊ณ ๋ฅผ ๋ง๋๊ฒ ๋์์ต๋๋ค.
Warning: Failed prop type:
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`.
onChange๊ฐ ์์ด value๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๊ณ , readOnly๋, onChange ๋์ค์ ํ๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์๋๋ฉด defaultValue๋ฅผ ์ฌ์ฉํ๋ผ๋ ๊ฒฝ๊ณ ์ ๋๋ค.
๋ณธ์ธ์ ์ฝ๋๋ฅผ ํ์ธ ํ์ ์ ์ ํ ํ๋จ์ ํตํด ํด๋น ์๋ฌ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐ์ด ๋ญ๋๋ค ๐
์ถ์ฒ
https://scriptverse.academy/tutorials/reactjs-defaultvalue-value.html
'Frontend > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React์ StoryBook์ ์ ํ๋ณด์. (0) | 2022.07.10 |
---|---|
10 JavaScript concepts for React beginners(React ์ด๋ณด์๋ฅผ ์ํ 10๊ฐ์ง JavaScript ๊ฐ๋ ) (0) | 2022.04.17 |
<> Fragments? </>๋? (0) | 2021.12.05 |