element導(dǎo)航問(wèn)題總結(jié)

在使用vue-router的時(shí)候遇到了一些小問(wèn)題,在這里總結(jié)一下

1.自己寫(xiě)導(dǎo)航--利用官方路由做當(dāng)前導(dǎo)航高亮(active)

官方文檔
router-link-active----激活 class 類名
router-link-exact-active----精確激活的默認(rèn)的 class
第一個(gè)的問(wèn)題是如果把網(wǎng)站根目錄設(shè)置為首頁(yè),那么不論在那個(gè)路由里面都會(huì)匹配的首頁(yè)路由
第二個(gè)的問(wèn)題是如果沒(méi)有嵌套路由的情況下,沒(méi)問(wèn)題,但是如果有嵌套路由,那么exact-active是匹配不到嵌套路由的子路由的

解決辦法是在每一個(gè)路由中自定義一個(gè)meta:active屬性,同一級(jí)的路由active屬性一樣
{
      path: '/',
      name: '',
      component: indexPage,
      meta:{active:1},
      children:[
        {
          path:'/',//list
          name:'indexList',
          component:indexList,
          meta:{active:1},
        },
        {
          path:'/edit/:blogId',//edit
          name:'indexEdit',
          component:indexEdit,
          meta:{active:1,needLogin:true},
        },
        {
          path:'/detail/:blogId',//detail
          name:'indexDetail',
          component:indexDetail,
          meta:{active:1},
        }
      ],
    }
在導(dǎo)航組件中針對(duì)每一次導(dǎo)航切換先拿到meta中的active值,再匹配到對(duì)應(yīng)下標(biāo)的導(dǎo)航中,對(duì)應(yīng)導(dǎo)航的isAct屬性,從而改變當(dāng)前導(dǎo)航的active
data () {
    return {
      navs:[
        {page:'intro',url:'/intro',names:'頁(yè)面1',isAct:false},
        {page:'index',url:'/',names:'頁(yè)面2',isAct:false},
        {page:'write',url:'/write',names:'頁(yè)面3',isAct:false},
      ]
    }
  },
  watch:{
    '$route'(to,from){
      for(var i=0;i<this.navs.length;i++){
        this.navs[i].isAct=false
      }
      if(this.$route.meta.active||this.$route.meta.active==0){  //在沒(méi)有active的頁(yè)面不高亮顯示
        this.navs[to.meta.active].isAct=true
      }
    }
  },

這樣確實(shí)是解決了路由高亮的問(wèn)題,但是這肯定不是最終的解決方案,不過(guò)是取巧罷了,因?yàn)槭浅榭諏?xiě)的小demo,沒(méi)有更深入的測(cè)試,肯定是有問(wèn)題存在的,希望有這方面思路的大神能指點(diǎn)一二

2.這里介紹element導(dǎo)航組件的使用問(wèn)題及解決方案

首先說(shuō)下遇到的問(wèn)題
1.進(jìn)入嵌套路由,當(dāng)前父導(dǎo)航無(wú)法高亮顯示
2.頁(yè)面刷新后導(dǎo)航重置問(wèn)題
3.在嵌套路由刷新頁(yè)面也會(huì)導(dǎo)致導(dǎo)航重置
網(wǎng)上看了也有一些解決方案,有些人用vuex去控制。。。感覺(jué)沒(méi)必要,說(shuō)下我自己總結(jié)的辦法

安裝引入element
cnpm install element-ui --save
// element
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

element導(dǎo)航組件地址
我這里用的是第二個(gè)側(cè)欄組件

使用側(cè)欄

建議先看下文檔的屬性說(shuō)明,更改三個(gè)默認(rèn)屬性值

element:{
        //是否只保持一個(gè)子菜單的展開(kāi)
        opened:true,  
        //是否使用 vue-router 的模式
        //啟用該模式會(huì)在激活導(dǎo)航時(shí)以 index 作為 path 進(jìn)行路由跳轉(zhuǎn) 
        router:true, 
        //當(dāng)前激活菜單的 index
        active:''
      }
//綁定到對(duì)應(yīng)的屬性
      :default-active="element.active"
      class="el-menu-vertical-demo"
      @open="handleOpen"
      :router="element.router"

這里讓導(dǎo)航默認(rèn)去讀路由的url來(lái)匹配對(duì)應(yīng)的當(dāng)前路由

導(dǎo)航匹配路由url
mounted(){
    this.element.active=this.$route.fullPath
  },

這樣一來(lái),隨便切換路由都會(huì)對(duì)應(yīng)高亮當(dāng)前路由,刷新頁(yè)面后也是沒(méi)問(wèn)題的
接下來(lái)加入一個(gè)嵌套路由,當(dāng)加入嵌套路由的時(shí)候,當(dāng)前路由也能正確的匹配,但是當(dāng)停留在當(dāng)前嵌套路由刷新頁(yè)面的時(shí)候,就匹配不到了

改變匹配路由的參數(shù)fullPath=>mathed
mounted(){
    // this.element.active=this.$route.fullPath
    this.element.active=this.$route.matched[0].path
  },

fullPath匹配的是當(dāng)前路由的完整路徑,在router屬性中,matched屬性更適合用來(lái)做路由匹配。然后刷新頁(yè)面,在嵌套路由中也不會(huì)丟失當(dāng)前路由的active了~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,527評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,848評(píng)論 25 709
  • 在知道出售時(shí)間上篇時(shí)知道成長(zhǎng)是關(guān)鍵,也有了選擇判斷標(biāo)準(zhǔn),既我選擇的工作能不能讓我積累更多的能力,這只是其中一個(gè)選擇...
    那一曙光閱讀 120評(píng)論 0 0

友情鏈接更多精彩內(nèi)容