์ธ๋ถ ์์ญ ์ธ์ํ๊ธฐ
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๋ก ์ฃผ์ด ๋๋กญ๋ค์ด์ด ๋ซํ๊ฒ ํ๋ค.
'๐ FrontEnd -Study > Vue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์คํธ์์ ๊ฒ์ํ ํญ๋ชฉ ๋ค์ ๋์์๋ ๊ทธ๋๋ก ์ ์งํ๊ธฐ (0) | 2024.10.29 |
---|---|
๋ถ๋ชจ, ์์ ์ปดํฌ๋ํธ v-model ์ฐ๋ (0) | 2024.04.03 |
๋๊ธ