- ๋ฆฌ์กํธ 16.8์์ ๋ฑ์ฅ
- Hook์ ์ฌ์ฉํ๋ฉด, ํด๋์ค์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ํจ์ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํด์ค๋ค!
Hook
- ๊ฐ๊ณ ๋ฆฌ
- ์๋ ์กด์ฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ๋ฆฌ๋ฅผ ๊ฑธ์ด ์ํ๋ ์์ ์ ์ ํด์ค ํจ์๊ฐ ์คํ๋๋๋ก ํจ.
- use~ ๋ก ์์ํจ.
๋ํ์ ์ธ Hook (use ์ด์ฉ๊ตฌ)
useState() ํ
- state๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ Hook
- ํจ์์ปดํฌ๋ํธ์์ ํด๋์ค์ปดํฌ๋ํธ์ฒ๋ผ state๋ฅผ ์ฐ๊ธฐ ์ํด์ ์ฌ์ฉํจ.
- ex) ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ๋ ๋๋ง์ด ๋์ด์ผ ํ๋ค. useState๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ๋ ๋๋ง์ด ๋๋๋ก ํจ.
- state๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ ๋๋ง๋๋๋กํ ๋ ์ฌ์ฉ๋๋ค.
- ์ฌ์ฉ๋ฒ
const [๋ณ์๋ช
, setํจ์๋ช
] = useState(state์ ์ด๊ธฐ๊ฐ);
* ๋ณ์ ๊ฐ๊ฐ์ ๋ํด setํจ์๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ค.
useEffect() ํ
- side effect๋ฅผ ์ํํ๊ธฐ ์ํ Hook
- side effect? ⇒ ์๋์๋ฏธ๋ ๋ถ์์ฉ์ด๋, ๋ฆฌ์กํธ์์๋ “ํจ๊ณผ”, “์ํฅ”์ ์๋ฏธํ๋ค.
- ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฉฐ, ๋ ๋๋ง์ด ๋๋ ์ดํ์ ์คํ๋๋ ์์ ๋ค.
- side effect? ⇒ ์๋์๋ฏธ๋ ๋ถ์์ฉ์ด๋, ๋ฆฌ์กํธ์์๋ “ํจ๊ณผ”, “์ํฅ”์ ์๋ฏธํ๋ค.
- componentDidMount, componentDidUpdate, componentWillUnmount ์ ๋์ผํ ์ญํ ์ ํ ์ ์๋ค.
- ๋ ๋๋ง๋ ๋๋ง๋ค ์คํ๋๋ค.
- ์ฌ์ฉ๋ฒ
- useEffect() ํ ์ return๋ถ๋ ์ปดํฌ๋ํธ๊ฐ unmount๋ ๋ ํธ์ถ๋๋ค.
- ํ๋์ ์ปดํฌ๋ํธ์ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์์กด์ฑ๋ฐฐ์ด ์์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์คํ๋๋,
- ๋ง์ง๋ง ์์กด์ฑ ๋ฐฐ์ด ์๋ต ์์๋ ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์คํ๋๋ค.
useMemo() ํ
- Memoized value๋ฅผ ๋ฆฌํดํ๋ ํ
useCallback() ํ
- ์์กด์ฑ๋ฐฐ์ด ๋ด ๋ณ์ ์ค ํ๋๋ผ๋ ๋ณ๊ฒฝ๋๋ฉด ํจ์๊ฐ ์คํ๋จ.
- ์์กด์ฑ๋ฐฐ์ด์ด ๋น์์ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง์ดํธ๋๋ ์์ ์๋ง ํ ๋ฒ ์คํ๋๋ฉฐ ์ดํ์๋ ์ ์๋์ง ์์. ⇒ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์.
useRef() ํ
- reference : ํน์ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด
- ๋ ๋๋ง๋ ๋๋ง๋ค ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํจ.
Hook์ ๊ท์น
- ํ
์ ๋ฌด์กฐ๊ฑด ์ต์์ ๋ ๋ฒจ์์๋ง ํธ์ถํด์ผ ํ๋ค.
- ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ์์ ํธ์ถํ๋ฉด ์๋๋ค. ์ปดํฌ๋ํธ ์์ ์ต์์ ๋ ๋ฒจ์์ ํธ์ถ๋์ด์ผ ํจ.
- ์กฐ๊ฑด๋ฌธ์ ๋ฐ๋ผ ์คํ๋๋ ํ ์ด ๋ฌ๋ผ์ง๋ฉด ์๋๋ค.
- ๋ฆฌ์กํธ ํจ์ ์ปดํฌ๋ํธ์์๋ง ํ ์ ํธ์ถํด์ผ ํ๋ค.
eslint-plugin-react-hooks
์ ์ ์ฝ๋๋ถ์๋๊ตฌ
๋ฆฌ์กํธ๊ฐ ํ
์ ๊ท์น์ ๋ฐ๋ฅด๋์ง ์ฒดํฌํด์ฃผ๋ ํ๋ฌ๊ทธ์ธ.
Custom Hook ๋ง๋ค๊ธฐ
- ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ก์ง์ ํ ์ผ๋ก ๋ง๋ค์ด ์ฌ์ฌ์ฉํ๊ธฐ ์ํจ.
- ์ค๋ณต๋๋ ๋ก์ง์ ์ปค์คํ ํ ์ผ๋ก ์ถ์ถํ๋ค.
- ์ปค์คํ ํ ์ ์ด๋ฆ์ ๊ผญ use๋ก ์์ํด์ผ ํ๋ค!
- ์ปค์คํ ํ ์ ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ชจ๋ state, effects๋ ์ ๋ถ ๋ถ๋ฆฌ๋์ด ์๋ค.
- ๊ฐ๊ฐ์ ์ปค์คํ ํ ํธ์ถ์ ๋ํด ๋ถ๋ฆฌ๋ state๋ฅผ ์ป๊ฒ ๋๋ค.
Hook ์ฌ์ฉํ๊ธฐ
useCounter.jsx
import React, {useState} from "react";
function useCounter(initialValue) {
const [count, setCount] = useState(initialValue);
const increaseCount = () => setCount((count) => count + 1);
const decreaseCount = () => setCount((count) => Math.max(count - 1, 0));
return [count, increaseCount, decreaseCount];
}
export default useCounter;
Accomodate.jsx
import React, {useState, useEffect} from "react";
import useCounter from "./useCounter";
const MAX_CAPACITY = 10;
function Accomodate(props) {
const [isFull, setIsFull] = useState(false);
const [count, increaseCount, decreaseCount] = useCounter(0);
// ์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋ ๋๋ง๋ค ํธ์ถ
useEffect(() => {
console.log("==================");
console.log("useEffect() is called.");
console.log(`isFull: ${isFull}`);
});
// cout ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ํธ์ถ
useEffect(() => {
setIsFull(count >= MAX_CAPACITY);
console.log(`Current count value: ${count}`);
}, [count]);
return (
<div style={{padding: 16}}>
<p>{`์ด ${count}๋ช
์์ฉํ์ต๋๋ค.`}</p>
<button onClick={increaseCount} disabled={isFull}>
์
์ฅ
</button>
<button onClick={decreaseCount}>ํด์ฅ</button>
{isFull && <p style={{color: "red"}}>์ ์์ด ๊ฐ๋ ์ฐผ์ต๋๋ค.</p>}
</div>
);
}
export default Accomodate;
index.js
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
//import App from "./App";
import reportWebVitals from "./reportWebVitals";
//import Library from "./chapter_03/Library";
// import Clock from "./chapter_04/Clock";
// import CommentList from "./chapter_05/CommentList";
// import NotificationList from "./chapter_06/NotificationList";
import Accomodate from "./chapter_07/Accomodate";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<Accomodate />
</React.StrictMode>
);
reportWebVitals();
๊ฒฐ๊ณผ
'Web > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] 7. State and Lifecycle (0) | 2023.11.05 |
---|---|
[React] 6. Components and Props (0) | 2023.11.05 |
[React] Error: react_dom_client__WEBPACK_IMPORTED_MODULE_1__.render is not a function (0) | 2023.11.05 |
[React] 6. Rendering Elements (0) | 2023.11.05 |
[React] Error: Already included file name (0) | 2023.11.05 |