vue-router路由元信息及keep-alive組件級緩存

路由元信息轰驳?(黑人問號臉?弟灼?级解?)是不是這么官方的解釋很多人都會一臉懵?那么我們說meta田绑,是不是很多人恍然大悟勤哗,因為在項目中用到或者看到過呢?

是的掩驱,路由元信息就是我們定義路由時配置的meta字段芒划;那么這個meta的作用是什么呢?

首先看一個場景:

通常我們在開發(fā)網(wǎng)站或者移動應(yīng)用的時候欧穴,我們通常會有網(wǎng)頁權(quán)限驗證的需求(別說你沒有民逼,你肯定有),這種需求一般是指需要登錄后才可進入涮帘,也就是需要用戶登錄獲取用戶Token或者用戶信息之后才可進入拼苍;當這個需求下來的時候,我們作為前端開發(fā)人員的第一反應(yīng)是路由守衛(wèi)啊调缨,一個路由前置守衛(wèi)通過判斷to.path就可以解決疮鲫;

用to.path來判斷做權(quán)限驗證會有兩個問題:

1:首先,如果需要做權(quán)限驗證的頁面很多呢弦叶?難道我們要通過if(to.path==='/' || to.path === '/home')這種方式來一個個的添加路徑判斷嗎俊犯?

2:然后,routes管理器中會有很多json對象湾蔓,這種json對象我們通常把它叫做路由記錄瘫析,路由記錄是可以嵌套的,允許存在父子關(guān)系默责;我們用if來判斷的時候贬循,會有匹配不完全的問題,例如你匹配了/home桃序,那么/home/list呢杖虾,這個將不會被匹配到;

我們的理想狀態(tài)下是假如我要限制了/home媒熊,那么不管你路徑是/home/index也好還是/home/home也好奇适,只要是home下來的子路由記錄統(tǒng)統(tǒng)都需要登錄后才能訪問坟比;

這個時候我們就可以考慮用路由元信息meta來進行處理;

首先簡單的看一下頁面效果:

  
image

我們的路由管理器中的路由記錄配置如下:

const routes=[
    {
        path:'/page1',
        component:page1,
        meta:{
            login:true
        },
        children: [
            {
                path: "phone",
                component: phone
            },
            {
                path: "computer",
                component: computer
            },
        ]
    },

    {
        path:"/page2",
        component:page2,
        meta:{
            login:false
        }
    },
]

我們上面在meta中自定義login字段是標識當前路由是否需要驗證token嚷往;

然后我們的路由前置全局守衛(wèi)可以這么寫:

router.beforeEach((to, from, next) => {
   //定義token來模擬
    let token =“123456”
   //判斷即將進入的路由是否需要驗證
   if(to.meta.login){
     //如果即將進入的路由需要驗證
    //并且token不存在的話葛账,那么就跳轉(zhuǎn)page2(登錄頁)
       if(!token){
           next("/page2");
      //如果需求驗證token存在直接放行
       }else{
           next();
       }
    //如果不需要驗證也是直接放行
   }else{
    next();
   }
})

最后效果圖如下:

image

當然這只是路由元信息的功能其一,路由元信息其實有很多用途皮仁,類似于一個當前路由的全局變量籍琳,可以通過meta來進行判斷操作;

keep-alive組件:

場景:在一個列表項很長的時候我們通常需要進行分頁操作贷祈,移動端的分頁操作基本上是上拉加載和下拉刷新趋急;假如我們已經(jīng)進入了這個列表的第四頁,那么當我們想進去詳情頁查看詳情的時候势誊,當我們返回的時候這個時候頁碼會直接變?yōu)?呜达,因為數(shù)據(jù)已經(jīng)初始化狀態(tài);這個問題我們通常需要keep-alive組件來解決粟耻;

keep-alive是Vue內(nèi)置的一個組件查近,通常是用來保留數(shù)據(jù)狀態(tài)或避免重復(fù)渲染,也就是我們說的緩存效果勋颖;

使用:

<keep-alive>
  <component>
    <!-- 該組件將被緩存嗦嗡! -->
  </component>
</keep-alive>

keep-alive給我們提供了兩個屬性,分別是include和exclude:

include:接受值為字符串或者正則表達式饭玲,只有匹配的才被緩存侥祭;

exclude:接受值為字符串或者正則表達式,被匹配的路由將不會被緩存茄厘;

// 組件 a
export default {
  name: 'a',
  data () {
    return {}
  }
}
<keep-alive include="a">
  <component>
    <!-- name 為 a 的組件將被緩存矮冬! -->
  </component>
</keep-alive>可以保留它的狀態(tài)或避免重新渲染
<keep-alive exclude="a">
  <component>
    <!-- 除了 name 為 a 的組件都將被緩存! -->
  </component>
</keep-alive>可以保留它的狀態(tài)或避免重新渲染

當然我們也可以根據(jù)組件來動態(tài)緩存次哈,我們知道vue-router是Vue官方給我們提供的一個路由組件:

<keep-alive>
    <router-view>
        <!-- 所有路徑匹配到的視圖組件都會被緩存胎署! -->
    </router-view>
</keep-alive>

如果像上述代碼這樣,我們的所有路由視圖都將被緩存窑滞,我們這個時候就可以借助我們的路由元信息meta琼牧,那么我們來修改一下代碼實現(xiàn)動態(tài)緩存:

思路:

meta路由元信息對象里面放著的是類似于局部變量,在路由匹配的組件內(nèi)部都能夠訪問得到哀卫,我們可以通過meta來定義一個自定義字段來判斷標識頁面是否需要開啟緩存:

// routes 配置
export default [
  {
    path: '/',
    name: 'home',
    component: Home,
    meta: {
      keepAlive: true // 需要被緩存
    }
  }, {
    path: '/:id',
    name: 'edit',
    component: Edit,
    meta: {
      keepAlive: false // 不需要被緩存
    }
  }
]
 //通過v-if來動態(tài)的判斷展示
<keep-alive>
    <router-view v-if="$route.meta.keepAlive">
        <!-- 這里是會被緩存的視圖組件巨坊,比如 Home! -->
    </router-view>
</keep-alive>

<router-view v-if="!$route.meta.keepAlive">
    <!-- 這里是不被緩存的視圖組件此改,比如 Edit趾撵! -->
</router-view>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市共啃,隨后出現(xiàn)的幾起案子占调,更是在濱河造成了極大的恐慌暂题,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件究珊,死亡現(xiàn)場離奇詭異薪者,居然都是意外死亡,警方通過查閱死者的電腦和手機苦银,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門啸胧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赶站,“玉大人幔虏,你說我怎么就攤上這事”创唬” “怎么了想括?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烙博。 經(jīng)常有香客問我瑟蜈,道長,這世上最難降的妖魔是什么渣窜? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任铺根,我火速辦了婚禮,結(jié)果婚禮上乔宿,老公的妹妹穿的比我還像新娘位迂。我一直安慰自己,他們只是感情好详瑞,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布掂林。 她就那樣靜靜地躺著,像睡著了一般坝橡。 火紅的嫁衣襯著肌膚如雪泻帮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天计寇,我揣著相機與錄音锣杂,去河邊找鬼。 笑死番宁,一個胖子當著我的面吹牛元莫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贝淤,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼柒竞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了播聪?” 一聲冷哼從身側(cè)響起朽基,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤布隔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稼虎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衅檀,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年霎俩,在試婚紗的時候發(fā)現(xiàn)自己被綠了哀军。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡打却,死狀恐怖杉适,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柳击,我是刑警寧澤猿推,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站捌肴,受9級特大地震影響蹬叭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜状知,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一秽五、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饥悴,春花似錦坦喘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至济榨,卻和暖如春坯沪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擒滑。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工腐晾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丐一。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓藻糖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親库车。 傳聞我的和親對象是個殘疾皇子巨柒,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容