IT/React
리액트 반응형 웹 구현하기
라임웨일
2022. 4. 26. 09:39
반응형
반응형 웹
테블릿과 스마트폰에서도 인터넷을 사용할수 있게 되자 각 기기 화면 크기에 따라서 사용자들에게 최적화 된 화면을 재공하기 위해 웹 페이지의 사이즈가 '재조정' 되는 것을 말합니다.
react-responsive 셋팅
- npx create-react-app 작업폴더명
- ※ 작업폴더 이름을 react-responsive로 하면 오류가 나니 라이브러리 이름과 다르게 만들어야 합니다.
- cd 작업폴더명 (작업폴더로 이동)
- npm install react-responsive
- npm install @types/react-responsive
(typescript를 사용하는 서비스이기 때문에 아래 모듈도 설치 해줍니다.
- npm install @types/react-responsive
useMediaQuery 문법
const 변수명 = useMediaQuery ({
query : "(최소or최대-width : px)"
})
//example
const isPc = useMediaQuery ({
query : "(min-width : 1024px) and (max-width :1920px)"
});
// width값이 최소 1024 ~ 1920px 까지의 범위는 isPc가 출력됩니다.
Hooks
react-responsive 에서는 useMediaQuery라는 Hook 을 제공합니다.
작동 되는 방식은 useMediaQuery에 media-query조건을 넣어주면 해당 조건에 따라 true, false를 return 해 줍니다.
코드 참고
//App.tsx
import React from "react"
import { useMediaQuery } from "react-responsive"
function App() {
const isPc = useMediaQuery({
query : "(min-width:1024px)"
});
const isTablet = useMediaQuery({
query : "(min-width:768px) and (max-width:1023px)"
});
const isMobile = useMediaQuery({
query : "(max-width:767px)"
});
return (
<div>
{isPc && <p>HI PC</p>}
{isTablet && <p>HI Tablet</p>}
{isMobile && <p>HI Mobile</p>}
</div>
);
}
export default App;
Hooks가 필요한 이유
Hooks가 필요한 이유는 아래와 같은 상황에서 유용하게 사용됩니다.
- PC에서는 "웹페이지"라는 텍스트를 , 모바일에서는 "모바일" 이라는 텍스트를 보여주려고 할 때 단순 CSS Media-Query로 작성 하려면 매번 두가지 케이스를 작성해서 display : none, block; 으로 나눠서 처리를 해야하는 번거로움이 있습니다.
하지만 Hooks를 사용하면 아래처럼 해결이 가능합니다.
코드참고 (Hooks가 필요한이유)
// App.tsx
import React from "react"
import { useMediaQuery } from "react-responsive"
const isPc = useMediaQuery ({
query: "(min-width:768px)"
});
const languageText = isPc ? "웹페이지" : "모바일"
return (
<div>
{languageText}
</div>
);
}
export default App;
useMediaQuery 응용 (컴포넌트)
위처럼 사용도 가능하지만 , 따로 하나의 파일에 useMediaQuery를 몰아 놓고 해당 컴포넌트만 import 해서 사용도 가능합니다.
// MediaQuery.tsx
import React from "react"
import { useMediaQuery } from "react-responsive"
const Mobile :React.FC = ({children}) => {
const isMobile = useMediaQuery({
query : "(max-width:767px)"
});
return <React.Fragment>{isMobile && children}</React.Fragment>
}
const PC :React.FC = ({children}) => {
const isPc = useMediaQuery({
query : "(min-width:768px) "
});
return <React.Fragment>{isPc && children}</React.Fragment>
}
export {Mobile,PC};
//App.tsx
import React from "react"
import { Mobile, PC } from "./MediaQuery"
import "./App.css"
function App() {
return (
<>
<div>
<Mobile>
<div className="mobile_container">
이건 모바일 !!
</div>
</Mobile>
</div>
<div className="pc_container">
<PC >
요건 PC !!!
</PC>
</div>
</>
)
}
export default App;
출처 : https://velog.io/@st2702/%EB%B0%98%EC%9D%91%ED%98%95-%EC%9B%B9-Media-Query
반응형