欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Element-ui NavMenu子菜单使用递归生成时使用报错

程序员文章站 2022-04-07 17:51:04
当采用递归方式生成导航栏的子菜单时,菜单可以正常生成,但是当鼠标hover时,会出现循环调用某个(mouseenter)事件,导致最后报错处理方式注:2.13.2 版本,只需对子菜单设置属性 :pop...

当采用递归方式生成导航栏的子菜单时,菜单可以正常生成,但是当鼠标hover时,会出现循环调用某个(mouseenter)事件,导致最后报错

处理方式

注:2.13.2 版本,只需对子菜单设置属性 :popper-append-to-body="false" 就不会出现这个问题了

报错信息如下:

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

错误分析

观察递归生成的导航栏代码及报错代码:

猜测是因为事件冒泡或下沉导致元素重复派发和接受mouseenter事件,造成了类似死循环的状态,因时间关系,没做深究,后面有时间的时候再查下根本原因(如果记得的话…)

当鼠标移入到菜单中时,触发handlemouseenter方法,但是因为appendtobody为true,所以又派发了鼠标移入事件,然后又回到了这个方法,由此造成了死循环。appendtobody是一个计算属性,那么为什么appendtobody会是true呢?看代码:

至于为什么vue在组件注册时没有收集这个参数,还需要从源码那边看,午休时间过了,要继续撸代码了…得空了再分析一下…

处理方式

给el-submenu添加一个属性 :popper-append-to-body=“true false” 显式的指明appendtobody为false

特别致歉:

此前的处理方式写错了,写的是:popper-append-to-body=“true” 因此即使添加了这个属性,也依然是报错的,在此致歉!

到此这篇关于详解element-ui navmenu子菜单使用递归生成时使用报错的文章就介绍到这了,更多相关element-ui navmenu子菜单递归生成内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!