
์ต์ ํ
์ต์ ํ์๋ ์ง์ ์ฝ๋๋ฅผ ๋์ผ๋ก ํ๋ํ๋ ๋ณด๊ณ ํ๋จํ๋ ์ ์ ์ธ ๋ถ์๊ณผ์ ์ด ์๊ณ , ํ๋ก๊ทธ๋จ ๋๊ตฌ๋ฅผ ์ด์ฉํด ์ฐพ์๋ด๋ ๋์ ๋ถ์์ด ์๋ค
๊ทผ๋ฐ ๋ ์์ง ๋ฐ๋ณด๋๊น ๋์ ๋ถ์์ ์ด์ฉํด๋ณด๊ธฐ๋ก ํจ..ใ

์ปดํฌ๋ํธ ํญ์์ Highlight updates when components render ๋ถ๋ถ์ ์ฒดํฌํด ์ฐพ์๋ณด๋๋ก ํ์
์ด ๊ธฐ๋ฅ์ ๋ญ๊ฐ๊ฐ ๋ฐ๋์์ ๋ ์ด๋ค state๋ค์ด ๋ณํ๊ฐ ๋๋์ง ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๋ ์ง ๋ณํ
๋ ์ง ๋ณํ์์ ์๋จ์ ํํฐ์ ์ ๊ธ์ฐ๋ ๋ฒํผ์ด ๊ณ์ ๋ ๋๊ฐ ๋๊ณ ์๋ ๋ชจ์ต์ ๋ณผ ์ ์์
๊ทผ๋ฐ ์ฌ์ค ์์ ๋ฐ๊พผ๋ค๊ณ ํด์ ๊ทธ๋ถ๋ถ์ด ์๋ก ๋ ๋ ๋ ํ์๊ฐ ์๋ค.
๊ทธ ๋ถ๋ถ์ controlMenu๋ก, Home์ปดํฌ๋ํธ์์ ์ผ๋จ increaseMonth, decreaseMonth๋ก ๋ ์ง๊ฐ ๋ฐ๋๊ณ , ๋ ๊ทธ ์์ ์์์ธ DiaryList ์ปดํฌ๋ํธ ์์ ์๋ controlMenu๊ฐ ๊ณ์ ๋ ๋๋ง ๋๋ ๊ฒ์ด๋ค.
controlMenu๋ฅผ React.memo๋ก ๊ฐ์ธ์ค๋ค.
const ControlMenu = React.memo(({ value, onChange, optionList }) => {
return (
<select
className="ControlMenu"
value={value}
onChange={(e) => onChange(e.target.value)}
>
{optionList.map((it, idx) => (
<option key={idx} value={it.value}>
{it.name}
</option>
))}
</select>
);
});
์ปดํฌ๋ํธ๋ฅผ React.memo๋ก ๊ฐ์ธ๋ฉด, ์ฆ React.memo ํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ฉด, ๊ฐํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋๋ ค์ฃผ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ด๋ค.
์ฆ, ์ ๋ฌ๋ฐ๋ prop์ ๊ฐ์ด ๋ฐ๋์ง ์์ผ๋ฉด ๋ ๋๋ง ๋์ง ์๋๋ค.
useState
DiaryList.js
const [sortType, setSortType] = useState("latest");
const [filter, setFilter] = useState("all");
์ด useState๋ฅผ ๋ง๋ ์ํ๋ณํํจ์๋ ๋ ๋๋ง์ด ์ผ์ด๋ฌ์ ๋๋ ๋์ผํ id๋ฅผ ๋ณด์ฅํ๋ค.
useCallback์ด ์ด๋ฏธ ์ ์ฉ๋ ์น๊ตฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ.
const handleSortType = (sortType) => {
setSortType(sortType);
};
const handleFilter = (filter) => {
setFilter(filter);
};
๊ทผ๋ฐ ์ด๋ ๊ฒ ์์ฑํ ํจ์๋, ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋ ๋ค์ ์์ฑ์ด ๋๋ค.
๊ทธ๋์ ๋ฆฌ์กํธ ๋ฉ๋ชจ๊ฐ ์๊ฐํ์ ๋ ๋ค๋ฅธ ํ๋กญ์ผ๋ก ์ธ์ํจ.
๊ทธ๋ฌ๋ ๊ตณ์ด ํธ๋ค๋ง์ ํ๋ฒ ๊ฑฐ์น์ง ์๊ณ , ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด useState๋ก ํ๋ฉด ์ข๋ค.
filter
์ต์ ์, ์ค๋๋ ์์ ๋์ํ ๋, ํ์ํ ๋ถ๋ถ๋ง ๋ฐ๋๋ฉด ๋๋๋ฐ ๋ชจ๋๊ฐ ๋ฆฌ๋ ๋๋ง์ด ๋๊ฑฐ๋,
์ข์ ๊ฐ์ , ์ ์ข์ ๊ฐ์ ๋ฑ์ ์ ํํ ๋๋ ๋ฐ๋ ๋ถ๋ถ์ด ์๋๋ฐ ๋ฆฌ๋ ๋๋ง์ด ๋๊ณ ์๋ค.
์ด๋ DiaryList์ state๊ฐ ๋ฐ๋์๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง ๋๊ณ ,
๊ทธ๋ก ์ธํด ์์ ์ปดํฌ๋ํธ์ธ DiaryItem์ด ๋ ๋๋ง ๋๊ณ ์๊ธฐ ๋๋ฌธ
๊ทผ๋ฐ ์ด๋ ๊ฒ ํนํ! ์ด๋ฏธ์ง๋ ๋์์, ๊ธด ํ
์คํธ๋ฅผ ํฌํจํ๊ณ ์๋ item์ ์์ด ๋ง์์ง๋ฉด ์ํํ๊ธฐ ๋๋ฌธ์ ์ด์ฌ์ด์ฌ ๋ง์ ธ์ฃผ์ด์ผํจ
DiaryItem.js
export default React.memo(DiaryItem);
์ด๋ ๊ฒ ํด์ฃผ๋ฉด ๊ฐ๋จํ ํด๊ฒฐ (react import ํด์ฃผ๋ ๊ฑด ์๋ตํ๋น)
content state ๋ณํ

content๋ฅผ ์ธ ๋๋ง๋ค emotion ๋ถ๋ถ๋ ๊ณ์ ๋ ๋๊ฐ ๋๋ ๊ฑธ ๋ณผ ์ ์์
DiaryEditor ๊ฐ ๊ฐ๊ณ ์๋ state๊ฐ ๋ณํ๋๋,
์์ฐ์ค๋ฝ๊ฒ ๊ทธ ์์์ปดํฌ๋ํธ๋ค์ด ๋ ๋๋ง์ด ๋๊ณ ์๋ ๊ฒ
EmotionItem.js
export default React.memo(EmotionItem);
๊ทธ๋ฆฌ๊ณ EmotionItem์์ ์ฌ์ฌ์ฉ๋๊ณ ์๋ ํจ์ onClick๋ ์ฐพ์๊ฐ์ค.
DiaryEditor.js
const handleClickEmote = useCallback((emotion) => {
setEmotion(emotion);
}, []);
์ด ๋ถ๋ถ์ useCallback์ ์จ ์ค๋ค.
๊ทธ๋ฌ๋ฉด ์์ฑ ์์ ๊ฐ์ ๋ค์ด ๋ ๋๋ง์ด ์๋๋ ๊ฑธ ๋ณผ ์ ์์~
'Project > Toy-project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๋ฌผ์ ์ฒ ์ ๋ณด ์นํ์ด์ง ๋ง๋ค๊ธฐ 1 - API ๋ถ๋ฌ์ค๊ธฐ (1) | 2023.05.20 |
---|---|
๊ฐ์ ์ผ๊ธฐ์ฅ ๋ง๋ค๊ธฐ 5 - ๋ฐฐํฌ & ํ๊ธฐ (1) | 2023.05.20 |
๊ฐ์ ์ผ๊ธฐ์ฅ ๋ง๋ค๊ธฐ 3 - ์ค๋ฅ ์์ & Local Storage (0) | 2023.05.19 |
๊ฐ์ ์ผ๊ธฐ์ฅ ๋ง๋ค๊ธฐ 2 - CRUD ๊ธฐ๋ฅ ๊ตฌํ (4) ์์ธ (0) | 2023.05.19 |
๊ฐ์ ์ผ๊ธฐ์ฅ ๋ง๋ค๊ธฐ 2 - CRUD ๊ธฐ๋ฅ ๊ตฌํ (3) ์์ (0) | 2023.05.19 |