๐ Hook์ ํจ์ ์ปดํฌ๋ํธ์์ React state์ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ(lifecycle features)์ "์ฐ๋(hook into)" ํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์์ด๋ค.-React ๊ณต์ ๋ฌธ์-
โช๏ธ Hook์ class ์์์๋ ๋์ํ์ง ์๋๋ค.
โช๏ธ ๋์ class ์์ด๋ React๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋ค.(ํ์ง๋ง ์ด๋ฏธ ์ง๋์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์์ฑ ํ๋๊ฒ์ ๊ถ์ฅํ์ง ์์. ๋์ ์๋ก ์์ํ๋ ์ปดํฌ๋ํธ๋ถํฐ๋ Hook์ ์ด์ฉํ๋ฉด ๋จ)
โช๏ธ React๋ useState
๊ฐ์ ๋ด์ฅ Hook์ ๋ช ๊ฐ์ง ์ ๊ณตํ๋ค.
โช๏ธ ์ปดํฌ๋ํธ ๊ฐ์ ์ํ ๊ด๋ จ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด Hook์ ์ง์ ๋ง๋๋ ๊ฒ(custom hook)๋ ๊ฐ๋ฅํ๋ค.
โช๏ธ Hook์ state๋ฅผ ์ํด์ ์กด์ฌํ๋ค. ํ์์ ์ํด์ ์ฌ์ฉํจ
โช๏ธ Hook์ ํจ์์ ๋ชจ์์ง์ด๋ค.
๐ธ์ปดํฌ๋ํธ ์ฌ์ด์์ ์ํ์ ๊ด๋ จ๋ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค(HOC,render props)
๐ธ๋ณต์กํ ์ปดํฌ๋ํธ๋ค์ ์ดํด๊ฐ ์ด๋ ต๋ค.(๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ, Lifecycle API)
๐ธClass๋ ์ฌ๋๊ณผ ๊ธฐ๊ณ๋ฅผ ํผ๋์ํจ๋ค.
(1) state, ๋ผ์ดํ ์ฌ์ดํด ๋๋ฌธ์ ์ฌ์ฉ
(2) ๋ง์น ์๋ช
์ฒด์ฒ๋ผ ํด๋์ค๋ก๋ถํฐ ํ๋ฒ ์ธ์คํด์ค๊ฐ ์์ฑ์ด ๋๊ณ ๋๋ฉด ๋
๋ฆฝ์ ์ผ๋ก ์์ง์ผ ์ ์๋ค
(3) ๋ฐ๋ฉด ํจ์๋ ํ๋ฒ ํธ์ถ๋๊ณ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ฌ๋ผ์ง => state, ๋ผ์ดํ ์ฌ์ดํด ๋ถ๊ฐ๋ฅ
โ ๏ธ ํด๋์ค ์ฌ์ฉํด๋ณด๋ ํด๊ฒฐํ๊ธฐ ํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์กด์ฌ
(1) 2018๋
, React v16.8 Hooks ์ฒซ ๋ฐฐํฌ
(2) ํจ์๋ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋๋ค๋๋ฐ, ์ด๋ป๊ฒ state,๋ผ์ดํ์ฌ์ดํด์ ๊ตฌํํ๋?
(3) ํด๋ก์ ! (ํจ์ ์์ ํจ์!)
โ๏ธ๊ท์น 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์ ํธ์ถํ ์ ์๋ ์ถ๊ฐ์ ์ธ ๊ณณ.๋ฑ ํ๊ตฐ๋ฐ)
โช๏ธ state: ์ํ
โช๏ธ ๋จ์ด ๋ป ๊ทธ๋๋ก ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ ์ํ๊ฐ์ด๋ค.
โช๏ธ state๋ ํ๋ฉด์ ๋ณด์ฌ์ค ์ปดํฌ๋ํธ์ UI ์ ๋ณด(์ํ)์ด๋ค.
โช๏ธ 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
๋ก ์ ์ํ๋ค.
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'๋ฅผ ๋ด๊ณ ์๋ ๋ณ์
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>
ํ๊ทธ ๊ธ์ ์์ ๋ณ๊ฒฝ