ㅇㅇㅈ Blog

프론트엔드 수행중

0%

2022-06-20-TIL

커스텀 훅을 사용하면서 생긴 erro case

api 호출 부분과 무한스크롤 부분을 컴포넌트에서 분리 하는 과정에서
이런 에러가 발생했다

검색 해보니

  1. react-dom의 버전이 Hook을 사용할수 있는 버전인 16.8.0보다 낮을때
  2. Hooks를 호출 할 때는 함수형 component의 최상위 부분에서 호출
  3. 동일한 앱에 둘 이상의 사본이 있을때

일단 1번 케이스는 해당이 안되고
3번 케이스도 npm i 로 새로 설치했는데도 아니었다

그럼 2번이 문제인데.. 분명 hook은 컴포넌트 최상단에서 호출 하고 있는 중인데..

일단 분리한 코드는

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { useState, useEffect, useRef, useCallback } from "react";
import { useDispatch } from "react-redux";
import axios from "axios";

const GetDataHooks = (keyword, page, setPage) => {
const [newsData, setNewsData] = useState([]);
const [loading, setLoading] = useState(false);
const [hasMore, setHasMore] = useState(false);
const [error, setError] = useState(false);

const API_KEY = process.env.REACT_APP_API_KEY;

const dispatch = useDispatch();

useEffect(() => {
setNewsData([]);
}, [keyword]);

useEffect(() => {
if (keyword && !loading) {
const searchTimeout = setTimeout(() => {
setLoading(true);
setError(false);
let cancel;
axios({
method: "GET",
url: `https://api.nytimes.com/svc/search/v2/articlesearch.json?api-key=${API_KEY}`,
params: { q: keyword, sort: "newest", page },
cancelToken: new axios.CancelToken((c) => (cancel = c)),
})
.then((res) => {
setNewsData((prev) => [...prev, ...res.data.response.docs]);
setHasMore(res.data.response.docs.length > 0);
setLoading(false);
})
.catch((e) => {
if (axios.isCancel(e)) return;
setError(true);
});
dispatch({ type: "SEARCH_HISTORY", payload: keyword });
}, 500);
return () => {
clearTimeout(searchTimeout);
};
}
}, [keyword, page]);

const observer = useRef();
const lastCardNewsRef = useCallback(
(node) => {
console.log("visible");
if (loading) return;
if (observer.current) observer.current.disconnect();
observer.current = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting && hasMore) {
setPage((page) => page + 1);
// 문제의 호출
GetDataHooks(keyword, page, setPage,)
}
});
if (node) observer.current.observe(node);
},
[loading, hasMore]
);

return { newsData, loading, lastCardNewsRef };
};

export default GetDataHooks;

keyword, page, setPage를 인자로 받아서 안에서 api를 호출 하여
newsData와, loading값, 무한스크롤 함수를 return 해주게 작성했다

문제는.. 커스텀훅 안에서 커스텀훅을 호출 하고 있어서 이런 에러가 나는 거였다……

저 GetDataHooks()를 지워 주니 에러가 사라졌다 ..