[React] Hooks | State & Event

๐Ÿ™‹๐Ÿปโ€โ™€๏ธยท2022๋…„ 5์›” 12์ผ
0

wecode

๋ชฉ๋ก ๋ณด๊ธฐ
32/40

โœ”๏ธ1. Hook

๐Ÿ”1-1. Hooks?

๐ŸŒž Hook์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ React state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ(lifecycle features)์„ "์—ฐ๋™(hook into)" ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.-React ๊ณต์‹ ๋ฌธ์„œ-

โ–ช๏ธ Hook์€ class ์•ˆ์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
โ–ช๏ธ ๋Œ€์‹  class ์—†์ด๋„ React๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.(ํ•˜์ง€๋งŒ ์ด๋ฏธ ์งœ๋†“์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์ž‘์„ฑ ํ•˜๋Š”๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ. ๋Œ€์‹  ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ๋Š” Hook์„ ์ด์šฉํ•˜๋ฉด ๋จ)
โ–ช๏ธ React๋Š” useState ๊ฐ™์€ ๋‚ด์žฅ Hook์„ ๋ช‡ ๊ฐ€์ง€ ์ œ๊ณตํ•œ๋‹ค.
โ–ช๏ธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Hook์„ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๊ฒƒ(custom hook)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
โ–ช๏ธ Hook์€ state๋ฅผ ์œ„ํ•ด์„œ ์กด์žฌํ•œ๋‹ค. ํ•„์š”์— ์˜ํ•ด์„œ ์‚ฌ์šฉํ•จ
โ–ช๏ธ Hook์€ ํ•จ์ˆ˜์˜ ๋ชจ์Œ์ง‘์ด๋‹ค.


๐Ÿ”1-2. ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ?

::๊ณต์‹ ๋ฌธ์„œ

๐Ÿ”ธ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค(HOC,render props)
๐Ÿ”ธ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ดํ•ด๊ฐ€ ์–ด๋ ต๋‹ค.(๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ, Lifecycle API)
๐Ÿ”ธClass๋Š” ์‚ฌ๋žŒ๊ณผ ๊ธฐ๊ณ„๋ฅผ ํ˜ผ๋™์‹œํ‚จ๋‹ค.


๐Ÿ”1-3. Classํ˜• ์ปดํฌ๋„ŒํŠธ vs Function ์ปดํฌ๋„ŒํŠธ

::ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ž€?

(1) state, ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋•Œ๋ฌธ์— ์‚ฌ์šฉ
(2) ๋งˆ์น˜ ์ƒ๋ช…์ฒด์ฒ˜๋Ÿผ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ํ•œ๋ฒˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ์ด ๋˜๊ณ  ๋‚˜๋ฉด ๋…๋ฆฝ์ ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค
(3) ๋ฐ˜๋ฉด ํ•จ์ˆ˜๋Š” ํ•œ๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์‚ฌ๋ผ์ง => state, ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋ถˆ๊ฐ€๋Šฅ
โš ๏ธ ํด๋ž˜์Šค ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ํ•ด๊ฒฐํ•˜๊ธฐ ํž˜๋“  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ ์กด์žฌ


:: ํด๋กœ์ €(Closure), ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ๋‚ ๊ฐœ๋ฅผ ๋‹ฌ์•„์ฃผ๋‹ค

(1) 2018๋…„, React v16.8 Hooks ์ฒซ ๋ฐฐํฌ
(2) ํ•จ์ˆ˜๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ state,๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ตฌํ˜„ํ–ˆ๋‚˜?
(3) ํด๋กœ์ €! (ํ•จ์ˆ˜ ์•ˆ์˜ ํ•จ์ˆ˜!)


๐Ÿ”1-4. Hook ์‚ฌ์šฉ ๊ทœ์น™

โœ๏ธ๊ทœ์น™ 1: ์ตœ์ƒ์œ„(at the top level)์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์—ฌ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ์‹คํ–‰ํ•˜์ง€ ๋ง๊ธฐ

import React, { useState } from "react"

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

  const [state2, setState2] = useState(); //Error!

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

โœ๏ธ๊ทœ์น™ 2: React ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค. ์ผ๋ฐ˜ JavaScript ํ•จ์ˆ˜์—์„œ๋Š” Hook์„ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.(custom Hook ๋‚ด>>> Hook์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€์ ์ธ ๊ณณ.๋”ฑ ํ•œ๊ตฐ๋ฐ)





โœ”๏ธ2. State & Event

๐Ÿณ1. State

โ–ช๏ธ state: ์ƒํƒœ
โ–ช๏ธ ๋‹จ์–ด ๋œป ๊ทธ๋Œ€๋กœ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๊ฐ’์ด๋‹ค.
โ–ช๏ธ state๋Š” ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ์˜ UI ์ •๋ณด(์ƒํƒœ)์ด๋‹ค.
โ–ช๏ธ state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉฐ ์–ผ๋งˆ๋˜์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿณ2. State ์ •์˜

โ–ช๏ธ ์œ„์—์„œ state๋Š” >>> ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ์˜ ์ •๋ณด
โ–ช๏ธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ state, ์ฆ‰ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž


โœ๏ธFunction component | state

import React, { useState } from 'react';

function State() {
 const [color, setColor] = useState('red');

 return (
  <div>
   <h1>Function Component | State</h1>
  </div>
  );
 }

 export default State;

โ–ช๏ธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์€ JSX ์š”์†Œ๊ฐ€ return๋ฌธ ์•ˆ์— ์žˆ๋‹ค
โ–ช๏ธ state๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” ํ™”๋ฉด์— ๋ณด์ด๋“ฏ์ด useStateํ•จ์ˆ˜๋ฅผ import ํ•œ ํ›„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
โ–ช๏ธ useStateํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ๋ฌธ(function State())๊ณผ return๋ฌธ ์‚ฌ์ด์— ์ž‘์„ฑํ•œ๋‹ค.
โ–ช๏ธ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” ์ƒํƒœ๊ฐ’์ด ์ €์žฅ๋˜๋Š” ๋ณ€์ˆ˜์ด๊ณ , ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋Š” ์ƒํƒœ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
โ–ช๏ธ ์ฆ‰, ์œ„ ์˜ˆ์ œ์—์„œ๋Š” state๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜๋ฅผ color๋กœ, color์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ setColor๋กœ ๊ทธ๋ฆฌ๊ณ  color์˜ ์ดˆ๊ธฐ๊ฐ’์„ red๋กœ ์ •์˜ํ–ˆ๋‹ค.


๐Ÿณ3. State ์‚ฌ์šฉ ์˜ˆ์‹œ

state์—์„œ ์ƒํƒœ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ์ด์œ ๋Š” ๊ฒฐ๊ตญ ์ปดํฌ๋„ŒํŠธ ์•ˆ์˜ ์š”์†Œ์—์„œ ๊ทธ ์ƒํƒœ๊ฐ’์„ ๋ฐ˜์˜ํ•ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ํšจ์œจ์ ์œผ๋กœ ํ™”๋ฉด(UI)์— ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•จ์ด๋‹ค.
โ–ช๏ธ return๋ฌธ ์•ˆ์— <hi>ํƒ€์ดํ‹€ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค.
โ–ช๏ธ ํ•ด๋‹น ์š”์†Œ์˜ ๊ธ€์ž ์ƒ‰์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„ค์ •ํ•œ state ๊ฐ’์œผ๋กœ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ,
โ–ช๏ธ ๋‹ค์Œ์˜ ์ˆœ์„œ๋Œ€๋กœ state ๊ฐ’์„ ํŠน์ • ์š”์†Œ์—์„œ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ–ช๏ธ ์šฐ์„  JSX ์š”์†Œ์— ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ๊ทธ ์ค‘์—์„œ๋„ ๊ธ€์ž์ƒ‰์„ ์„ค์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

<h1 style={{ color: }}>Function Component | State</h1>

โ–ช๏ธ useState ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•œ state๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜, color๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ color์†์„ฑ์˜ value๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค.

<h1 style={{ color: color }}>Function Component | State</h1>

//key๊ฐ’ color๋Š” ์ƒ‰์ƒ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ
//value๊ฐ’ color๋Š” useState ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ๊ฐ’์ธ 'red'๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜

๐Ÿณ4. Event & state ๋ณ€๊ฒฝ

import React, { useState } from 'react';

function State() {
 const [color, setColor] = useState('red');

 return (
  <div>
   <h1 style={{ color: color }}>Function Component | State</h1>
   <button onClick={() => setColor('blue')}>Click</button>
  </div>
 );
}

export default State;

โ–ช๏ธ <h1>ํƒœ๊ทธ ์•„๋ž˜์— <button>์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.
โ–ช๏ธ color๋ผ๋Š” ์ƒํƒœ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜, setColorํ•จ์ˆ˜ ์‹คํ–‰
โ–ช๏ธ setColor ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด์„œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€ ๊ฐ’ 'blue'์— ์˜ํ—ค color์˜ ๊ฐ’์ด 'red'์—์„œ 'blue'๋กœ ๋ณ€๊ฒฝ
โ–ช๏ธ ์ƒํƒœ๊ฐ’์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด์„œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ render ๋˜๊ณ  ๋ฐ”๋€ state ๊ฐ’์„ ๋ฐ˜์˜ํ•˜์—ฌ <h1> ํƒœ๊ทธ ๊ธ€์ž ์ƒ‰์ƒ ๋ณ€๊ฒฝ

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