์ค๋์ React Hooks
์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
react 16.8 ๋ฒ์ ์์ ์๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ
ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ํ๊ด๋ฆฌ๋ ๊ทธ ์ธ ๊ธฐ๋ฅ์ ์ํํ๋๋ก ํจ
๋ํ์ ์ผ๋กuseState
,useEffect
,useReducer
,useMemo
๋ฑ์ด ์กด์ฌ
state
ํฌ์คํ
์์ ์ ๊น ๋ค๋ฃจ์๋ ๊ฐ๋
์ธ๋ฐ์!
๋ค์ ์ ๋ฆฌํด๋ณด์๋ฉด, useState
๋ ํจ์ํ ์ปดํฌ๋ํธ์์ state๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ Hooks
์
๋๋ค.
๋จผ์ , useState
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ import๋ฅผ ํด์ค๋๋ค.
import {useState} from "react";
useState
๊ฐ ํธ์ถ๋๋ฉด[์ํ, ์ํ๋ฅผ ๊ฐฑ์ ํด์ฃผ๋ ํจ์]
๊ฐ ๋ฐํ๋๋๋ฐ์! ์๋ ์ฝ๋์์๋ count์ setCountํจ์๊ฐ ๋๊ฒ ์ฃ ?
const Counter = () => {
const[count, setCount] = useState(0);
return(
<div>
<h1>ํ์ฌ ์ซ์ : {count}</h1>
<button onClick={() => {setCount(count + 1)}}> +1 </button>
<button onClick={() => {setCount(count - 1)}}> -1 </button>
</div>
);
};
+1
๋ฒํผ์ ๋๋ฅด๋ฉด setCount(count + 1)
์ด ์๋๋๋ฉด์ count๋ฅผ +1๋งํผ ๊ฐฑ์ ํด์ค๋๋ค.
๋ฐ๋๋ก -1
๋ฒํผ์ ๋๋ฅด๋ฉด setCount(count - 1)
์ด ์๋๋๋ฉด์ count๋ฅผ -1๋งํผ ์๋ก์ด ์ํ๋ก ๊ฐฑ์ ํด์ค๋๋ค.
useEffect
๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํน์ ์์
์ ์ํํ๋๋ก ์ค์ ํด์ฃผ๋ Hooks
์ธ๋ฐ์!
useEffect
ํจ์๋ ์คํํ ํจ์์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ ๋๊ฐ์ง๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.
import React, {useState, useEffect} from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('์คํ!');
},[]);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
};
export default Counter;
์ ์ฝ๋์ ๊ฐ์ด []
๋น ๋ฐฐ์ด์ ๋๋ฒ์งธ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด,
useReducer
๋ ์ปดํฌ๋ํธ์ ์ํฉ์ ๋ฐ๋ฅธ ์ํ๋ฅผ ์
๋ฐ์ดํธํ ๋ ์ฌ์ฉํ๋ Hooks
์
๋๋ค. useReducer
๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ ๋ก์ง๊ณผ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌ์ํฌ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
useReducer
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋จผ์ import๊ฐ ํ์ํฉ๋๋ค.
import { useReducer } from 'react';
โ Reducer
๋ ํ์ฌ ์ํ์ ์
๋ฐ์ดํธ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ด์ ์ก์
๊ฐ์ ์ ๋ฌ๋ฐ์ ์ํ๋ฅผ ๋ฐํํด์ฃผ๋ ํจ์์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด state
์ action
์ ์ธ์๋ก ๊ฐ์ง๋ reducer()
๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
useReducer()
๋ฅผ ์ฌ์ฉํ์ฌ ์ฒซ๋ฒ์งธ ์ธ์์๋ ์์์ ๋ง๋ reducer()
ํจ์๋ฅผ, ๋๋ฒ์งธ ์ธ์์๋ reducer์ ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ค๋๋ค.
const Counter = () => {
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<div>
<p>
ํ์ฌ ์ซ์ : {state.count}
</p>
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+1</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>-1</button>
</div>
);
};
useCallback
์ ์ฃผ๋ก ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ ๋ ์ฌ์ฉํ๋๋ฐ์. ์์ฑํ ํจ์์ ๋ฐฐ์ดํํ์ ์ฒดํฌํ ๊ฐ์ ์ธ์๋ก ๋ฐ์์!
import React, { useState, useCallback } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const onChangeCount = useCallback(() => {
console.log(count);
},[]);
return (
<div>
<p> ํ์ฌ ์ซ์ : {count}</p>
<button onClick={() => setCount(count + 1)} onChange={onChangeCount}>
+1
</button>
</div>
);
};
export default Counter;
์์ ์ฝ๋์ ๊ฐ์ด []
๋น ๋ฐฐ์ด์ ๋๋ฒ์งธ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด Counter์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ ๋ฑ ํ๋ฒ๋ง onChangeCount()
ํจ์๊ฐ ์์ฑ๋ฉ๋๋ค.
๋ฐ๋๋ก ๋ฐฐ์ด์ ๊ฐ์ด ์๋ฐ๋ฉด, ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ถ๊ฐ ๋ ๋๋ง๋ค ํจ์๋ฅผ ์์ฑํด์ค๋๋ค.
useMemo
๋ useCallback
๊ณผ ์ ์ฌํ Hooks
์ธ๋ฐ์. useMemo
๋ ์ด์ ์ ์ฌ์ฉํ ๊ฐ์ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
์ค๋์ ๋ฆฌ์กํธ์ ๋ค์ํ hooks
์ ๋ํด ๊ณต๋ถํด ๋ณด์๋๋ฐ์. hooks
๋ฅผ ์ ํ์ฉํ์ฌ ์ข ๋ ์ต์ ํํ ์ ์๋ ์ฝ๋๋ฅผ ๋ง๋ค๋๋ก ํด๋ด์ผ๊ฒ ์ด์!
React ๊ณต์๋ฌธ์
๋ฒจ๋กํผํธ์ ํจ๊ปํ๋ ๋ชจ๋ ๋ฆฌ์กํธ