Vue 實現(xiàn)顯示/隱藏層的思路(加全局點(diǎn)擊事件)
更新時間:2019年12月31日 11:27:13 作者:smokelee
這篇文章主要介紹了Vue 實現(xiàn)顯示/隱藏層的思路(加全局點(diǎn)擊事件),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
問題描述:
一個Icon點(diǎn)擊出現(xiàn)菜單,點(diǎn)擊菜單區(qū)域外任何區(qū)域菜單收起。
何為優(yōu)雅的去解決上述問題?
- 盡可能的采用vue來解決問題
- 盡可能少的與原生對象發(fā)生交互
- 代碼干凈、易懂
問題解決思路:
- 通過Vue的v-show指令決定菜單的顯示、隱藏。
- 通過Document的全局點(diǎn)擊事件判斷是否該收起
- 需要優(yōu)雅的解決幾個問題:
- 禁止點(diǎn)擊事件冒泡。采用VUE的@click.stop來解決問題,請參考下方代碼
- 優(yōu)雅且安全的移除全局事件監(jiān)聽(只有菜單彈出的時候才去監(jiān)聽)
document的事件添加
HTML
<template> <div class="dir"> <!-- 按鈕,特別注意@click.stop用于禁止消息冒泡 --> <span title="排序" id="sort_by" @click.stop="onSortClick()" class="icons">按鈕</span><br/> <!-- 菜單 v-show設(shè)置變量 showSortmenu,style的內(nèi)容要一開始就寫上! 此處不確定是否是個BUG,不初始style時顯示不正確 --> <ul class="menu" id="sort_by_menu" v-show="showSortmenu" style="display: block;"> <li sort="title"> <span>標(biāo)題</span> </li> <li sort="lastModify"> <span>最后修改時間</span> </li> <li sort="free"> <span>自定義排序</span> </li> </ul> </div> </template>
JavaScript
<script> export default { name: "demo2", data() { return { showSortmenu: false }; }, props: {}, methods: { //接收按鈕點(diǎn)擊事件@click.stop,禁止冒泡 onSortClick: function() { //設(shè)置bool值, this.showSortmenu = !this.showSortmenu; //要特別注意這里,只有菜單顯示的時候才會監(jiān)聽全局點(diǎn)擊事件 //并且,要設(shè)置為:vue的方法,不能扔到export代碼段外面去。 //要切記`this`這個變量對應(yīng)的實例是誰 if (this.showSortmenu) { document.addEventListener("click", this.onGlobalClick); } }, //全局監(jiān)聽點(diǎn)擊事件 onGlobalClick(e) { //判斷全局被點(diǎn)中的控件的className,不同就是菜單外點(diǎn)擊 if (e.target.className != "sort_by_menu") { this.showSortmenu = false; //這里要注意啊!!!!一定要記得移除監(jiān)聽事件?。。。?! document.removeEventListener("click", this.onGlobalClick); } } }, mounted() {}, }; </script>
總結(jié)
以上所述是小編給大家介紹的Vue 實現(xiàn)顯示/隱藏層的思路(加全局點(diǎn)擊事件),希望對大家有所幫助!
相關(guān)文章
解決vue router使用 history 模式刷新后404問題
這篇文章主要介紹了解決vue router使用 history 模式刷新后404問題,需要的朋友可以參考下2017-07-07Element-UI?el-table對循環(huán)產(chǎn)生的空白列賦默認(rèn)值方式
這篇文章主要介紹了Element-UI?el-table對循環(huán)產(chǎn)生的空白列賦默認(rèn)值方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03Vue?3?使用moment設(shè)置顯示時間格式的問題及解決方法
在Vue?3中,因為過濾器(filter)已經(jīng)被廢棄,取而代之的是全局方法(global?method),本文給大家介紹Vue?3?使用moment設(shè)置顯示時間格式的問題及解決方法,感興趣的朋友一起看看吧2023-12-12