TodoList์ ๋ํ ์ผ ํ์ด์ง์ ํํ์ด์ง๋ฅผ ์ค๊ฐ๋ฉด์ ํ ์คํธํ staleTime ๊ณผ gcTimeHomeDetail invalidateQuerise - ์ฟผ๋ฆฌ ๋ฌดํจํ// Detail.jsx const { id } = useParams(); const fetchDetail = async () => { const response = await todoApi(`/todos/${id}`); return response.data; }; const { data, isLoading, error } = useQuery({ queryKey: ["todos", id], queryFn: fetchDetail, }); ํ -> ๋ํ ์ผ ํ์ด์ง๋ก ๋ค์ด๊ฐ๋ฉด params๋ก id๋ฅผ ์์ฒญํ์ฌ ํด๋น tod..
์คํ ๋ค๋๋ฐ์์ ์งํํ๋ 90๋ถ์ ํ์์ดํ ๊ณผ์ .1. ํฌ๋๋ฆฌ์คํธ๋ฅผ tanstack query๋ก ๋ฆฌํฉํ ๋ง2. ์ข์์ ๋ฒํผ์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ก ๋ฆฌํฉํ ๋ง๋ณต์ตํ๋ฉฐ tanstack์ ๊ฐ๋ ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.โ๏ธ ํฌ๋๋ฆฌ์คํธ๋ฅผ tanstack query๋ก ๋ฆฌํฉํ ๋ง useQuery ๐๊ธฐ์กด ๋ก์งfetchData ํจ์์์ ๋น๋๊ธฐ์ ์ผ๋ก (async - await) ์ฒ๋ฆฌ ์คtry, catch, finally๋ก ๋ฐ์ดํฐ, ์๋ฌ, ๋ก๋ฉ ์ํ๋ฅผ ๊ด๋ฆฌํจuseEffect๋ฅผ ์ฌ์ฉํ์ฌ axios ์์ฒญ์ ๋ฐ์ ์ด๋๋ณด๊ธฐ// todos.jsimport axios from "axios";export const todoApi = axios.create({ baseURL: "http://localhost:4000",});// Home.js..
Context API์ Redux๋ฅผ ๋ฐฐ์ฐ๋ฉฐ ํ์ฌ ๊ณผ์ (ํฌ์ผ๋ชฌ ๋๊ฐ)๋ฟ๋ง ์๋๋ผ ์ด์ ๊ณผ์ (์ฌ๋ฆผํฝ ํธ๋์ปค)์ ์ ์ฉํด๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค.์ฌ๋ฆผํฝ ๋ฉ๋ฌ ํธ๋์ปค ๊ณผ์ ๊ตฌํ ์ ๋ฆฌ (ํด๋ฆญ) ๋ ๊ฐ์ง๋ฅผ ๊ตฌํํ๋ฉด์ ๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๊ฒ์ด ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ ์ํ๋ฅผ ๊ณจ๋ผ๋ด๋ ๊ฒ์ด๋ค.๊ทธ๋์ Context ํ์ผ์ ๋ชจ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.. ์ฌ๋ฆผํฝ ํ๋ก์ ํธ์์ ํจ์ ์ปดํฌ๋ํธ๋์ถ๊ฐ, ์ญ์ , ์ ๋ฐ์ดํธ, ์ ๋ ฌ ๋ก ๋๋์๋ค. Context ํ์ผ์ ๋ณด๋ฉฐ ๊ณ ๋ฏผํ ๊ฒ์ด ์ ๋ ฌ ํจ์๋ฅผ ์ด๋์ ์์นํด์ผ ํ๋ ์ถ์๋ค.(reducer๋ก ๋ง๋ค๊ธฐ? List ์ปดํฌ๋ํธ์ ๋๊ธฐ?) sort ๋ก์ง ์ดํด์ฐ์ ์ ๋ ฌ ๋ก์ง์ ์ดํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.// ์ ๋ ฌ ํจ์ const [sortType, setSortType] = useState("gold"); ..
์ด์ ๊ธ์์ RTK์ ์ ์์ ์ธํ ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ๋ค.https://coco910.tistory.com/79 [Pokemon PJ_Day 4] RTK (1) - settingํ์ ๊ณผ์ ๋ฅผ ๋ง์น๊ณ ๋์ ๊ณผ์ ์ธ RTK๋ฅผ ์งํํ์๋ค. Context API๋ฅผ ์ฌ์ฉํ ๋ก์ง์์ RTK๋ก ๋ฐ๊พธ๋ ค๋ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ๋ง์๋ค.ํฌ๊ฒ RTK๋ฅผ ์ธํ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.์ด๋ฒ ๊ธ์coco910.tistory.com์ด๋ฒ ๊ธ์์๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ! RTK use ๐Redux 2๊ฐ์ง ํต์ฌ ๊ฐ๋ : useSelector, useDispatchuseSelector : ํ์ฌ state์ ๊ฐ์ ์กฐํuseDispatch : state์ ๊ฐ์ ์ถ๊ฐ, ์ญ์ , ์์ ๐์ต์ข ๋ชฉํ:[dispatch์ action ๊ฐ์ฒด๋ฅผ ๋ด์์ ..
ํ์ ๊ณผ์ ๋ฅผ ๋ง์น๊ณ ๋์ ๊ณผ์ ์ธ RTK๋ฅผ ์งํํ์๋ค. Context API๋ฅผ ์ฌ์ฉํ ๋ก์ง์์ RTK๋ก ๋ฐ๊พธ๋ ค๋ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ๋ง์๋ค.ํฌ๊ฒ RTK๋ฅผ ์ธํ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.์ด๋ฒ ๊ธ์์๋ ์ธํ ํ๋ ๋ฐฉ๋ฒ! RTK (Redux Toolkit) ๋?๋ฆฌ๋์ค ํดํท์ ๋ฆฌ๋์ค๋ฅผ ๊ฐ๋ํ ๊ฒ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์์ฑํ๋ ducks ํจํด์ ์์๋ค์ด ์ ์ฒด์ ์ธ ์ฝ๋์ ์์ ๋๋ฆฐ๋ค๋ ๊ฐ๋ฐ์๋ค์ ๋ถ๋ง์ด ๋ฐ์ํ๊ธฐ ์์ํ๊ณ , ๋ฆฌ๋์ค ํ์์๋ ์ด๊ฒ์ ์์ฉํ์ฌ ์ฝ๋๋ ๋ ์ ๊ฒ, ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋์ค๋ฅผ ๋ ํธํ๊ฒ ์ฐ๊ธฐ ์ํ ๊ธฐ๋ฅ๋ค์ ํก์ํด์ ๋ง๋ ๊ฒ์ด ๋ฆฌ๋์คํดํท๋ฆฌ๋์ค ํดํท์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ ๋ ๋ฆฌ๋์ค์ ๊ตฌ์กฐ๋ ํจ๋ฌ๋ค์์ด ๋ชจ๋ ๋๊ฐ๋ค.์ฆ ์๋ก์ด ๊ฒ์ด ์๋๋ค. ๋ฆฌ๋์ค์ ์ ์ฒด ์ฝ๋์ ์์ ์ค์ด๊ธฐ ์ํด ์๋ก์ด API๊ฐ ์ถ๊ฐ๋์๊ณ ..
๐ญconfigStore.js์์ store๋ฅผ ์์ฑํ๊ณ ,main.jsx์ store๋ฅผ ์ฃผ์ ํ๊ณ ,module์ ๋ง๋ค๋ฉฐ reducer ํจ์๋ฅผ ์์ฑํ๋ค. ์ด๋ ๊ฒ ๋ง๋ reducer์๊ฒ ์ด๋ป๊ฒ ๋ช ๋ น์ ์ ๋ฌํ ์ง,reducer๋ ๋ฐ์ ๋ช ๋ น์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง์ ์ง์คํ์ฌ ๋ค์ ๋จ๊ณ๋ฅผ ์๊ฐํด๋ด์ผ ํ๋ค. counter ์ฑ์ ์ธํ ์ผ๋ก ์กฐํ ๊ธฐ๋ฅ๊น์ง ์๋ฃ.https://coco910.tistory.com/75 ์์)์ผ๋ก์ state " data-og-host="coco910.tistory.com" data-og-source-url="https://coco910.tistory.com/75" data-og-url="https://coco910.tistory.com/75" data-og-image="https://scrap.k..
react์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ด๋ผ๊ณ ํ ์ ์๋ redux.redux๊ฐ ๋ฌด์์ธ์ง, ํฐ ํ๋ฆ์ ์ด๋ป๊ฒ ๋๋์ง ์ ๋ฆฌํด๋ณด๊ฒ ๋ค. redux๋? ๐์ฌ์ฉ ์ด์ useState์ ๋ถํธํจprops๋ฅผ ํตํด์ ๋จ๋ฐฉํฅ(๋ถ๋ชจ -> ์์)์ผ๋ก์ state ์ ๋ฌ๋ง ๊ฐ๋ฅ์กฐ๋ถ๋ชจ -> ์์ ์ฌ์ด์ ๋ฐ๋์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ์ผ ํจ. ๐์ ์“์ค์ state ๊ด๋ฆฌ์”๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ฃผ๋ ํจํค์ง(๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ปดํฌ๋ํธ ๋ฐ์์ ๋ฐ๋ก ์์ฑ์ปดํฌ๋ํธ์ ์์น ์๊ด์์ด state ์ฌ์ฉ ๊ฐ๋ฅContext API ๋ณด๋ค ๊ท๋ชจ๊ฐ ํฐ state์์ ์ ์ฉ counter ์ฑ ์ธํ ํฌ๊ฒ ๋ค ๋จ๊ณ๋ก ๋๋ ์ ์๋ค.1. ๋ฆฌ๋์ค ์ค์ 1-1. ๋ฆฌ๋์ค ์ค์น 1-2. ํด๋ ๊ตฌ์กฐ ์์ฑ2. ์ค์ ์ฝ๋ ์์ฑ 2-1. configStore.js 2-2. st..
custom hook ๐ํน์งinput์ ๊ฐฏ์์ ๋ฐ๋ผ useState์ e.handler๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ์ปดํฌ๋ํธ๋ก ๊ตฌํํ๋ useState์ handler๋ฅผ ๋ฐ๋ก ํจ์๋ก ๋ง๋ฌ ๐์ฃผ์์ฌํญํจ์ ์ด๋ฆ์ use๋ก ์์ํ์ผ์ด๋ฆ์ ์๊ด X๋ณดํต src ํด๋ > hooks ๋ผ๋ ํด๋๋ก ์ปค์คํ ํ ๋ค์ ๋ณด๊ด๊ธฐ๋ฅ์ ์ปค์คํ ํ ์ ๋ง๋ค๊ธฐ์ ๊ณผ ๋์ผํ๊ฒ ์๋ํ๋, ์ค๋ณต์ฝ๋๊ฐ ์ฌ๋ผ์ง๊ณ ์ ์ฒด์ ์ธ ์ฝ๋์ ์๋ ๊ฐ์๐์ ์ฉ ๋ฐฉ๋ฒjs ํ์ผ์์ use~ ํจ์ ์์ฑ์ด ํ ์ [ ] ์ ๋ฐํํ๋๋ฐ, ์ฒซ๋ฒ์งธ๋ value, ๋๋ฒ์งธ๋ ํธ๋ค๋ฌ๋ฅผ ๋ฐํํจ.value๋ useState๋ก ๊ด๋ฆฌํธ๋ค๋ฌ ๋ก์ง ๊ตฌํ // src/hooks/useInput.jsimport React, { useState } from "react";..
memoization ๐์ฌ์ฉ ์ด์ ํ์์ ์์ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ์ ๋ฆฌ๋ ๋๋ง์ ๋ฐ๋ผ ์ด์ฉ ์ ์์ด ๋ ๋๋ง ๋๋ค.๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ก ์ต์ ํ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ+) ๋ชจ๋ ํจ์๋ฅผ memo ์ฒ๋ฆฌํ๋ค๊ณ ํด์ ๋นจ๋ผ์ง๋ ๊ฒ์ ์๋. ๊ฒฐ๊ตญ ์บ์ฑ ์ฒ๋ฆฌํ ๊ฐ์ ๋ฐ๋ก ์ ์ฅํด์ผํ๊ธฐ ๋๋ฌธ. Memo (React.memo) ๐ํน์ง์ปดํฌ๋ํธ๋ฅผ ์บ์ฑ (hook X)ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ ์, memo๊ฐ ๋ฌดํจ๋จ(์ข์ธก์ ํ ๋นํ๋ฏ ํจ์๋ ๋ค์ ์์ฑ๋จ = ์ฃผ์๊ฐ ๋ฐ๋) ๐์ ์ฉ ๋ฐฉ๋ฒ๋ ๋๋ง์ ๋ง์ผ๋ ค๋ ์ปดํฌ๋ํธ์์ export default React.memo(์ปดํฌ๋ํธ๋ช ) useCallback ๐ํน์งํจ์๋ฅผ ์บ์ฑ(hook O)ํจ์ํ ์ปดํฌ๋ํธ(ํจ์ ์์ฒด)๋ฅผ memoํจ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅํด๋๊ณ (์ฃผ์๊ฐ ๋ฐ๋๋ ๊ฒ์ ๋ง์) ํน..
useContext ๐Prop drillingprops์ ์ ๋ฌ์ด ๋๋ฌด ๊น์ด์ง๋ฉด ๋ฐ์ํ๋ ํ์๋ฌธ์ ์ : ๋๋ฌด ๊น์ด์ง๋ฉด prop์ด ์ด๋ค ์ปดํฌ๋ํธ๋ก๋ถํฐ ์๋์ง ํ์ ์ด ํ๋ฌ, ์ค๋ฅ ๋ฐ์ ์ ์ถ์ ์ด ํ๋ฌ ๐์ ์ญ ์ํ ๊ด๋ฆฌ(react context API)ํ์ ๊ฐ๋ createContext : context ์์ฑProvider : context๋ฅผ ํ์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌuseContext : context๋ฅผ ๊ตฌ๋ ํ๊ณ ํด๋น context์ ํ์ฌ ๊ฐ์ ์ฝ์ ๐useContext ์ ์ฉ๋ฒ [App.jsx ํ์ผ ๋ด์ ์ ์ฉ ์]context ํด๋ > js ํ์ผ(= context ํ์ผ / ๋ด๋ถ์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ context๋ฅผ ์ ์ง)js ํ์ผ ๋ด์์ creatContext(์ด๊ธฐ ๊ฐ(null))์ ๋ณ์์ ํ ๋น,..