npm i react-responsive
//isMobile에 모바일 기기인지 boolean type으로 저장됨
const isMobile = useMediaQuery({ maxWidth: 767 });
...
{isMobile?<Empty/>:<Empty2/>}
공통으로 처리하기 위해 MediaQuery컴포넌트를 만들었다.
MediaQuery 컴포넌트를 이용하여 JSX.Element를 Props로 전달하고 올바른 디바이스 크기에서만 Props를 반환하도록 구현하였다.
import { useMediaQuery } from "react-responsive";
type MediaQueryType = (props: { children: JSX.Element }) => JSX.Element | null;
export const PCandTab: MediaQueryType = (props) => {
const isnotMobile = useMediaQuery({ minWidth: 768 });
return isnotMobile ? props.children : null;
};
export const Mobile: MediaQueryType = (props) => {
const isMobile = useMediaQuery({ maxWidth: 767 });
return isMobile ? props.children : null;
};
import { Mobile } from "utils/MediaQuery";
...
<Mobile>
<TopBar />//모바일 기기에서만 볼 수 있음.
</Mobile>
@media를 이용해 뷰포트에 따라 코드를 분기처리한다.
scss의 mixin과 include를 이용해 편리하게 이용하였다.
$mobile: 767px;
$tablet: 1023px;
$desktop: 1024px;
@mixin mobile {
@media (max-width: $mobile) and (min-width: 360px) {
@content;
}
}
@mixin tablet {
@media (min-width: $mobile) and (max-width: $tablet) {
@content;
}
}
@mixin desktop {
@media (min-width: $desktop) {
@content;
}
}
@import 'index.scss';
/*tablet, mobile를 제하는 뷰포트를 가지는 기기.
esktop과 mobile 이하에 해당 : ~359px,1024px~*/
...
/*tablet ver : 768~1023px */
@include tablet {
...
}
/*mobile : 360~767px*/
@include mobile {
...
}