vuejs에서 메뉴 외부를 클릭할 경우 드롭다운 메뉴를 숨기는 방법
사용하고 있다dropdown메뉴 컴포넌트를 vuejs로 설정하여 일반 드롭다운 메뉴를 만듭니다.내 암호는dropdown컴포넌트는 다음과 같습니다.
<template>
<span class="dropdown" :class="{shown: state}">
<a href="#" @click.prevent="toggleDropdown" class="dropdown-toggle">toggle menu</a>
<div class="dropdown-menu" v-show="state">
<ul class="list-unstyled">
<slot></slot>
</ul>
</div>
</transition>
</span>
</template>
<script>
export default {
name: 'dropdown',
data () {
return {
state: false
}
},
methods: {
toggleDropdown (e) {
this.state = !this.state;
}
}
}
</script>
지금 Import를 하고 있습니다.dropdown내 컴포넌트VUE템플릿 내의 다음 코드를 사용하여 다양한 장소에서 앱을 만듭니다.
<dropdown>
<li>
Action
</li>
</dropdown>
이것으로 정상적으로 동작하고 있습니다만, 동시에 액티브한 드롭 다운은 1개뿐입니다.
https://github.com/davidnotplay/vue-my-dropdown과 같은 플러그인을 사용할 수 있다는 것을 알게 되었습니다만, 사용하고 싶지 않습니다.위의 예도 어떻게 동작하는지에 대해서도 공부했습니다만, 이 드롭다운 기능을 실장하고 싶다고 생각하고 있습니다.dropdown컴포넌트는 드롭다운과 관련된 모든 이벤트를 처리합니다.그래서 어떻게 그것을 달성할 수 있는지 도와줄 수 있나요?
오래된 질문인 것은 알지만 외부 플러그인이 없는 최선의 방법은 장착된 라이프 사이클 훅에 클릭 청취자를 추가하고(파괴 전 삭제) 컴포넌트를 클릭하여 외부에서 클릭했을 때만 컴포넌트가 숨도록 필터링하는 것이라고 생각합니다.
<template>
<span class="dropdown" :class="{shown: state}">
<a href="#" @click.prevent="toggleDropdown" class="dropdown-toggle">toggle menu</a>
<div class="dropdown-menu" v-show="state">
<ul class="list-unstyled">
<slot></slot>
</ul>
</div>
<transition/>
</span>
</template>
<script>
export default {
name: 'dropdown',
data () {
return {
state: false
}
},
methods: {
toggleDropdown (e) {
this.state = !this.state
},
close (e) {
if (!this.$el.contains(e.target)) {
this.state = false
}
}
},
mounted () {
document.addEventListener('click', this.close)
},
beforeDestroy () {
document.removeEventListener('click',this.close)
}
}
</script>
vue-clickaway를 보세요.(링크)
경우에 따라서는 (모달 창을 닫거나 드롭다운 선택을 숨기기 위해) 요소 외부의 클릭을 감지해야 합니다.이를 위한 네이티브이벤트는 없으며 Vue.js도 대상이 되지 않습니다.이것이 vue-clickaway가 존재하는 이유입니다.자세한 내용을 읽기 전에 데모를 확인하십시오.
Vue 3에서는 다음 기능이 작동합니다.
주의:@click.stop드롭다운 트리거 및 드롭다운 콘텐츠에서 문서 이벤트가 닫힘 기능을 실행할 수 없도록 합니다.
<template>
<div class="dropdown" :class="{'is-active': dropdown.active.value}">
<div class="dropdown-trigger">
<button class="button" @click.stop="dropdown.active.value = !dropdown.active.value">
Toggle
</button>
</div>
<div class="dropdown-menu" role="filter">
<div class="dropdown-content" @click.stop>
<!-- dropdown items -->
</div>
</div>
</div>
</template>
<script>
import { defineComponent, ref, onMounted, onBeforeUnmount } from "vue";
export default defineComponent({
name: "Dropdown",
setup(){
const dropdown = {
active: ref(false),
close: () => {
dropdown.active.value = false
}
}
onBeforeUnmount(() => {
document.removeEventListener('click', dropdown.close)
})
onMounted(() => {
document.addEventListener('click', dropdown.close)
})
return {
dropdown
}
}
})
</script>
이 예에서는,bulma물론 그럴 필요는 없죠
를 사용할 수 있습니다.blur예를 들어 메서드를 추가하는 경우:
close() {
setTimeout(() => {
this.state = false;
}, 200);
}
또,blur링크 이벤트:
<a href="#" @click.prevent="toggleDropdown" @blur="close">toggle menu</a>
그러면 토글링크가 포커스를 잃을 때마다 드롭다운이 숨겨집니다.그setTimeoutJavascript 클릭 이벤트는 블러 후에 발생하므로 드롭다운 링크를 클릭할 수 없습니다.이 문제를 해결하려면 메뉴를 숨김으로써 조금 늦춰야 합니다.
언급URL : https://stackoverflow.com/questions/46038989/how-to-hide-dropdown-menu-if-we-click-outside-the-menu-in-vuejs
'programing' 카테고리의 다른 글
| mmap을 호출한 후 파일을 열어둘 필요가 있습니까? (0) | 2022.08.31 |
|---|---|
| axi에서 인가 베어러 토큰을 설정하려면 어떻게 해야 합니다. (0) | 2022.08.31 |
| Java: 정적 클래스 대 내부 클래스 (0) | 2022.08.31 |
| Mockito : 메서드 내에서 생성된 개체에서 메서드가 호출되었는지 확인하는 방법 (0) | 2022.08.31 |
| 형식 스크립트가 있는 Vue2, 유형에 속성이 없습니다. (0) | 2022.08.30 |