最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Element-ui NavMenu子菜單使用遞歸生成時使用報錯

 更新時間:2021年04月22日 14:42:20   作者:Poedu05守護者  
這篇文章主要介紹了詳解Element-ui NavMenu子菜單使用遞歸生成時使用報錯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

當采用遞歸方式生成導航欄的子菜單時,菜單可以正常生成,但是當鼠標hover時,會出現(xiàn)循環(huán)調用某個(mouseenter)事件,導致最后報錯

處理方式

注:2.13.2 版本,只需對子菜單設置屬性 :popper-append-to-body="false" 就不會出現(xiàn)這個問題了

報錯信息如下:

Uncaught RangeError: Maximum call stack size exceeded.
    at VueComponent.handleMouseenter (index.js:1)
    at invokeWithErrorHandling (vue.js:1863)
    at HTMLLIElement.invoker (vue.js:2188)
    at HTMLLIElement.original._wrapper (vue.js:7547)
    at VueComponent.handleMouseenter (index.js:1)
    at invokeWithErrorHandling (vue.js:1863)
    at HTMLLIElement.invoker (vue.js:2188)
    at HTMLLIElement.original._wrapper (vue.js:7547)
    at VueComponent.handleMouseenter (index.js:1)
    at invokeWithErrorHandling (vue.js:1863)

測試代碼

版本:

  • vue: v2.6.11
  • element-ui: 2.13.0
<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
  <!-- 引入樣式 -->
  <link rel="stylesheet"  rel="external nofollow" >
 </head>
 <body>

  <div id="root">
   <el-menu mode="horizontal">
    <template v-for="(menu,index) in menus">
     <sub-menu v-if="menu.children && menu.children.length" :key="index" :item="menu"></sub-menu>
     <el-menu-item v-else :index="menu.path" :key="index">{{ menu.title }}</el-menu-item>
    </template>
   </el-menu>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <!-- 引入組件庫 -->
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  <script type="text/javascript">
   Vue.component('sub-menu', {
    props: ['item'],
    template: `
     <el-submenu :index="item.path">
      <template slot="title">
       {{item.title}}
      </template>
      <template v-for="(child,index) in item.children">
       <sub-menu v-if="child.children" :item="child" :key="index"></sub-menu>
       <el-menu-item v-else :key="index" :index="child.path">
        {{child.title}}
       </el-menu-item>
      </template>
     </el-submenu>
    `
   })

   let vm = new Vue({
    el: '#root',
    data() {
     return {
      menus: [{
       title: '我的工作臺',
       path: '2',
       children: [{
         title: '選項1',
         path: '2-1'
        },
        {
         title: '選項2',
         path: '2-2',
        },
       ],
      },{
       title:'后臺管理',
       path:'3'
      }]
     }
    },
    components: {}
   })
  </script>
 </body>
</html>

錯誤分析

觀察遞歸生成的導航欄代碼及報錯代碼:

 handleMouseenter: function(e) {
                    var t = this
                      , i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.showTimeout;
                    if ("ActiveXObject"in window || "focus" !== e.type || e.relatedTarget) {
                        var n = this.rootMenu
                          , r = this.disabled;
                        "click" === n.menuTrigger && "horizontal" === n.mode || !n.collapse && "vertical" === n.mode || r || (this.dispatch("ElSubmenu", "mouse-enter-child"),
                        clearTimeout(this.timeout),
                        this.timeout = setTimeout(function() {
                            t.rootMenu.openMenu(t.index, t.indexPath)
                        }, i),
                        this.appendToBody && this.$parent.$el.dispatchEvent(new MouseEvent("mouseenter")));//報錯代碼
                    }
                },

猜測是因為事件冒泡或下沉導致元素重復派發(fā)和接受mouseenter事件,造成了類似死循環(huán)的狀態(tài),因時間關系,沒做深究,后面有時間的時候再查下根本原因(如果記得的話…)

當鼠標移入到菜單中時,觸發(fā)handleMouseenter方法,但是因為appendToBody為true,所以又派發(fā)了鼠標移入事件,然后又回到了這個方法,由此造成了死循環(huán)。appendToBody是一個計算屬性,那么為什么appendToBody會是true呢?看代碼:

{
 name: 'ElSubmenu',
    componentName: 'ElSubmenu',
 props:{
  popperAppendToBody: {
         type: Boolean,
         default: undefined   
        }
    },
    computed:{
  appendToBody() {
        return this.popperAppendToBody === undefined     
          ? this.isFirstLevel              //未顯示指明popperAppendToBody 時,計算這個值
          : this.popperAppendToBody;
      },
      isFirstLevel() {
        let isFirstLevel = true;
        let parent = this.$parent;
        while (parent && parent !== this.rootMenu) {
        
        //計算當前是否時第一級菜單。
        //看上去是沒問題的,因為代碼里已經指明了當前的組件名是 componentName: 'ElSubmenu', 但是在調試中發(fā)現(xiàn),componentName的值是Undefined, 因此不管是在哪一級,最后的結果都是 isFirstLevel = true 
          if (['ElSubmenu', 'ElMenuItemGroup'].indexOf(parent.$options.componentName) > -1) {
            isFirstLevel = false;
            break;
          } else {
            parent = parent.$parent;
          }
        }
        return isFirstLevel;
      }
 }
}

至于為什么vue在組件注冊時沒有收集這個參數(shù),還需要從源碼那邊看,午休時間過了,要繼續(xù)擼代碼了…得空了再分析一下…

處理方式

給el-submenu添加一個屬性 :popper-append-to-body=“true false” 顯式的指明appendToBody為false

特別致歉:

此前的處理方式寫錯了,寫的是:popper-append-to-body=“true” 因此即使添加了這個屬性,也依然是報錯的,在此致歉!

到此這篇關于詳解Element-ui NavMenu子菜單使用遞歸生成時使用報錯的文章就介紹到這了,更多相關Element-ui NavMenu子菜單遞歸生成內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue3項目中使用ECharts的方法步驟

    Vue3項目中使用ECharts的方法步驟

    這篇文章主要介紹了Vue3項目中使用ECharts的方法步驟,ECharts可以創(chuàng)建各種類型的圖表,比如折線圖、柱狀圖、餅圖等,配置選項還包括顏色、數(shù)據(jù)縮放、工具箱等,以實現(xiàn)豐富的圖表效果和交互功能,需要的朋友可以參考下
    2024-10-10
  • vue2.0學習之axios的封裝與vuex介紹

    vue2.0學習之axios的封裝與vuex介紹

    最近在研究Vuex2.0,搞了好幾天終于有點頭緒了。下面這篇文章主要給大家介紹了關于vue2.0學習之axios的封裝與vuex的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • vuex 的簡單使用

    vuex 的簡單使用

    vuex是一個專門為vue.js設計的集中式狀態(tài)管理架構。這篇文章主要介紹了vuex 的簡單使用,需要的朋友可以參考下
    2018-03-03
  • vue+elementUI中el-radio設置默認值方式

    vue+elementUI中el-radio設置默認值方式

    這篇文章主要介紹了vue+elementUI中el-radio設置默認值方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Vue中map()的用法案例

    Vue中map()的用法案例

    map()函數(shù)定義在JS的array中,它返回一個新的數(shù)組,下面這篇文章主要給大家介紹了關于Vue中map()的用法案例,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • vue打包之后配置統(tǒng)一請求地址步驟詳解

    vue打包之后配置統(tǒng)一請求地址步驟詳解

    這篇文章主要為大家介紹了vue打包之后配置統(tǒng)一請求地址實現(xiàn)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • vue腳手架中配置Sass的方法

    vue腳手架中配置Sass的方法

    本篇文章主要介紹了vue腳手架中配置Sass的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • VUE中V-IF條件判斷改變元素的樣式操作

    VUE中V-IF條件判斷改變元素的樣式操作

    這篇文章主要介紹了VUE中V-IF條件判斷改變元素的樣式操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨想過來看看吧
    2020-08-08
  • vue-cli3 熱更新配置操作

    vue-cli3 熱更新配置操作

    這篇文章主要介紹了vue-cli3 熱更新配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue3中setup語法糖下通用的分頁插件實例詳解

    vue3中setup語法糖下通用的分頁插件實例詳解

    這篇文章主要介紹了vue3中setup語法糖下通用的分頁插件,實例代碼介紹了自定義分頁插件:PagePlugin.vue,文中提到了vue3中setup語法糖下父子組件之間的通信,需要的朋友可以參考下
    2022-10-10

最新評論

济阳县| 五指山市| 赤峰市| 剑阁县| 日土县| 通渭县| 富川| 资阳市| 图们市| 祁阳县| 曲阜市| 明水县| 灌南县| 河南省| 武安市| 吉木乃县| 廊坊市| 揭阳市| 布尔津县| 永济市| 揭西县| 永川市| 定安县| 荔波县| 汝城县| 海丰县| 萨迦县| 新昌县| 神农架林区| 宝兴县| 文化| 伊宁县| 江西省| 博乐市| 麻阳| 吴堡县| 沙湾县| 元谋县| 会同县| 错那县| 曲松县|