因爲搭建後臺管理系統,國內多采用側邊欄+多標籤切換頁面的方式,故在實現中一樣打算作一個多標籤頁的組件。
↓↓↓↓↓這玩意就是標籤欄,我我的習慣稱爲tabshtml
點擊側邊欄的某個item,判斷該頁面是否已經打開過前端
沒打開過:vue
vue-router
自動載入組件,進入頁面tab-item
實現,頁面的切換(這一步是vue-router
自動完成的)tab-item
能夠單獨關閉(首頁不可關閉)右鍵tabs欄目,顯示context-menu
vue-router
這裏暫時記錄當前遇到的問題,後續如有新坑,再補錄。。
在基本實現了點擊sidebar-item打開頁面,並在tabs數組中添加新的項後,開始作關閉當前tab-item
的功能,可是遇到了坑(灬ꈍ ꈍ灬)。。。vuex
實現思路:後端
watch $route
的變化,若是新增的tab-item
在tabs數組(保存在vuex中)中不存在,就addTabItem()
tab-item
的關閉按鈕時,首先判斷關閉的tab-item
是否是當前的路由若是是:數組
tab-item
tab-item
是否存在router.push
到前一個tab-item
若是不是:瀏覽器
tab-item
理想的結果:dom
t一、t二、t三、t4
,分別打開對應的頁面,並在tabs上增長tab-itemtab-item[t4]
的關閉按鈕,tabs欄目變爲[t1,t2,t3]
,頁面自動更新到t3對應的頁面實際上:異步
tab-item[t4]
的關閉按鈕watch
到route
的兩次變化,且在第二的變化中從新在tabs的數組中新增了t4tabs[t1,t2,t3,t4]
,死循環...排查思路
而後想到會不會是vuetify的tabs組件有一些內部的邏輯致使的
optional
這個屬性)在參考品別人項目的時候,看到他們都是講邏輯卸載vuex的action
中
mutation
出現的問題?action
支持異步,mutation
只能是同步;可是個人router.push
邏輯就是寫在mutation
刪除當前tab-item
以後執行的啊,不可能出現問題啊而後想會不會是我點擊關閉按鈕的時候,又觸發了tab-item的點擊(close按鈕是包裹在tab標籤裏),事件向上冒泡致使從新載入了當前頁呢?
tab-item
按鈕的點擊事件改成@click.stop="onTabClose"
最後,在不停的對照別人的項目過程當中,發現別人的點擊事件是@click.stop.prevent="onTabClose"
.prevent
內心頓時一萬個草尼瑪飄過~~~
在罵本身爲何很少好好看幾遍文檔的時候,忽然意識到,這TM概念我其實知道啊,可是.prevent不是阻止事件默認行爲的麼,勞資實在想不到在這用啊。。。。。。
本着人道主義精神,不能光罵娘,不解決問題啊,因而有了以下:
撥開雲霧見光明:
Vue-DevToos
發現,Vuetify的Tab本質上就是一個router-link
router-link
的咋就致使出現問題了呢?直接一步到位看看生成的dom是啥吧
.prevent
取消事件的默認行爲來解決問題,那指定是a標籤的默認行爲不守婦道了href
屬性指向的連接<!DOCTYPE html> <html lang\="en"> <head> <meta charset\="UTF-8" /> <meta name\="viewport" content\="width=device-width, initial-scale=1.0" /> <meta http-equiv\="X-UA-Compatible" content\="ie=edge" /> <title>a標籤事件測試</title> </head> <body> <a id\="waicenga" href\="[http://www.baidu.com](http://www.baidu.com)" style\="width: 400px;height:400px;background-color:bisque;display: block" onclick\="awaiceng(event)" \> <button style\="width: 200px;height:200px;background-color:red" onclick\="anniu(event)" \> 這是按鈕 </button> 這是外層 </a> </body> <script> // 經過操做dom 監聽click事件,來取消a標籤的默認行爲 document .querySelector('#waicenga') .addEventListener('click', function(event) { // 經過操做dom添加的事件 優先級低於 直接在元素上綁定的onclick // '外層div事件' -> '測試優先級' alert('測試優先級') event.preventDefault() }) // 經過添加event.preventDefault()能夠阻止a標籤的默認行爲 // 可是確點是在點擊事件中對a標籤默認行爲進行的取消 // 經過測試發現:當在anniu()中阻止了冒泡,致使awaiceng()執行不到,進而致使event.preventDefault()沒生效,因此a標籤依然進行了跳轉 // 因此咱們 function awaiceng() { alert('外層div事件') // event.preventDefault() } /\*\* \*經過測試發現 \* 1. 沒有阻止點擊事件冒泡的狀況下 \* 執行序列: anniu() -> awaiceng() -> 跳轉到百度 \* 2. 添加了事件冒泡後: \* 執行序列:anniu() -> 跳轉到百度 \* \* 小結:a標籤內放置的子元素,即便設置了阻止事件冒泡,也不能避免a標籤的默認行爲!!!!!! \* \* \*/ function anniu(event) { alert('裏面的按鈕的事件') // event.stopPropagation() // 在這裏直接阻止a標籤默認行爲也是能夠的 // event.preventDefault() } </script> </html>
小結
.stop
確實是阻止了冒泡router-link
(其本質是個a標籤)
你說誰TM能想到啊😭,吃一塹長一智把,之後再遇到相似場景的問題,必定要得多注意!!!