vue element-ui 刷新页面后导航菜单不高亮问题

本文由博主原创,搬迁于本人博客:https://yleen.cc/archives/9.html

问题详情:

在使用element-ui的NavMenu组件作为导航菜单的时候,我是通过遍历router/index.js里的路由json数组(已定义成常量)来作为NavMenu的渲染数据的。但是我发现刷新页面之后NavMenu就失去了高亮。

尝试解决:

初步Google搜索之后发现原来NavMenu组件有这么一个参数配置用来管理当前激活的菜单:

default-active 说明:当前激活菜单的 index 类型:String (—摘自官方文档)

我们可以直接配置它指向当前的路由路径,给NavMenu配置如下:

:default-active="$route.path"

配置完后我们点击导航,刷新……耶,保持高亮了!

然后你以为就完事大吉了?NoNoNo >

如果你的路由里还有子路由的话,你就会发现子路由里刷新后导航菜单居然没有高亮。

​ 例如,导航菜单里点击课程列表,(此时刷新页面能正常高亮),然后在课程列表里点击管理课程,跳转到子路由管理课程页面),这时再刷新页面,导航菜单就不高亮了。

9image-20190821144425263.png

分析原因:

  • 检查切换导航时路由路径的变化

    先查看每次切换和刷新路由时$route参数的变化,在导航菜单组件里监视一下$route,代码如下:

    //代码放在导航菜单组件所在的页面里
    watch: {
      $route: function(to, from) {
        console.log(this.$route);
      }
    }
    

    其中console输出route的结构中,path指的是当前路由的路径,fullPath是完整带参数的路径,matched指的是当前路由匹配到的组件类。

    分析切换路由后路径的变化,发现切换导航菜单里一级路由和字路由输出的路由路径path是不一样的,

9屏幕快照 2019-08-21 16.41.46.png

我怀疑是因为导航菜单的高亮需要匹配到一级路由的path路径,即default-active="一级路由路径",而子路由的路径与其不一致导致的导航无法高亮。

最终解决问题:

修改default-active的配置方案:

:default-active="myPath"	//myPath为绑定自定义变量,请自行在data()中定义该变量

通过watch监视路由的变化,并处理:default-active绑定的路径变量:

watch: {
    $route: function(to, from) {	//监视$route的变化
      //设置导航菜单高亮的路径为前两段路径
      this.myPath = this.$route.matched[1].path;	//看你的情况而定!!!
    }
}

解释:这里的$route.matched是个数组,指的是当前路由匹配到的组件类,一般情况下跟路由配置文件router/index.js里的路由json配置有关。这里用到里面每个对象的path参数,看下图,这些路径其实就是路由json配置里的路径层级。那么上面的代码中$route.matched[1]中取第几个路径是你的情况而定,我这里是每个导航内容的一级路由路径都是第二个,所以取数组的下标1。

9屏幕快照 2019-08-21 17.02.10.png

同理,该方法也能处理Tabs标签页等组件的刷新高亮问题。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
你可以使用 <el-code> 组件来展示代码,它是 Element UI 中专门用来展示代码的组件。具体使用方法如下: 1. 首先需要在页面中引入 Element UI 和 Prism.js: ```html <!-- 引入 Element UI --> <link rel="stylesheet" href="//unpkg.com/element-ui/lib/theme-chalk/index.css"> <script src="//unpkg.com/vue/dist/vue.js"></script> <script src="//unpkg.com/element-ui/lib/index.js"></script> <!-- 引入 Prism.js --> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism.min.css"> <script src="//cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/prism.min.js"></script> ``` 2. 在组件中使用 <el-code> 组件来展示代码: ```vue <template> <el-code language="html" :code="code"></el-code> </template> <script> export default { data() { return { code: '<div>Hello, World!</div>' } } } </script> ``` 在上面的示例中,我们使用了 <el-code> 组件来展示一段 HTML 代码,并将代码存储在组件的 data 中。你可以根据需要将代码存储在 data 中,然后将其传递给 <el-code> 组件的 :code 属性。 3. 为 <el-code> 组件添加 Prism.js 支持: ```vue <template> <el-code language="html" :code="code" ref="code"></el-code> </template> <script> export default { data() { return { code: '<div>Hello, World!</div>' } }, mounted() { Prism.highlightAllUnder(this.$refs.code.$el) } } </script> ``` 在上面的示例中,我们在组件的 mounted 钩子函数中使用 Prism.js 的 highlightAllUnder 方法为 <el-code> 组件添加语法高亮支持。需要注意的是,我们需要先使用 $refs 获取到 <el-code> 组件的实例,然后再使用其 $el 属性获取到实际的 DOM 元素,最后将其传递给 highlightAllUnder 方法即可。 希望以上内容能对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@月琳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值