Jieunny์ ๋ธ๋ก๊ทธ
S4) Unit 4. [React] React Hooks ๋ณธ๋ฌธ
๐ฃ Hook ์ด๋?
๐ญ. Hook
โ๏ธ ํจ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๋ฉ์๋
โฐ ํจ์ ์ปดํฌ๋ํธ ์ด์ ์๋ ํด๋์ค ์ปดํฌ๋ํธ๊ฐ ์์๋ค.
๐ฎ. Class Component
class Counter extends Component {
constructor(props) {
super(props);
this.state = {
counter: 0
}
this.handleIncrease = this.handleIncrease.bind(this);
}
handleIncrease = () => {
this.setState({
counter: this.state.counter + 1
})
}
render(){
return (
<div>
<p>You clicked {this.state.counter} times</p>
<button onClick={this.handleIncrease}>
Click me
</button>
</div>
)
}
}
โฐ ๋จ์ํ ์นด์ดํ ๊ธฐ๋ฅ๋ง ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋๋ผ๋ ์์ฒ๋ผ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
โฐ ์ดํดํ๊ธฐ ์ด๋ ต๊ณ , ์ปดํฌ๋ํธ ์ฌ์ด์์ ์ํ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์๋ค.
โฐ ๋ํ this๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ฉด ๋์ ๋ฐฉ์ ์์ฒด๊ฐ ์ด๋ ต๊ฒ ๋๊ปด์ง๋ค.
๐ฏ. Function Component
function Counter () {
const [counter, setCounter] = useState(0);
const handleIncrease = () => {
setCounter(counter + 1)
}
return (
<div>
<p>You clicked {counter} times</p>
<button onClick={handleIncrease}>
Click me
</button>
</div>
)
}
โฐ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋นํด ํจ์ฌ ๋ ์ง๊ด์ ์ด๊ณ , ๋ณด๊ธฐ ์ฝ๋ค.
โฐ ๋ํ useState() ์ฒ๋ผ Hook์ ์ฌ์ฉํด์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋์ด๋ state๊ฐ ์ ์ง๋ ์ ์๊ฒ ๊ตฌํํ ์ ์๋ค.
๐ฐ. Hook ์ด๋?
โ๏ธ Hook์ class๋ฅผ ์์ฑํ์ง ์๊ณ ๋ state์ ๋ค๋ฅธ React์ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
โฐ ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ ๊ฐ ๋ฐ ๋ค๋ฅธ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ๊ฒ ํด์ฃผ๋ ๋ฉ์๋
โฐ Hook์ ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ๋์ํ์ง ์๋๋ค => ์ฌ์ฉํ๋ฉด ์๋ฌ ๋์ด๋ค.
๐ฑ. Hook ์ฌ์ฉ ๊ท์น
1๏ธโฃ ๋ฆฌ์กํธ ํจ์์ ์ต์์์์๋ง ํธ์ถํด์ผ ํ๋ค.
โ๏ธ ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ์คํํ๋ฉด ์์ํ ๋๋ก ๋์ํ์ง ์์ ์ ์๋ค.
...
if(counter) {
const [sample, setSample] = useState(0);
}
...
โฐ useState๋ฅผ ์กฐ๊ฑด๋ฌธ ์์์ ํธ์ถํ๋ฉด ์ ๋๋ค๋ Error๋ฅผ ๋์ด๋ค.
โฐ React๋ ์ด Hook์ ํธ์ถ๋๋ ์์๋๋ก ์ ์ฅ์ ํด๋๋๋ฐ, ์กฐ๊ฑด๋ฌธ์ด๋ ๋ฐ๋ณต๋ฌธ์์ ํธ์ถํ๊ฒ ๋๋ฉด ํธ์ถ๋๋ ์์๋ฅผ ์ ์ฅํ๊ธฐ ์ด๋ ค์์ง๋ค.
2๏ธโฃ ์ค์ง ๋ฆฌ์กํธ ํจ์ ๋ด์์๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ค.
โ๏ธ ๋ฆฌ์กํธ ํจ์ํ ์ปดํฌ๋ํธ๋ ์ปค์คํ Hook์ด ์๋ ๋ค๋ฅธ ์ผ๋ฐ JavaScript ํจ์ ์์์ ํธ์ถํด์๋ ์ ๋๋ค.
...
window.onload = function () {
useEffect(() => {
// do something...
}, [counter]);
}
...
โฐ window.onload๋ผ๋ ํจ์์์ useEffect๋ฅผ ํธ์ถํ๋ฉด ์ ๋๋ค๋ Error๋ฅผ ๋์ด๋ค.
โฐ Hook์ React์ ํจ์ ์ปดํฌ๋ํธ ๋ด์์ ์ฌ์ฉ๋๋๋ก ๋ง๋ค์ด์ง ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ์ ๊ทผ๋ณธ์ ์ผ๋ก ์ผ๋ฐ JavaScript ํจ์ ๋ด์์๋ ์ ์์ ์ผ๋ก ๋์๊ฐ์ง ์๋๋ค.
๐ฃ useMemo๋?
๐ญ. useMemo
โ๏ธ ํน์ ๊ฐ(value)๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ Hook
import { useMemo } from "react";
function Calculator({value}){
const result = useMemo(() => calculate(value), [value]);
return <>
<div>
{result}
</div>
</>;
}
// props๋ก ๋์ด์จ value ๊ฐ์ calculate ๋ผ๋ ํจ์์ ์ธ์๋ก ๋๊ฒจ์
// result ๊ฐ์ ๊ตฌํ ํ, <div> ์๋ฆฌ๋จผํธ๋ก ์ถ๋ ฅ
โฐ ๋ ๋๋ง์ ํ ๋๋ง๋ค ์ด ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, ๊ณ์ฐ์ ๊ฑธ๋ฆฌ๋ ๋ช ์ด์ ์ง์ฐ์ด ๋ ๋๋ง์๋ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ค.
โฐ useMemo๋ฅผ ์ฌ์ฉํด์ value ๊ฐ์ ์ด๋๊ฐ์ ์ ์ฅ์ ํด๋จ๋ค๊ฐ ๋ค์ ๊บผ๋ด์ ์ธ ์ ์๊ฒ ๋ง๋ ๋ค.
(ํธ์ถ๋๋ ํจ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๊ฒ ์๋!)
โฐ ์ด์ ์ ๊ตฌ์ถ๋ ๋ ๋๋ง๊ณผ ์๋ก์ด ๊ตฌ์ถ๋๋ ๋ ๋๋ง์ ๋น๊ตํด์ value๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ์๋ ์ด์ ๋ ๋๋ง์ value ๊ฐ์ ๊ทธ๋๋ก ์ฌํ์ฉ ํ ์ ์๊ฒ ๋๋ค => ๋ฉ๋ชจ์ด์ ์ด์
๐ฎ. Memoization
โ๏ธ ๊ธฐ์กด์ ์ํํ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ์ ํด๋๊ณ , ๋์ผํ ์ ๋ ฅ์ด ๋ค์ด์ค๋ฉด ์ฌํ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
โฐ ๊ตณ์ด ์ค๋ณต ์ฐ์ฐ์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฑ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
๐ฃ useCallback ์ด๋?
๐ญ. useCallback
โ๏ธ ํจ์์ ์ฌ์ฌ์ฉ์ ์ํด ์ฌ์ฉํ๋ Hook
/* useCallback๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์๋ ๊ผญ importํด์ ๋ถ๋ฌ์์ผ ํฉ๋๋ค. */
import React, { useCallback } from "react";
function Calculator({x, y}){
const add = useCallback(() => x + y, [x, y]);
return <>
<div>
{add()}
</div>
</>;
}
โฐ useCallback Hook์ ์ฌ์ฉํ๋ฉด ๊ทธ ํจ์๊ฐ ์์กดํ๋ ๊ฐ๋ค์ด ๋ฐ๋์ง ์๋ ํ ๊ธฐ์กด ํจ์๋ฅผ ๊ณ์ํด์ ๋ฐํํ๋ค.
โฐ ์ฆ, x์ y์ ๊ฐ์ด ๋์ผํ๋ค๋ฉด ๋ค์ ๋ ๋๋ง ๋ ์ด ํจ์๋ฅผ ๋ค์ ์ฌ์ฉํ๋ค.
โฐ useCallback์ ํจ์๋ฅผ ํธ์ถ์ ํ์ง ์๋ Hook์ด ์๋๋ผ, ๊ทธ์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ํจ์๋ฅผ ๊บผ๋ด์ ํธ์ถํ๋ Hook์ด๊ธฐ ๋๋ฌธ์ useMemo์ ๋นํด์ ์ต์ ํ๋ฅผ ๋๋ ์ ์๋ค.
โฐ ๋จ์ํ ์ปดํฌ๋ํธ ๋ด์์ ํจ์๋ฅผ ๋ฐ๋ณตํด์ ์์ฑํ์ง ์๊ธฐ ์ํด์ useCallback์ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค๋ ์์ ์ปดํฌ๋ํธ์ props๋ก ํจ์๋ฅผ ์ ๋ฌํด์ค ๋ ์ฌ์ฉํ๋ ๊ฒ ์ข๋ค.
๐ฎ. useCallback๊ณผ ์ฐธ์กฐ ๋๋ฑ์ฑ
โฐ React๋ ๋ฆฌ๋ ๋๋ง ์ ํจ์๋ฅผ ์๋ก ๋ง๋ค์ด์ ํธ์ถํ๋ฉฐ, ์ด ํจ์๋ ๊ธฐ์กด์ ํจ์์ ๊ฐ์ ํจ์๊ฐ ์๋๋ค.
(JS์์ ํจ์๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๋ ๊ฐ์ ์ ์ฅํ๋ ๊ฒ ์๋๋ผ ๊ฐ์ ์ฃผ์๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ)
โฐ useCallback์ ์ด์ฉํด ํจ์ ์์ฒด๋ฅผ ์ ์ฅํด์ ๋ค์ ์ฌ์ฉํ๋ฉด ํจ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๋ค๊ฐ ๋ค์ ์ฌ์ฉํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ๋ณผ ์ ์์ผ๋ฏ๋ก React ์ปดํฌ๋ํธ ํจ์ ๋ด์์ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋ ์์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ๋๊ธธ ๋ ์์์น ๋ชปํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ง์ ์ ์๋ค.
๐ฃ Custom Hooks ๋?
๐ญ. Custom Hooks
โ๏ธ ๊ฐ๋ฐ์๊ฐ ์ค์ค๋ก ์ปค์คํ ํ ํ
โ๏ธ Custom Hook์ ์ฅ์
โฐ ๋ฐ๋ณต๋๋ ๋ก์ง์ ํจ์๋ก ๋ฝ์๋ด์ ์ฌ์ฌ์ฉ ํ ์ ์๋ค.
โฐ ์ํ ๊ด๋ฆฌ ๋ก์ง์ ์ฌํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โฐ ํด๋์ค ์ปดํฌ๋ํธ๋ณด๋ค ์ ์ ์์ ์ฝ๋๋ก ๋์ผํ ๋ก์ง์ ๊ตฌํํ ์ ์๋ค.
โฐ ํจ์ํ์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ๋ช ๋ฃํ๋ค๋ ์ฅ์ ์ด ์๋ค.
โ๏ธ Custom Hook์ ์ ์ํ ๋์ ๊ท์น
โฐ Custom Hook์ ์ ์ํ ๋๋ ํจ์ ์ด๋ฆ ์์ use๋ฅผ ๋ถ์ด๋ ๊ฒ
โฐ ๋๊ฐ์ ๊ฒฝ์ฐ ํ๋ก์ ํธ ๋ด์ hooks ๋๋ ํ ๋ฆฌ์ Custom Hook์ ์์น ์ํจ๋ค.
โฐ Custom Hook์ผ๋ก ๋ง๋ค ๋ ํจ์๋ ์กฐ๊ฑด๋ถ ํจ์๊ฐ ์๋์ด์ผ ํ๋ค. ์ฆ return ํ๋ ๊ฐ์ ์กฐ๊ฑด๋ถ์ฌ์๋ ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋์ ์ด useFriendStatus Hook์ ์จ๋ผ์ธ ์ํ์ ์ฌ๋ถ๋ฅผ boolean ํ์ ์ผ๋ก ๋ฐํํ๊ณ ์๋ค.
๐ฎ. ์จ๋ผ์ธ์ธ์ง ์คํ๋ผ์ธ์ธ์ง ํ์ธํ๋ ํจ์
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
};
});
return isOnline;
}
โฐ ์ผ๋ฐ ํจ์์์๋ ๋ถ๊ฐ๋ฅ ํ์ง๋ง, custom Hook์ ๋ด๋ถ์ React ๋ด์ฅ Hook์ ์ฌ์ฉํ ์ ์๋ค.
โฐ ๊ฐ์ custom hook ์ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ state๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ์๋๋ค.
โฐ state๋ ์ปดํฌ๋ํธ ๋ด์์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์๋์ด ์๋ค.
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S4) Unit 5. [์ปดํจํฐ ๊ณตํ] ์ปดํจํฐ ๊ตฌ์กฐ (2) | 2023.03.27 |
---|---|
S4) Unit 4. [React] React์ ๊ธฐ๋ฅ (0) | 2023.03.23 |
S4) Unit 4. [React] Virtual DOM (0) | 2023.03.22 |
S4) Unit 3. [React] ๋ฒ๋ค๋ง๊ณผ ์นํฉ (0) | 2023.03.20 |
S4) Unit 2. [HTML/CSS] CSS ์ ๋๋ฉ์ด์ & Canvas (0) | 2023.03.17 |