๐Ÿ“’TIL) React Hooks

TaeYangยท2021๋…„ 10์›” 24์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
2/2


์ง€๊ธˆ๊นŒ์ง€ React๋ฅผ class์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์™”์—ˆ๋Š”๋ฐ ์š”๋ฒˆ์ฃผ์— Hooks์„ ๋ฐฐ์šฐ๊ฒŒ ๋˜์–ด ์–ด๋–ค ๊ฐœ๋…์ธ์ง€ ์ •๋ฆฌํ• ๊ฒธ ๊ธ€์„ ์จ๋ณผ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

Hooks์€ ๋ญ˜๊นŒ?

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค.

Hook์€ props, state, context, refs, ๊ทธ๋ฆฌ๊ณ  lifecycle์™€ ๊ฐ™์€ React ๊ฐœ๋…์— ์ข€ ๋” ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Hook์€ ์ด ๊ฐœ๋…๋“ค์„ ์—ฎ๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Class๋ฅผ ๋‘๊ณ  Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

  • ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. (๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ, Lifecycle API)
componentDidMount() {
	applyFirstLogic()
	applySecondLogic()
}
// ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ - Data fetching
useEffect(() => {
	applyFirstLogic()
}, [])

// ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ - Attach event listener
useEffect(() => {
	applySecondLogic()
}, [])
  • State๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์€ ํ•ญ์ƒ ์ตœ์‹  โ‡’ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ํž˜๋“ฌ(๋ฒ„๊ทธ ๋ฐœ์ƒ)

    ์ธ์Šคํƒ€ ๊ทธ๋žจ์œผ๋กœ ๊ฐ„๋‹จํžˆ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ์ด ์ธ์Šคํƒ€ ๊ทธ๋žจ์€ ํŒ”๋กœ์šฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด 3์ดˆ๋’ค์— ํŒ”๋กœ์šฐ๊ฐ€ ๋˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค ์ƒ๊ฐํ•ด๋ณด์ž ํ•จ์ˆ˜ํ˜•์€ Dan์—์„œ ํŒ”๋กœ์šฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  Sophie๋กœ ์ด๋™์„ ํ•ด๋„ Dan์ด ํŒ”๋กœ์šฐ๊ฐ€ ๋˜๋Š” ๋ฐ˜๋ฉด ํด๋ž˜์Šคํ˜• ๋ฒ„ํŠผ์„ Sophie์—์„œ ๋ˆ„๋ฅด๊ณ  Dan์ด ํŒ”๋กœ์šฐ๊ฐ€ ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์„ ์–ธ์—์„œ ๋‹ฌ๋ผ์ง„์ 

Class

import React, { Component } from 'react';

export class Haha extends Component {
  render() {
    return (
      <div>
        <h1>ํ•˜์ด</h1>
      </div>
    );
  }
}

export default Haha;

Hooks

import React from 'react';

function Hm() {
  return <h1>ํ•˜์ด</h1>;
}

export default Hm;

state ์„ ์–ธ์€ ์–ด๋–ป๊ฒŒ?

์—ฌ๊ธฐ์—์„œ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋‹ค Classํ˜•์€ constructor() super() ๋ฅผ ์„ ์–ธํ•ด ๊ทธ ์•ˆ์— state๊ฐ’์„ ์„ ์–ธํ•ด ์ฃผ์ง€๋งŒ Hooks ์—์„  const ์•ˆ์— ๋ฐฐ์—ด๋กœ state์™€ setState๋ฅผ ์„ ์–ธํ•˜๊ณ  useState(์ดˆ๊ธฐ๊ฐ’)์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

Class

import React, { Component } from 'react';

export class Haha extends Component {
  constructor() {
    super();
    this.state = {
      count: 0,
    };
  }
  render() {
    return <h1>ํ•˜์ด</h1>;
  }
}

export default Haha;

Hooks

import React, { useState } from 'react';

function Hm() {
  const [count, setcount] = useState(0);
  return <h1>ํ•˜์ด</h1>;
}

export default Hm;

Hooks ์‚ฌ์šฉ ๊ทœ์น™

  • ์ตœ์ƒ์œ„์—์„œ๋งŒ Hooks์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hooks์„ ์‹คํ–‰ ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
import React, { useState } from "react"

function Hooks(props) {
	if (!props.isExist) {
		const [state, setState] = useState(); // Error!
	}
	const [state2, setState2] = useState(); // Error!
}

// react๊ฐ€ ์—ฌ๋Ÿฌ ํ›…๋“ค์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ •๋ณด๋Š” ํ›…์ด ์‚ฌ์šฉ๋œ ์ˆœ์„œ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ.
  • React ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธย ๋‚ด์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

useEffect

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์ธ Hooks์—์„œ๋Š” componentDidMount , componentDidUpdate ๊ฐ™์€ LifeCycle์„ ์“ธ์ˆ˜๊ฐ€ ์—†๋‹ค
๊ทธ๋ž˜์„œ ํ•„์š”ํ•œ๊ฒŒ useEffect ์ด๋‹ค.

useEffect(() => {}, []) // 

์œ„์—์ฒ˜๋Ÿผ ์ธ์ž๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์˜์กด์„ฑ ๋ฐฐ์—ด์€ ๋ฐฐ์—ด ์•ˆ์— ๋‹ด๊ธด ๊ฐ’๋“ค์„ ์ถ”์ ํ•˜๊ณ  ๊ทธ๋•Œ ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ ํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

profile
์Œ์•… ์ „๊ณต ์ด์˜€๋˜ ์˜ˆ๋น„ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์žโ˜€๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€