๐Ÿ–ฅ PC๋ทฐ ์›น์‚ฌ์ดํŠธ์˜ ๋ชจ๋ฐ”์ผ๋ทฐ ๋งŒ๋“ค๊ธฐ ์™ธ์ฃผ ๐Ÿ“ฑ

SeonDalยท2022๋…„ 1์›” 3์ผ
7

ย ๐ŸŒฟ ํšŒ๊ณ ๋ก

๋ชฉ๋ก ๋ณด๊ธฐ
1/7
post-thumbnail
post-custom-banner

PC๋ทฐ๋งŒ ๊ณ ๋ คํ•˜์—ฌ ๊ตฌํ˜„๋œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ชจ๋ฐ”์ผ ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊พธ๋ผ๋Š” ์™ธ์ฃผ๋ฅผ ๋ฐ›์•˜๋‹ค ! ์–ด์ฉŒ๋ฉด์ข‹์•„

  • media query๋ง๊ณ  useState๋กœ ๋ฐ˜์‘ํ˜•์„ ๊ตฌํ˜„ํ•ด๋ณด์ž
  • PC์šฉ ํ—ค๋”๋ฅผ ๋ชจ๋ฐ”์ผ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด๋กœ ๋ฐ”๊ฟ”๋ณด์ž
    (feat. history.push์™€ setState ๋™์‹œ ๊ด€๋ฆฌ)

๋ฐœ๋‹จ

์ข…๊ฐ• ์ผ์ฃผ์ผ ์ „, ์›น๊ฐœ๋ฐœ ๋™์•„๋ฆฌ ๋‹จํ†ก๋ฐฉ์— ํ•œ ํ†ก์ด ์˜ฌ๋ผ์™”๋‹ค
์™ธ์ฃผ๋งก์•„ ๊ฐœ๋ฐœํ•˜์‹œ๋˜ ์—ฐ๊ตฌ์‹ค ์‚ฌ์ดํŠธ์˜ ๋ชจ๋ฐ”์ผ ์›น ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์„ ๊ตฌํ•˜๋Š” ๋‚ด์šฉ

๊ธˆ์•ก๋„ ์ œ์‹œ๋˜์–ด์žˆ๋Š” ์ง„์งœ ์™ธ์ฃผ ์˜€๋‹ค


์ „๊ฐœ

์ข…๊ฐ•๋„ ์•ˆํ•œ ์ƒํƒœ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ..

  • ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ๋“ค๊ณผ ๋‚ด์šฉ๋“ค์€ ์ด๋ฏธ ๊ตฌํ˜„๋œ ์ƒํƒœ์ด๊ณ 
  • pc ๋ทฐ๊ฐ€ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ƒํƒœ์—์„œ ๋ชจ๋ฐ”์ผ ๋ทฐ๋งŒ ์ถ”๊ฐ€์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ์ž‘์—…

์ƒ๊ฐ๋ณด๋‹ค ๋งŒ๋งŒํ•ด๋ณด์˜€๊ณ , ๋ฌด์—‡๋ณด๋‹ค ์‹œํ—˜๊ณต๋ถ€๊ฐ€ ์‹ซ์—ˆ๊ธฐ์—
๊ฒฐ๊ตญ ์•ผ์‹ฌ์ฐจ๊ฒŒ ๋„์ „ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ...


์œ„๊ธฐ

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋น„์Šทํ•œ ์ปค๋ฆฌ๋กœ ๊ณต๋ถ€๋ฅผ ํ•œ ๋™์•„๋ฆฌ์›๋“ค๊ณผ ํ˜‘์—…ํ•ด์™”๊ธฐ์— ์ฝ”๋“œ ๊ตฌ์„ฑ์ด๋‚˜ ์ง„ํ–‰ ์ƒํ™ฉ๋“ค์„ ์ •๋ง ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์†์„ ๊ฑฐ์นœ ๊ทœ๋ชจ๊ฐ€ ์žˆ๋Š” ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ๋ถ€ํ„ฐ ์ •๋ง ๋‚ฏ์„ค์—ˆ๋‹ค 8ใ…8

ํŽ˜์ด์ง€๋„ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์•˜๊ณ , ์ฝ”๋“œ๋„ ์ƒ๊ฐ๋ณด๋‹ค ํ›จ์”ฌ ๊ธธ๊ณ  ๋‚œ์žกํ–ˆ๋‹ค ๐Ÿ˜‡

๊ทธ๋ ‡๊ฒŒ 2์ฃผ๊ฐ„์˜ ๋‚˜ํ™€๋กœ ์ฑŒ๋ฆฐ์ง€๊ฐ€ ์‹œ์ž‘๋๋‹ค


์ ˆ์ •

๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ์ˆ ์ ์ธ ๋ฉด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„์€ ๋‘๊ฐ€์ง€์˜€๋‹ค


๐Ÿ“ฑ ๋ฐ˜์‘ํ˜• ๐Ÿ“ฑ

์œ ํŠœ๋ธŒ ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ˜์‘ํ˜•์„ ๋‹ค๋ค˜๊ธฐ์— ํฌ๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š์•˜๋‹ค

@media (max-width: 430px) {}

์ „์ฒด์ ์œผ๋กœ styled-component๋ฅผ ์ด์šฉํ•ด์„œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•œ ์ƒํƒœ๋ผ, css ์Šคํƒ€์ผ์„ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋™์•„๋ฆฌ์—์„œ ๋ฐฐ์šด ๋ฏธ๋””์•„ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค

๊ทผ๋ฐ ์ด์ œ ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋ฐ”์ผ๋ทฐ๋ฅผ ์•„์˜ˆ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•œ ์›น์‚ฌ์ดํŠธ๋ผ์„œ ๋ชจ๋ฐ”์ผ๋ทฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด return ๋˜๋Š” ๋ถ€๋ถ„์˜ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ๊ฑด๋“œ๋ ค์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒผ๋‹ค

๊ทธ๋ฆฌํ•˜์—ฌ

useState ๋ฅผ ์ด์šฉํ•ด ๋ทฐ ํฌ๊ธฐ๋ฅผ ์ƒํƒœ๋กœ์จ ๊ด€๋ฆฌ

ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋Š”๋ฐ,

//๋ชจ๋ฐ”์ผ ์—ฌ๋ถ€ ๊ฐ์ง€
  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

๊ฒฐ๊ตญ, ๋ชจ๋ฐ”์ผ ๋ทฐ์—์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ฉ”๋‰ด๋ฐ”๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์ƒ์„ธํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๊ธฐ ์œ„ํ•ด

react-router ๋กœ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๊นŒ์ง€ ๋™์‹œ์— ๊ด€๋ฆฌ

ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ์™”๋‹ค ์ถœ์ฒ˜


<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

๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค



๊ฒฐ๋ง

์šฐ์„  ํฌ๊ฒŒ ๊ธฐ์–ต๋‚˜๋Š” ๊ธฐ์ˆ ์  ์ด์Šˆ๋Š” ์ด ๋‘๊ฐ€์ง€์˜€๋˜ ๊ฒƒ ๊ฐ™๋‹ค

๊ทธ ์™ธ์— ์ž์ž˜ํ•˜๊ฒŒ ๋ฐฐ์šด ๊ฒƒ๋“ค



์ •๋ง ๋ฌด๋ชจํ•˜๊ฒŒ ๋„์ „ํ•œ ํ”„๋กœ์ ํŠธ์˜€์ง€๋งŒ ๊ทธ๋งŒํผ ๋ฐฐ์šด๊ฒƒ๋„ ์ •๋ง ๋งŽ์•˜๋‹ค.
๋”ฐ๋กœ ์ •๋‹ต์ด ์—†๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋ฌผ์–ด๋ณด์ง€ ์•Š๊ณ  ๋‚ด๊ฐ€ ํ˜ผ์ž ์ฐพ์•„๋ณด๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ด ์ƒ๊ฐ๋ณด๋‹ค ์žฌ๋ฏธ์žˆ์—ˆ๊ณ  ๊ทธ๋งŒํผ ๋ฟŒ๋“ฏํ•จ๋„ ์ปธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค

๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ๋ณธ ํ”„๋กœ์ ํŠธ ๋ฆฌํŒฉํ† ๋ง ๊ฑฐํ•˜๊ฒŒ ํ•œ๋ฒˆ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค. ์ฝ”๋“œ ์ •๋ฆฌ๋„ ํ•˜๊ณ ,,,

profile
๊น€์„ ๋‹ฌ ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€