<NoSupplierSkuFilter
initialState={router.query.hasNoSupplier === 'true'}
/>
<MinShippingPeriodZeroSkuFilter
initialState={router.query.isMinShippingPeriodZero === 'true'}
/>
const NoSupplierSkuFilter = ({ initialState }: P) => {
const [isFiltered, setIsFiltered] = useState<boolean>(initialState);
const { replace } = useShallowRoute();
const router = useRouter();
const handleToggleClick = () => {
replace('/product/sku', { hasNoSupplier: isFiltered ? false : true });
setIsFiltered(isFiltered ? false : true);
};
useEffect(
() => setIsFiltered(router.query.hasNoSupplier === 'true'),
[router.query]
);
return (
<AbnormalFilter isFiltered={isFiltered} toggleSelect={handleToggleClick}>
매입처 정보가 없는 SKU 모아보기
</AbnormalFilter>
);
};
export default NoSupplierSkuFilter;
우선 코드 리뷰 내용을 받은 내용은 다음과 같다..
이 말은 즉슨, 기존에 사용한 코드가 객체 지향 설계인 SOLID 원칙에 위배된다는 것이다!
1. DIP (Dependency Inversion Principle) 원칙
높은 수준의 모듈이 낮은 수준의 모듈에 의존해서는 안 된다. 즉, 하위 컴포넌트는 라우터와 같은 상위 모듈에 직접 의존하면 안 되며, 대신 부모 컴포넌트와 같은 상위 모듈이 하위 컴포넌트의 의존성을 관리해야 한다.
2. SRP(Single Responsibility Principle) 원칙
하나의 컴포넌트는 하나의 책임만 가지도록 만드는 것을 강조한다.
내가 만든 필터(하위 컴포넌트)는 UI 구성 요소를 렌더링하고 이벤트 처리를 수행하는 것이 그냥 단순한 책임이고, 이 이벤트에 필요한 데이터는 상위 모듈에서 제공하여, 하위 컴포넌트는 자신이 담당하는 책임에만 집중하는 것이 좋다.
const SkuPage = ({}: P) => {
const router = useRouter();
const { data, isLoading } = useSkus(router.query);
const hasStocksFiltered = router.query.hasStocks === 'true';
const hasNoSupplierFiltered = router.query.hasNoSupplier === 'true';
const isMinShippingPeriodZeroFiltered =
router.query.isMinShippingPeriodZero === 'true';
if (isLoading) return <Loading />;
if (!data) return <></>;
return (
<SkuList
data={data}
hasStocksFiltered={hasStocksFiltered}
hasNoSupplierFiltered={hasNoSupplierFiltered}
isMinShippingPeriodZeroFiltered={isMinShippingPeriodZeroFiltered}
/>
);
};
export default SkuPage;
<NoSupplierSkuFilter initialState={hasNoSupplierFiltered} />
const NoSupplierSkuFilter = ({ initialState }: P) => {
const [isFiltered, setIsFiltered] = useState<boolean>(initialState);
const { replace } = useShallowRoute();
const handleToggleClick = () => {
replace('/product/sku', { hasNoSupplier: !isFiltered });
setIsFiltered(!isFiltered);
};
useEffect(() => setIsFiltered(initialState), [initialState]);
return (
<ProductToggleFilter
isFiltered={isFiltered}
toggleSelect={handleToggleClick}
>
매입처 정보가 없는 SKU 모아보기
</ProductToggleFilter>
);
};
export default NoSupplierSkuFilter;
/// before
setIsFiltered(isFiltered ? false : true)
/// after
setIsFiltered(!isFiltered)