Frontend/React

React์˜ defaultValue vs value

Seyun(Marco) 2022. 1. 16. 13:54
728x90

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

728x90
728x90