담당 페이지였던 도서 검색 페이지를 제작 후 다양한 상황에서 사용해보며 오류들과 사용자 입장에서 불편할 수 있는 것들을 찾는 시간을 가졌다. 어떤 문제가 발생하였고 어떻게 해결하였는지 포스팅 하려한다!
👉 검색어가 유지되지 않았던 이유
const [inputData, setInputData] = useState('');
형식으로 관리👉 해결 방법
// SearchInput 공통 컴포넌트
const [searchBookTitle, setSearchBookTitle] = useRecoilState(searchBookTitleAtom);
<SearchInput onSubmit={onSubmit} />
// 도서 검색 페이지
const SearchInput = ({ onSubmit }: Props) => {
const [inputData, setInputData] = useState('');
...
}
// SearchInput 공통 컴포넌트
const [searchBookTitle, setSearchBookTitle] = useRecoilState(searchBookTitleAtom);
<SearchInput onSubmit={onSubmit} inputText={searchBookTitle} />
// 도서 검색 페이지
const SearchInput = ({ onSubmit, inputText }: Props) => {
const [inputData, setInputData] = useState(inputText);
...
}
👉 문제 해결 과정
enabled: !!searchKeyword && !bookSearchData.current
)👉 새로운 키워드로 검색이 되지 않았던 이유
useRef
의 current 값은 컴포넌트가 mount 될 때 설정된 값을 re-render가 되어도 계속 유지 한다는 말이 생각났다. 🔎 useRef
- ref 객체를 생성하고 current 속성을 통해 값을 수정 및 조회할 수 있음
- 컴포넌트가 re-render 되어도 컴포넌트가 마운트 될 때의 초기값을 유지(ref 객체는 컴포넌트의 라이프사이클 동안 일관된 값을 유지)
- current 값이 수정되어도 컴포넌트가 re-render 되지 않는다.
👉 해결 방법
// useRef 사용
const bookSearchData = useRef(
queryClient.getQueryData([
'book',
'search',
'result',
'list',
searchKeyword,
]),
);
const {
data: bookSearchResultLists,
fetchNextPage,
hasNextPage,
isFetchingNextPage,
status,
} = useInfiniteQuery(
['book', 'search', 'result', 'list', searchKeyword],
({ pageParam = 1 }) => getBookSearchResultData(searchKeyword, pageParam),
{
onSuccess: () => setPage((prev) => prev + 1),
onError: (error) => console.error(error),
getNextPageParam: (lastPage) => {
if (lastPage.is_end) return;
return page;
},
enabled: !!searchKeyword && !bookSearchData.current,
},
);
// useRef 제거
// 데이터 유무만 check하면 되므로 boolean type으로 수정
const isBookSearchData = !!queryClient.getQueryData([
'book',
'search',
'result',
'list',
searchKeyword,
]);
const {
data: bookSearchResultLists,
fetchNextPage,
hasNextPage,
isFetchingNextPage,
status,
} = useInfiniteQuery(
...
enabled: !!searchKeyword && !isBookSearchData,
},
);
👉 수정 전 소스코드
{readingGroupLists.pages.map(
({ groups, currentPage }, index) =>
groups.length > 0 &&
groups[index] && (
<RecruitList key={currentPage} listData={groups} />
),
)}
👉 데이터가 render 되지 않았던 이유
groups[index]
를 설정한 것이 문제가 되었다. 👉 groups[index]
groups[index]
: n번째 그룹데이터의 n번 index의 데이터가 존재하면 true특정 그룹 index의 최대값은 4
👉 수정 후 소스코드
{readingGroupLists.pages.map(
({ groups, currentPage }) =>
groups.length > 0 && (
<RecruitList key={currentPage} listData={groups} />
),
)}
특정 기능을 구현하는 것도 중요하지만 사용자 입장에서 유지/보수 하는 것이 더 중요하다는 것을 수정 작업을 하며 알아가는 것 같다. 틀린 부분이 있거나 부족한 부분이 있으면 피드백 부탁드립니다!
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.