๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š FrontEnd -Study/Vue

Vue์—์„œ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ๋ฐ”๊นฅ ํด๋ฆญ์‹œ ๋ฉ”๋‰ด ๋‹ซ๊ธฐ

by ChaeLOTUS 2024. 3. 30.
728x90

 

 

์™ธ๋ถ€ ์˜์—ญ ์ธ์‹ํ•˜๊ธฐ

 

1. refs ์†์„ฑ์œผ๋กœ dom ์š”์†Œ ์ ‘๊ทผํ•˜๊ธฐ

์šฐ์„  ์™ธ๋ถ€ ์˜์—ญ ํด๋ฆญ์„ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” refs ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

ref="์ฐธ์กฐ๋ช…"

์œ„์™€ ๊ฐ™์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ

2. eventListener๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์•ž์—์„œ ์ฐธ์กฐํ•  ์š”์†Œ ์ง€์ •ํ–ˆ์œผ๋ฉด, dom์š”์†Œ๊ฐ€ ํด๋ฆญ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด eventListener๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

window.addEventListener('click', this.onClick);

dom์— ํด๋ฆญ์ด๋ฒคํŠธ ๋ฐœ์ƒํ–ˆ์œผ๋ฉด onClick ํ•จ์ˆ˜ ์‹คํ–‰ํ•œ๋‹ค.

 

onClick(e){
	if(e.target.parentNode !== this.$refs.card){
		// ๊ฒฐ๊ณผ์ฐฝ ๋‹ซ๊ธฐ
		}
	}

 

 

 

 


 

 

  <div id="dropdownContainer" ref="dropdown">
    <div class="dropdown" @click="onClick">{{ dropDown }}</div>
    <div v-if="dropdownMenu && click" class="menu">
      <ul>
        <li v-for="(item, index) in dropdownMenu" :key="index">
          {{ item }}
        </li>
      </ul>
    </div>
  </div>

dropdown์š”์†Œ์— ref์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น dom์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

 

    const dropdown = ref(null);

script์•ˆ์—์„œ๋Š” ref๋กœ ์ฐธ์กฐํ•œ ์ด๋ฆ„๊ณผ ๊ฐ™์ด ์„ ์–ธํ•ด์ค€๋‹ค.

 

 

    const onClick = () => {
      click.value = !click.value;
      if (click.value) {
        document.addEventListener("click", closeDropdown);
      } else {
        document.removeEventListener("click", closeDropdown);
      }
    };

onClick ํ•จ์ˆ˜ ์‹คํ–‰๋˜๋ฉด click.value๊ฐ€ true์ผ ๋•Œ (dropdown์ด ์—ด๋ ค์žˆ์„ ๋•Œ)

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

 

   const closeDropdown = (event) => {
      if (!dropdown.value.contains(event.target)) {
        click.value = false;
        document.removeEventListener("click", closeDropdown);
      }
    };

dropdown.value๊ฐ€ evaent.target(์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•œ ์š”์†Œ)์„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š์„ ๋•Œ๋Š”

click.value๋ฅผ false๋กœ ์ฃผ์–ด ๋“œ๋กญ๋‹ค์šด์ด ๋‹ซํžˆ๊ฒŒ ํ•œ๋‹ค.

728x90

๋Œ“๊ธ€