개발자
안녕하세요. 리액트와 리액트 쿼리를 이용해 프로젝트를 진행 중 입니다. 저는 일단. src/hooks/useProduct.jsx 라는 커스텀 훅 을 만들었습니다. 제 계획은 1. 맨 처음 최상단 Home.jsx 에서 useProduct 라는 커스텀 훅 호출 2. 자식컴포넌트에 data를 전달 3. Search.jsx에서 받은 filter값으로 커스텀 훅 안의 query 재실행 4. 바뀐 상태는 Home.jsx 가 다시 받고 자식 컴포넌트에게 전달. 1~3까지는 콘솔찍어가면서 잘 되는데 4.는 되지 않습니다. (쿼리 데이터가 바뀌어도 4이 재 실행이 안됨..) ㅠㅠㅠㅠㅠㅠㅠ 쿼리 옵션도 줘보고 전역 상태도 만들어보고 이것저것 다 해봤는데 ㅠㅠ 혹시 아시는분 계신가요..? 어떠한 답변도 정말 감사히 받겠습니다 간략 코드첨부) Home.jsx const Home = ()=>{ const { data, error, isLoading } = useProduct(); return ( <Search /> <List data={data?.product} /> ); }; export default Home; Search.jsx const Search = () => { ```일부코드생략``` const { updateQuery } = useProduct (); const handleSubmit = () => { const searchData = { productId }; updateQuery(productId); }; } return( ```일부코드생략``` <button onClick={handleSubmit}> 조회 </button> ) } export default Search; useProduct.jsx const useProduct = () => { const [queryData, setQueryData] = useState(); const { data, error, isLoading } = useQuery({ queryKey: ["product", queryData], queryFn: () => fetchProduct(queryData), }); const updateFilters = (queryData) => { setQueryData(() => (queryData); }; return { data, error, isLoading, updateQuery , }; export default useProduct ;
답변 3
익명
작성자
2024년 06월 26일
리턴하는 컴포넌트가 다시 재 랜더링이 안돼서 (콘솔찍어보면 아무것도 안나옴) 리턴하는 객체에서 refetch를 사용할 수 없습니다 ㅠㅠ 답변 너무 감사합니다!
포크코딩
별빛상단 단주 • 2024년 06월 26일
음...뭔가 내가 이거 때문에 삽질을 했다고? 정도로 간단한거에서 놓치고 있으신듯 한데.. 이런게 은근 찾기 어렵긴 하거든요. 코드를 직접 볼 수 있으면 바로 해결 할텐데 잘 모르겠네요.
삭제된 사용자
2024년 06월 26일
useProduct를 2번 사용하여 updateQuery를 Search 컴포넌트에서 사용하셨네요. Home 컴포넌트에서 사용하셔야 합니다. updateQuery를 prop으로 내려줘서 동작해보셔요.
1 2 3 4 5 6 7 8 9 10 11 12 13
// Home <Search updateQuery={updateQuery} /> <List data={data?.product} /> // Search const Search = ({ updateQuery }) => { const handleSubmit = () => { ... updateQuery(productId); }; }
익명
작성자
2024년 06월 26일
답변 정말 감사합니다! 선생님이 써주신 코드 잘 동작합니다. 그런데 제가 하고 싶은 건 props 를 다 없애고 사용컴포넌트 에서 useProduct 를 사용해 모든 처리를 하고 싶은데 그건 불가능 할까요..? Home.jsx <Search/> <List/> 이런식으로 만들고 싶습니다.
익명
작성자
2024년 06월 26일
React-Query는 queryKey를 통해 데이터를 캐싱하기 때문에 원하시는대로 동작할려면 queryKey를 동일하게 맞춰줘야 해요. 지금은 Home에서 호출한 useProduct의 queryKey와 Search에서 호출한 useProduct의 queryKey가 동일하지 않아요. 각각 useState를 호출하기 때문에 Home에서는 ["product", queryData], Search에서의 ["product", queryData]가 다르게 작동합니다. queryData를 콘솔로 찍어보시면 좀 더 이해가 가실거에요. 전역변수를 사용하든, url parameter에서 keyword를 추출하든 (ex : search?searchKeyword=something) useQuery의 ["product", queryData]를 동일하게 맞춰주세요.
삭제된 사용자
2024년 06월 26일
example
1 2 3 4 5 6 7 8
const { query: { searchKeyword }, } = useRouter(); const { data, error, isLoading } = useQuery({ queryKey: ["product", searchKeyword], queryFn: () => fetchProduct(keyword), });
익명
작성자
2024년 06월 27일
와ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ "각각" useState를 호출하기 때문에 Home에서는 ["product", queryData], Search에서의 ["product", queryData]가 다르게 작동합니다. 이 중요한걸 놓치고 있었네요ㅋㅋㅋㅋㅋㅋㅋㅋㅋ queryData를 Context API 를 사용하여 해결하였습니다(❁´◡`❁) 와 이걸 어떻게 감사의 표현을 전해야할지... 선생님 감사합니다. 오늘 정말 큰 깨달음을 얻고 갑니다.
익명
작성자
2024년 06월 27일
해결하셔서 다행이에요 :)
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!