๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“บ Front End/- React, Next.js

[๋ฆฌ์•กํŠธ Hook ์‚ฌ์šฉํ•˜๊ธฐ] useState๋ฅผ ์ด์šฉํ•ด์„œ Functional Component์— state๋ฅผ ๊ด€๋ฆฌํ•˜์ž

by Wonit 2020. 8. 23.

๋ฆฌ์•กํŠธ์—์„œ State๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. Class ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ State
  2. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ State

๋ฆฌ์•กํŠธ ์ดˆ์‹ฌ์ž๋“ค์€ ์ง€๊ธˆ๊นŒ์ง€ ์ด๋Ÿฐ ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ์„ ๊ฒƒ์ด๋‹ค.

 

state๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Classํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค

 

๋งž๋Š” ๋ง์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ ๋ฆฌ์•กํŠธ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด์„œ ๋งŽ์€ ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

Classํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ 

  • ์žฌ์‚ฌ์šฉ์ด ์–ด๋ ต๋‹ค.
    ๋ฆฌ์•กํŠธ์˜ ์žฅ์ ์€ ์žฌ์‚ฌ์šฉ์„ฑ์— ์žˆ๋‹ค๊ณ  ๋ณธ์ธ์€ ์ƒ๊ฐํ•˜๋Š”๋ฐ, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ
    Component class ๋ถ€๋ถ„์ ์ธ ๋กœ์ง ๋ฐ API ์‚ฌ์šฉ์ด state๋ฅผ ์ด์šฉํ•˜๋Š” ์ฒ˜๋ฆฌ์— ์žฌ์‚ฌ์šฉ์— ์ œ์•ฝ ์‚ฌํ•ญ๋“ค์ด ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

  • ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค.
    Classํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ constructor, this-Binding๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•˜๋Š”๋ฐ ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ์˜ ๋ถ€๋ถ„์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ React Hooks

React Hooks์€ React 16.8๋ถ€ํ„ฐ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ด๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ js์˜ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตณํžˆ๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๊ณ  ์˜ค๋Š˜์€ ๊ทธ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

Class(Non Hook) vs Function (Hook)

์šฐ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ํ›…์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์™€ ํ›…์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋™์‹œ์— ํ™•์ธํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์˜ˆ์ •์ด๋‹ค.

InputByClass ์ปดํฌ๋„ŒํŠธ

import React, { Component } from 'react';

class InputByClass extends Component {

    /////////////////////////////////////////
  constructor(props) {
    super(props);
    this.state = {
      name: "",
      nicknamel: ""
    }
  }
      ///////////////////////////////////////// Hook์ด ์ด ๋ถ€๋ถ„์„ ๋Œ€์ฒ˜ํ•œ๋‹ค.

  onChange = ({ target: { name, value } }) => {
    this.setState({
      [name]: value
    }
    )
  }

  onReset = () => {
    this.setState({ name: "", nickname: "" })
  }

  render() {

    const { name, nickname } = this.state;

    return (
      <div>
        <h3>Classํ˜• ์ปดํฌ๋„ŒํŠธ</h3>
        <input name="name" onChange={this.onChange} placeholder="name" />
        <input name="nickname" onChange={this.onChange} placeholder="nickname" />
        <button onClick={this.onReset}>Reset</button>
        <div>
          <span>Info: </span>
          {name} ({nickname})
      </div>
      </div>
    );
  }
}
export default InputByClass;

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ constructor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์•ž์„œ ๋ง ํ–ˆ๋“ฏ์ด ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๋น„ํšจ์œจ์ ์ธ ๊ณผ์ •์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š”


useState๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ๊ด€๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ด๋‹ค.

InputByFunction ์ปดํฌ๋„ŒํŠธ

import React, { useState } from 'react';

const InputByFunction = () => {

//////////////////////////////////////////////////////////// Hook
  const [inputs, setInputs] = useState({
    nickname: "",
    name: ""
  });
//////////////////////////////////////////////////////////// Hook

  const { name, nickname } = inputs;

  const onChange = (e) => {
    const { value, name } = e.target;
    setInputs({
      ...inputs,
      [name]: value
    })
  }

  const onReset = () => {
    setInputs({
      [name]: ""
    })
  }

  return (
    <div>
      <h3>Function ์ปดํฌ๋„ŒํŠธ</h3>

      <input name="name" onChange={onChange} placeholder="name" />
      <input name="nickname" onChange={onChange} placeholder="nickname" />
      <button onClick={onReset}>Reset</button>
      <div>
        <span>Info: </span>
        {name} ({nickname})
      </div>
    </div>
  );
}

export default InputByFunction;

ํ›…์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด react์— ์กด์žฌํ•˜๋Š” useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š”

 

const [state๊ฐ’ ์ €์žฅ ๋ณ€์ˆ˜, state๋ฅผ ๋ณ€๊ฒฝํ•  ํ•จ์ˆ˜] = useState(์ดˆ๊ธฐํ™”)

 

์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ์„ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

App ์ปดํฌ๋„ŒํŠธ

import React from "react";
import InputSample from "./components/InputByFunction";
import Input from './components/InputByClass';
const App = () => {

  return (
    <div>
      <InputByFunction />
      <InputByClass />
    </div>
  );
}
export default App;

 

๋งˆ์ง€๋ง‰์œผ๋กœ App ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ“๊ธ€