PC๋ทฐ๋ง ๊ณ ๋ คํ์ฌ ๊ตฌํ๋ ์น์ฌ์ดํธ๋ฅผ ๋ชจ๋ฐ์ผ ๋ฒ์ ์ผ๋ก ๋ฐ๊พธ๋ผ๋ ์ธ์ฃผ๋ฅผ ๋ฐ์๋ค !
์ด์ฉ๋ฉด์ข์
- media query๋ง๊ณ useState๋ก ๋ฐ์ํ์ ๊ตฌํํด๋ณด์
- PC์ฉ ํค๋๋ฅผ ๋ชจ๋ฐ์ผ ๋๋กญ๋ค์ด ๋ฉ๋ด๋ก ๋ฐ๊ฟ๋ณด์
(feat. history.push์ setState ๋์ ๊ด๋ฆฌ)
๋ฐ๋จ
์ข
๊ฐ ์ผ์ฃผ์ผ ์ , ์น๊ฐ๋ฐ ๋์๋ฆฌ ๋จํก๋ฐฉ์ ํ ํก์ด ์ฌ๋ผ์๋ค
์ธ์ฃผ๋งก์ ๊ฐ๋ฐํ์๋ ์ฐ๊ตฌ์ค ์ฌ์ดํธ์ ๋ชจ๋ฐ์ผ ์น ํ๋ก ํธ ๊ฐ๋ฐ์ ๊ตฌํ๋ ๋ด์ฉ
๊ธ์ก๋ ์ ์๋์ด์๋ ์ง์ง ์ธ์ฃผ ์๋ค
์ ๊ฐ
์ข ๊ฐ๋ ์ํ ์ํ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๋๊ฑด ๋ถ๊ฐ๋ฅํ ๊ฒ์ด๋ผ ์๊ฐํ์ง๋ง..
์๊ฐ๋ณด๋ค ๋ง๋งํด๋ณด์๊ณ , ๋ฌด์๋ณด๋ค ์ํ๊ณต๋ถ๊ฐ ์ซ์๊ธฐ์
๊ฒฐ๊ตญ ์ผ์ฌ์ฐจ๊ฒ ๋์ ํ๊ฒ ๋๋๋ฐ...
์๊ธฐ
์ง๊ธ๊น์ง๋ ๋น์ทํ ์ปค๋ฆฌ๋ก ๊ณต๋ถ๋ฅผ ํ ๋์๋ฆฌ์๋ค๊ณผ ํ์ ํด์๊ธฐ์ ์ฝ๋ ๊ตฌ์ฑ์ด๋ ์งํ ์ํฉ๋ค์ ์ ๋ง ์ฝ๊ฒ ํ์ ํ ์ ์์๋ค.
ํ์ง๋ง ์ด๋ฏธ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์์ ๊ฑฐ์น ๊ท๋ชจ๊ฐ ์๋ ๋ณธ ํ๋ก์ ํธ๋ ์ฝ๋ ์คํ์ผ๋ถํฐ ์ ๋ง ๋ฏ์ค์๋ค 8ใ 8
ํ์ด์ง๋ ์๊ฐ๋ณด๋ค ๋ง์๊ณ , ์ฝ๋๋ ์๊ฐ๋ณด๋ค ํจ์ฌ ๊ธธ๊ณ ๋์กํ๋ค ๐
๊ทธ๋ ๊ฒ 2์ฃผ๊ฐ์ ๋ํ๋ก ์ฑ๋ฆฐ์ง๊ฐ ์์๋๋ค
์ ์
๋ณธ ํ๋ก์ ํธ์์ ๊ธฐ์ ์ ์ธ ๋ฉด์์ ๊ฐ์ฅ ๋ง์ด ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ ๋๊ฐ์ง์๋ค
์ ํ๋ธ ํด๋ก ์ฝ๋ฉ ํ๋ก์ ํธ์์ ๋ฐ์ํ์ ๋ค๋ค๊ธฐ์ ํฌ๊ฒ ์ด๋ ต์ง๋ ์์๋ค
@media (max-width: 430px) {}
์ ์ฒด์ ์ผ๋ก styled-component๋ฅผ ์ด์ฉํด์ ์คํ์ผ์ ์ ์ฉํ ์ํ๋ผ, css ์คํ์ผ์ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ์๋ ๋์๋ฆฌ์์ ๋ฐฐ์ด ๋ฏธ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค
๊ทผ๋ฐ ์ด์ ๋ณธ ํ๋ก์ ํธ๋ ๋ชจ๋ฐ์ผ๋ทฐ๋ฅผ ์์ ๊ณ ๋ คํ์ง ์๊ณ ๊ฐ๋ฐํ ์น์ฌ์ดํธ๋ผ์ ๋ชจ๋ฐ์ผ๋ทฐ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด return ๋๋ ๋ถ๋ถ์ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ๊ฑด๋๋ ค์ผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ์๊ฒผ๋ค
๊ทธ๋ฆฌํ์ฌ
ํ ์ ์๊ฒ ํ๋๋ฐ,
//๋ชจ๋ฐ์ผ ์ฌ๋ถ ๊ฐ์ง
const [isMobile, setIsMobile] = useState(false)
const resizingHandler = () => {
if (window.innerWidth <= 430) {
setIsMobile(true)
} else {
setIsMobile(false)
}
}
useEffect(() => {
if (window.innerWidth <= 430) {
setIsMobile(true)
}
window.addEventListener('resize', resizingHandler)
return () => {
window.removeEventListener('resize', resizingHandler)
}
}, [])
์ถ์ฒ : https://darrengwon.tistory.com/720
์ด ์ฝ๋๋ง ํฌํจ์ํค๋ฉด isMobile
๋ฅผ ์ด์ฉํด ๋ชจ๋ฐ์ผ ๋ทฐ ์ฌ๋ถ๋ฅผ ์ธ์์ํฌ ์ ์์๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์์ฉํ๋ค
pc๋ทฐ์ผ ๋์ ๋ชจ๋ฐ์ผ ๋ทฐ์ผ๋ ๋ฉ๋ด ํค๋๋ฅผ ์์ ๋ค๋ฅธ๊ฑธ๋ก ํด์ผํ๋ ๊ฒฝ์ฐ
//์์ชฝ์ ๋ชจ๋ฐ์ผ์ฉ ๋ฉ๋ด๋ฐ์ pc์ฉ ๋ฉ๋ด๋ฐ๋ฅผ ๋ฐ๋ก ๊ตฌํ return ( <div style={{ height: '70px', margin: '0px' }}> {isMobile ? menuBarMobile : menuBar} </div> )
style๋ก ํน์ ์ปดํฌ๋ํธ์๋ง ์ค ์คํ์ผ์ ๋ทฐ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ
// <Paragraph /> ๋ ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์จ ์ปดํฌ๋ํธ <Paragraph style={ isMobile ? { display: 'flex', flexDirection: 'column' } : { display: 'flex', flexDirection: 'row' } }
๊ธฐ์กด ๋ฉ๋ด๋ฐ๋ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ์ด๋ฃจ์ด์ง pc์ฉ ๋ฉ๋ด๋ฐ์๋ค.
1. ๊ฐ ํ์ด์ง์ ๊ฐ ์ ์๋ ๋ฒํผ๋ค
2. ํ์ ๋ณํ ๋ฒํผ (state๋ก ๊ด๋ฆฌํด์ ํ์ด์ง ๋ณ๊ฒฝ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์)
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฉ๋ด๋ฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋ฐ์ผ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ผ์ชฝ ํ๋ฒ๊ฑฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฉ๋ด ์ฌ๋ผ์ด๋๊ฐ ์ค๋ฅต ํ๊ณ ๋์ค๋ ๋ชจ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ๊ตฌํํ๋ค.
๊ทธ๋ฐ๋ฐ...
๊ทธ์ค์๋ ๊ฐ ํ์ด์ง ๋ด๋ถ ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฒํผ๋ค์ด ๋ ์๋ ํ์์ด์๋ค..
(์ฐ๊ตฌ์์๊ฐ ํ์ด์ง๋ฅผ ๋ค์ด๊ฐ์ ์ฐ๊ตฌ์์๊ฐ, ์ฐ๊ตฌ์์๊ฐ, ์ฐ๊ตฌ์์ ๊ฒฝ..๋ฑ์ ํ์ด์ง๋ค์ ๋ค์ ํ๋ฒ ํด๋ฆญํด์ ๋ค์ด๊ฐ์ผํ๋ ํํ)
์ ๋ฒํผ๋ค์ ๋์ ํ ๋ชจ๋ฐ์ผ ๋ทฐ์ ๋ฃ์ ์๊ฐ ์์๊ธฐ์ ๋ชจ๋ฐ์ผ ๋ฉ๋ด๋ฐ ํํ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ก๋ก ๊ธธ๊ฒ ๋์ค๋ ํํ๋ก ํฌ๊ฒ ๋ฐ๊ฟจ๋ค.
๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋น ํ์ด์ง์์ ๋ค์ด๊ฐ ์ ์๋ ์์ธ ํ์ด์ง๋ค์ด ๋์์ ๊ทธ ์์์ ์์ธํ์ด์ง๋ฅผ ์ ํํ ์ ์๋ ํํ๋ก ๊ตฌํํ๋ค.
<SlideItem onClick={() => history.push(`/main/${change}`)}>
{change == 'kor' ? 'ํ' : 'Home'}
</SlideItem>
<SlideItem
onClick={() => {
setIsOpenProgram(false)
setIsOpenLab(isOpenLab => !isOpenLab)
}}
>
{change == 'kor' ? '์๊ฐ' : 'About'}
</SlideItem>
<ul className={isOpenLab ? 'show-program' : 'hide-program'}>
<DetailSlideItem
onClick={() => history.push(`/lab/${change}`)
setIsOpen(false)}}
>
{change == 'kor' ? '์ฐ๊ตฌ์ ์๊ฐ' : 'Lab'}
</DetailSlideItem>
//ํ๋ต
๊ทผ๋ฐ ์ ๋ง ํฐ ๋ฌธ์ ๊ฐ ์์๋ค.
๊ธฐ์กด pc ๋ทฐ์์ ํ, ์๊ฐ, ํ๋ก๊ทธ๋จ ์๊ฐ, ์ฐ๊ตฌ์ ์์ ํ์ด์ง๋ก ๋ค์ด๊ฐ๋๋ react-router ๋ฅผ ์ด์ฉํด์ ์ด๋ํ๋ ํํ๊ณ , ๊ทธ ๋ด๋ถ์ ์์ธ ํ์ด์ง๋ค์ ์๋์ชฝ ์ปจํ ์ธ ๋ฅผ useState๋ก ๊ด๋ฆฌํด์ ๋ฒํผ์ ํตํด ์ปจํ ์ธ ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋๋ก ํ๋ ํํ์๋ค.
์ฆ, '์ฐ๊ตฌ์ ์๊ฐ' ํ์ด์ง์ ์ด๋ํ๋ ค๋ฉด '์๊ฐ' ํ์ด์ง ์ฃผ์์ธ /lab/kor
๋ก ์ด๋ํ๊ณ ์๋ ์ปจํ
์ธ ๋ฅผ ๊ด๋ฆฌํ๋ Detail ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์ ๋ฌํด์ ๋ทฐ๋ฅผ ๋์์ผ ํ๋ ๊ฒ 8ใ
8
๊ฒฐ๊ตญ, ๋ชจ๋ฐ์ผ ๋ทฐ์์ ๋ด๊ฐ ๋ง๋ ๋ฉ๋ด๋ฐ๋ฅผ ํตํด ์ํ๋ ์์ธํ์ด์ง์ ๋ค์ด๊ฐ๊ธฐ ์ํด
ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์์๋ค ์ถ์ฒ
<SlideItem onClick={() => history.push(`/main/${change}`)}>
{change == 'kor' ? 'ํ' : 'Home'}
</SlideItem>
์ด๋ ๊ฒ ์ฌ์ฉํ๋ history.push()
๋ฅผ
<DetailSlideItem
onClick={() => {
history.push({
pathname: `/lab/${change}`,
state: { detail: 1 },
})
setIsOpen(false)
}}
>
{change == 'kor' ? '์ฐ๊ตฌ์ ์๊ฐ' : 'Lab'}
</DetailSlideItem>
์ด๋ฐ์์ผ๋ก state:
๋ฅผ ์จ์ detail ์ด๋ผ๋ ๋ณ์๋ฅผ ์ ๋ฌ ํ ์ ์๋ค
๋ฐ๋ ํ์ด์ง์์๋
import { useHistory, useLocation } from 'react-router-dom'
//์ค๋ต
const location = useLocation(1)
console.log(location.state)
//์ค๋ต
<DetailPage
num={
isMobile
? location.state === undefined
? 1 : location.state.detail
: numState
}
lang={lang}
/>
์ด๋ ๊ฒ
location.state.detail
๋ก ์ ๋ฌ๋ฐ์ ์์ ์ ๊ทผ ํ ์ ์์๋ค
๊ฒฐ๋ง
์ฐ์ ํฌ๊ฒ ๊ธฐ์ต๋๋ ๊ธฐ์ ์ ์ด์๋ ์ด ๋๊ฐ์ง์๋ ๊ฒ ๊ฐ๋ค
๊ทธ ์ธ์ ์์ํ๊ฒ ๋ฐฐ์ด ๊ฒ๋ค
์ ๋ง ๋ฌด๋ชจํ๊ฒ ๋์ ํ ํ๋ก์ ํธ์์ง๋ง ๊ทธ๋งํผ ๋ฐฐ์ด๊ฒ๋ ์ ๋ง ๋ง์๋ค.
๋ฐ๋ก ์ ๋ต์ด ์๋ ํ๋ก์ ํธ์์ ๋๊ตฐ๊ฐ์๊ฒ ๋ฌผ์ด๋ณด์ง ์๊ณ ๋ด๊ฐ ํผ์ ์ฐพ์๋ณด๋ฉด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์ด ์๊ฐ๋ณด๋ค ์ฌ๋ฏธ์์๊ณ ๊ทธ๋งํผ ๋ฟ๋ฏํจ๋ ์ปธ๋ ๊ฒ ๊ฐ๋ค
๊ธฐํ๊ฐ ๋๋ค๋ฉด ๋ณธ ํ๋ก์ ํธ ๋ฆฌํฉํ ๋ง ๊ฑฐํ๊ฒ ํ๋ฒ ํด๋ณด๊ณ ์ถ๋ค. ์ฝ๋ ์ ๋ฆฌ๋ ํ๊ณ ,,,