
그렇다고 [’products’] 하나의 쿼리키로 관리하자니 옵션이 바뀔 때마다 해당 컴포넌트에 refetch를 달아줘야 하는 상황이 발생했습니다. 게다가 한 번씩 제대로 작동하지 않는 경우도 있었습니다. 어찌저찌 생각해낸 방법이 지금의 방법입니다.
const ProductList = () => {
const [searchParams] = useSearchParams();
const [queryParams, setQueryParams] = useState({
options: searchParams.getAll("options"),
order: searchParams.get("order"),
category: searchParams.get("category"),
keyword: searchParams.get("keyword"),
checkInDate: searchParams.get("checkInDate"),
checkOutDate: searchParams.get("checkOutDate"),
swx: Number(searchParams.get("swx")),
swy: Number(searchParams.get("swy")),
nex: Number(searchParams.get("nex")),
ney: Number(searchParams.get("ney"))
});
useEffect(() => {
setQueryParams({
options: searchParams.getAll("options"),
order: searchParams.get("order"),
category: searchParams.get("category"),
keyword: searchParams.get("keyword"),
checkInDate: searchParams.get("checkInDate"),
checkOutDate: searchParams.get("checkOutDate"),
swx: Number(searchParams.get("swx")),
swy: Number(searchParams.get("swy")),
nex: Number(searchParams.get("nex")),
ney: Number(searchParams.get("ney"))
});
}, [searchParams]);
const {
data: products,
hasNextPage,
isFetching,
fetchNextPage
} = useProducts({
...(queryParams.options && { options: queryParams.options as Option[] }),
...(queryParams.order && { order: queryParams.order as OrderState }),
...(queryParams.category && { category: queryParams.category as Category }),
...(queryParams.checkInDate && { checkInDate: queryParams.checkInDate }),
...(queryParams.checkOutDate && { checkOutDate: queryParams.checkOutDate }),
...(queryParams.keyword && { keyword: queryParams.keyword }),
...(queryParams.swx && { smallX: queryParams.swx }),
...(queryParams.swy && { smallY: queryParams.swy }),
...(queryParams.nex && { bigX: queryParams.nex }),
...(queryParams.ney && { bigY: queryParams.ney }),
size: 10
});
const queryParams = useMemo(() => {
const params = new URLSearchParams(searchParamString);
return {
options: params.getAll("options") as Option[],
order: params.get("order") as OrderState,
category: params.get("category") as Category,
keyword: params.get("keyword"),
checkInDate: params.get("checkInDate"),
checkOutDate: params.get("checkOutDate"),
smallX: Number(params.get("smallX")),
smallY: Number(params.get("smallY")),
bigX: Number(params.get("bigX")),
bigY: Number(params.get("bigY"))
};
}, [searchParamString]);
useProducts의 인자가 ...(object.key && key: object.key) 로 반복되면서 엄청나게 길어졌습니다. 멘토님의 의견에 따라 removeNullish 라는 함수를 만들어 보기로 했고 결과는 아래와 같습니다.
const removeNullish = <T extends object>(
obj: T,
...rest: Array<Record<string, any>>
): Partial<T> => {
const result = Object.assign({}, ...rest);
Object.entries(obj).forEach(([key, value]) => {
if (value !== null && value !== undefined && value !== "" && value !== 0) {
result[key] = value;
}
});
return result;
};
const { data: products } = useProducts(
removeNullish<Partial<GetProductsRequestParams>>(queryParams, { size: 10 })
);