vue-router定義元信息meta操作
router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import Test from '../views/Test.vue'
import NotFound from '../views/NotFound.vue'
import TestChild from '../views/TestChild.vue'
import AView from '../views/AView.vue'
import BView from '../views/BView.vue'
Vue.use(VueRouter)
const routes = [
{
path: '/',
alias:'/home',
components:{
default: Home,
aView: AView,
bView: BView,
},
},
{
path: '/test/:id',
name: 'Test',
component: Test,
props:true,
children:[
{
path: ':name',
name: 'TestChild',
component: TestChild,
props:true,
/*
定義路由的時(shí)候可以配置 meta 字段,用于一些校驗(yàn),比如在導(dǎo)航守衛(wèi)中進(jìn)行校驗(yàn),定義的值可以在$route中訪問到
*/
meta:{
isRequiresAuth:true,
isChecked:false,
}
}]
},
{
path: '*',
name: 'NotFound',
component: NotFound
},
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
views/TestChild.vue
<template>
<div>
我是TestChild,查看動(dòng)態(tài)路由參數(shù)name:{{name}}
</div>
</template>
<script>
export default {
props:["name"],
created () {
//打印meta中定義的isRequiresAuth
console.log(this.$route.meta.isRequiresAuth);
},
}
</script>
<style lang="scss" scoped>
</style>
效果截圖:

補(bǔ)充知識:vue-router路由元信息及keep-alive組件級緩存
路由元信息?(黑人問號臉???)是不是這么官方的解釋很多人都會(huì)一臉懵?那么我們說meta,是不是很多人恍然大悟,因?yàn)樵陧?xiàng)目中用到或者看到過呢?
是的,路由元信息就是我們定義路由時(shí)配置的meta字段;那么這個(gè)meta的作用是什么呢?
首先看一個(gè)場景:
通常我們在開發(fā)網(wǎng)站或者移動(dòng)應(yīng)用的時(shí)候,我們通常會(huì)有網(wǎng)頁權(quán)限驗(yàn)證的需求(別說你沒有,你肯定有),這種需求一般是指需要登錄后才可進(jìn)入,也就是需要用戶登錄獲取用戶Token或者用戶信息之后才可進(jìn)入;當(dāng)這個(gè)需求下來的時(shí)候,我們作為前端開發(fā)人員的第一反應(yīng)是路由守衛(wèi)啊,一個(gè)路由前置守衛(wèi)通過判斷to.path就可以解決;
用to.path來判斷做權(quán)限驗(yàn)證會(huì)有兩個(gè)問題:
1:首先,如果需要做權(quán)限驗(yàn)證的頁面很多呢?難道我們要通過if(to.path==='/' || to.path === '/home')這種方式來一個(gè)個(gè)的添加路徑判斷嗎?
2:然后,routes管理器中會(huì)有很多json對象,這種json對象我們通常把它叫做路由記錄,路由記錄是可以嵌套的,允許存在父子關(guān)系;我們用if來判斷的時(shí)候,會(huì)有匹配不完全的問題,例如你匹配了/home,那么/home/list呢,這個(gè)將不會(huì)被匹配到;
我們的理想狀態(tài)下是假如我要限制了/home,那么不管你路徑是/home/index也好還是/home/home也好,只要是home下來的子路由記錄統(tǒng)統(tǒng)都需要登錄后才能訪問;
這個(gè)時(shí)候我們就可以考慮用路由元信息meta來進(jìn)行處理;
首先簡單的看一下頁面效果:

我們的路由管理器中的路由記錄配置如下:
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字段是標(biāo)識當(dāng)前路由是否需要驗(yàn)證token;
然后我們的路由前置全局守衛(wèi)可以這么寫:
router.beforeEach((to, from, next) => {
//定義token來模擬
let token =“123456”
//判斷即將進(jìn)入的路由是否需要驗(yàn)證
if(to.meta.login){
//如果即將進(jìn)入的路由需要驗(yàn)證
//并且token不存在的話,那么就跳轉(zhuǎn)page2(登錄頁)
if(!token){
next("/page2");
//如果需求驗(yàn)證token存在直接放行
}else{
next();
}
//如果不需要驗(yàn)證也是直接放行
}else{
next();
}
})
最后效果圖如下:

當(dāng)然這只是路由元信息的功能其一,路由元信息其實(shí)有很多用途,類似于一個(gè)當(dāng)前路由的全局變量,可以通過meta來進(jìn)行判斷操作;
keep-alive組件:
場景:
在一個(gè)列表項(xiàng)很長的時(shí)候我們通常需要進(jìn)行分頁操作,移動(dòng)端的分頁操作基本上是上拉加載和下拉刷新;假如我們已經(jīng)進(jìn)入了這個(gè)列表的第四頁,那么當(dāng)我們想進(jìn)去詳情頁查看詳情的時(shí)候,當(dāng)我們返回的時(shí)候這個(gè)時(shí)候頁碼會(huì)直接變?yōu)?,因?yàn)閿?shù)據(jù)已經(jīng)初始化狀態(tài);這個(gè)問題我們通常需要keep-alive組件來解決;
keep-alive是Vue內(nèi)置的一個(gè)組件,通常是用來保留數(shù)據(jù)狀態(tài)或避免重復(fù)渲染,也就是我們說的緩存效果;
使用:
<keep-alive> <component> <!-- 該組件將被緩存! --> </component> </keep-alive>
keep-alive給我們提供了兩個(gè)屬性,分別是include和exclude:
include:接受值為字符串或者正則表達(dá)式,只有匹配的才被緩存;
exclude:接受值為字符串或者正則表達(dá)式,被匹配的路由將不會(huì)被緩存;
// 組件 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)或避免重新渲染
當(dāng)然我們也可以根據(jù)組件來動(dòng)態(tài)緩存,我們知道vue-router是Vue官方給我們提供的一個(gè)路由組件:
<keep-alive> <router-view> <!-- 所有路徑匹配到的視圖組件都會(huì)被緩存! --> </router-view> </keep-alive>
如果像上述代碼這樣,我們的所有路由視圖都將被緩存,我們這個(gè)時(shí)候就可以借助我們的路由元信息meta,那么我們來修改一下代碼實(shí)現(xiàn)動(dòng)態(tài)緩存:
思路:
meta路由元信息對象里面放著的是類似于局部變量,在路由匹配的組件內(nèi)部都能夠訪問得到,我們可以通過meta來定義一個(gè)自定義字段來判斷標(biāo)識頁面是否需要開啟緩存:
// routes 配置
export default [
{
path: '/',
name: 'home',
component: Home,
meta: {
keepAlive: true // 需要被緩存
}
}, {
path: '/:id',
name: 'edit',
component: Edit,
meta: {
keepAlive: false // 不需要被緩存
}
}
]
//通過v-if來動(dòng)態(tài)的判斷展示 <keep-alive> <router-view v-if="$route.meta.keepAlive"> <!-- 這里是會(huì)被緩存的視圖組件,比如 Home! --> </router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"> <!-- 這里是不被緩存的視圖組件,比如 Edit! --> </router-view>
以上這篇vue-router定義元信息meta操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3 axios 實(shí)現(xiàn)自動(dòng)化api配置詳解
這篇文章主要為大家介紹了vue3 axios 實(shí)現(xiàn)自動(dòng)化api配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
vue實(shí)現(xiàn)路由監(jiān)聽和參數(shù)監(jiān)聽
今天小編就為大家分享一篇vue實(shí)現(xiàn)路由監(jiān)聽和參數(shù)監(jiān)聽,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
Vue中computed和watch的區(qū)別小結(jié)
watch和computed都是以Vue的依賴追蹤機(jī)制為基礎(chǔ)的,當(dāng)某一個(gè)依賴型數(shù)據(jù)發(fā)生變化的時(shí)候,所有依賴這個(gè)數(shù)據(jù)的相關(guān)數(shù)據(jù)會(huì)自動(dòng)發(fā)生變化,即自動(dòng)調(diào)用相關(guān)的函數(shù),來實(shí)現(xiàn)數(shù)據(jù)的變動(dòng),這篇文章簡單介紹下Vue中computed和watch的區(qū)別異同,感興趣的朋友一起看看吧2022-12-12
解決vue前端rsa加密遇到的問題message too long for RS
這篇文章主要介紹了解決vue前端rsa加密遇到的問題message too long for RSA,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Electron-vue腳手架改造vue項(xiàng)目的方法
這篇文章主要介紹了Electron-vue腳手架改造vue項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10

