๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[PROJECT] ๋‚ด์ผ์˜ ์ง‘

#3. ๋ชจ๋‹ฌ์ฐฝ ๊ตฌํ˜„( feat. ์˜์—ญ ๋ฐ– ํด๋ฆญ ์‹œ ๋‹ซ๊ธฐ)

#3-0 ๋“ค์–ด๊ฐ€๋Š” ๋ง


 Header ์˜์—ญ์„ ์ž‘์—…ํ•˜๋˜ ์ค‘ ๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ ๋ถ€๋ถ„์—์„œ ์ž ์‹œ ๋ง‰ํ˜”์—ˆ๋‹ค. ๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์ด ๋”ฐ๋กœ ์—†๊ณ , ๋ชจ๋‹ฌ์ฐฝ ์˜์—ญ ๋ฐ–์„ ํด๋ฆญํ–ˆ์„ ์‹œ ๋ชจ๋‹ฌ์ฐฝ์ด ๋‹ซํžˆ๋Š” ๊ตฌ์กฐ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šด ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ๊ทธ๋ž˜๋„ ํ•ด๋‚ด์—ˆ๋‹ค๋Š” ๊ฒƒ์— ๊ธฐ์จ์„ ๋Š๊ผˆ๋‹ค. 

 


#3-1 useRef  ์ด์šฉํ•˜๊ธฐ


ํŠน์ •ํ•œ Element๋ฅผ ์„ ํƒํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ getElementById๋‚˜ querySelector ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋“ฏ์ด, ๋ฆฌ์•กํŠธ์—์„  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ •๋‹ต์€ useRef Hook ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ! 

 

๋ชจ๋‹ฌ์ฐฝ ์˜์—ญ ๋ฐ–์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ useRef๋ฅผ ํ†ตํ•ด ์„ ํƒํ•œ ํ›„, ํ•ด๋‹น Element๊ฐ€ ํด๋ฆญ ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ชจ๋‹ฌ์ฐฝ์ด ๋‹ซํžˆ๋„๋ก ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๋ฉด ๋œ๋‹ค. 

 

*์˜ˆ์‹œ ์ฝ”๋“œ 

import React, { useState, useRef } from 'react';

function Header(){
  const [menuBtnClick, setMenuBtnClick] = useState(false);
  const outSection = useRef();

  return (
    <>
    <header>
     ...
     <button type="button" onClick={()=>{setMenuBtnClick(true)}}>
  	 ๋ฉ”๋‰ด๋ฒ„ํŠผ
     </button>
     ...
     {
     	menuBtnClick === true
        ? (<div class="modal-outside" ref={outSection} onClick={(e)=>{
          if(outSection.current === e.target) {
              setMenuBtnClick(false)
          }
       }}>
         <div class="modal-content"> ๋ชจ๋‹ฌ์ฐฝ ๋‚ด์šฉ</div>
       <div>)
       : null
     }
    </header>
    </>
    )
}