本篇是是vue路由的開篇,會以一個簡單的demo對vue-router進行一個介紹,主要覆蓋以下幾個常用場景:
1、路由跳轉
2、嵌套路由
3、路由參數
1、Vue-Router
一般來說,路由定義就是定義地址訪問規則,然后由路由引擎根據這些定義的規則去查找對應的頁面,並轉發請求給頁面進行處理;對於后端來說就是這么一個模式,但前端不同,前端路由變化也只是頁面內的導航比如angular中的模版切換,比如vue和react中的component切換,這種方式都是基於瀏覽器hash模擬url跳轉。
vue-router是官方提供的一套路由工具庫,基於component的路由配置引入都非常簡單,最常用的是兩個指令:router-view 和 router-link,router-view用來提供占位,router-link提供路由鏈接,對於這兩個指令的介紹,我們可以直接通過demo介紹。接下來我們以傳統方式引入vue-router:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Vue-demo2</title> <script src="https://cdn.bootcss.com/vue/2.4.1/vue.js"></script> <script src="https://cdn.bootcss.com/vue-router/2.7.0/vue-router.js"></script> <link href="./css/layui.css" rel="stylesheet"> </head> <body> <div id="app"> </div> </body>
2、路由跳轉
對我們的demo做一下簡單介紹,demo包含:首頁、新聞列表、關於三個模塊;其中新聞列表包含最新新聞、歷史新聞;每個新聞題目單擊時,可查看其詳情頁。
ok,第一步,我們實現基本的路由跳轉,單擊各個模塊,分別打開對應“頁面”,可以按照如下幾個步驟處理:
1、創建模塊組件
2、創建路由對象,配置路由組件映射關系
3、編寫路由鏈接和容器
4、啟用路由
首先,按照上述第一個步驟,我們需要創建三個模塊組件:HomeComponent,NewsComponent,AboutComponent:
var HomeComponent = { template: '<div>Home</div>' }; var NewsComponent = { template: '<div>News</div>' }; var AboutComponent = { template: '<div>About</div>' };
第二步,配置路由組件映射關系:
var router = new VueRouter({
linkActiveClass:'layui-this',//active時會add class layui-this routes: [ { name: 'home', path: '/home', component: HomeComponent }, { name: 'news', path: '/news', component: NewsComponent }, { name: 'about', path: '/about', component: AboutComponent } ] })
其中name表示一個具名路由,在創建路由鏈接的時候可以以path作為路徑,也支持直接使用name作為跳轉依據,但是path如果改變了,需要多個地方引入的path進行調整。
第三步,編寫路由鏈接和容器,這里就是router-link和router-view指令的使用了,配置三個路由分別對應上面代碼添加的三個路由(這里引入了layerui作為基礎樣式)
<div> <ul class="layui-nav"> <router-link :to="{name:'home'}" tag='li' class="layui-nav-item"><a href="">首頁</a></router-link> <router-link :to="{name:'news'}" tag='li' class="layui-nav-item"><a href="">新聞列表</a></router-link> <router-link :to="{name:'about'}" tag='li' class="layui-nav-item"><a href="">聯系我們</a></router-link> </ul> <div class="layer-form"> <router-view></router-view> </div> </div>
其中to要寫成:to,因為參數是對象,而不是一個字符串,tag表示router-link渲染的目標標簽,這里表示渲染成li標簽。
第四步,路由啟用,路由模塊可以深度集成到Vue實例中,集成方式如下:
var app = new Vue({ el: '#app', template: ` <div> <ul class="layui-nav"> <router-link :to="{name:'home'}" tag='li' class="layui-nav-item " extract><a href="">首頁</a></router-link> <router-link :to="{name:'news'}" tag='li' class="layui-nav-item"><a href="">新聞列表</a></router-link> <router-link :to="{name:'about'}" tag='li' class="layui-nav-item"><a href="">聯系我們</a></router-link> </ul> <div class="layer-form"> <router-view></router-view> </div> </div> `, router: router })
此時完整代碼如下:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Vue-demo2</title> <script src="https://cdn.bootcss.com/vue/2.4.1/vue.js"></script> <script src="https://cdn.bootcss.com/vue-router/2.7.0/vue-router.js"></script> <link href="./css/layui.css" rel="stylesheet"> </head> <body> <div id="app"> </div> <script> var HomeComponent = { template: '<div>Home</div>' }; var NewsComponent = { template: '<div>News</div>' }; var AboutComponent = { template: '<div>About</div>' }; var router = new VueRouter({ linkActiveClass:'layui-this', routes: [ { name: 'home', path: '/home', component: HomeComponent }, { name: 'news', path: '/news', component: NewsComponent }, { name: 'about', path: '/about', component: AboutComponent } ] }) var app = new Vue({ el: '#app', template: ` <div> <ul class="layui-nav"> <router-link :to="{name:'home'}" tag='li' class="layui-nav-item" extract><a href="">首頁</a></router-link> <router-link :to="{name:'news'}" tag='li' class="layui-nav-item"><a href="">新聞列表</a></router-link> <router-link :to="{name:'about'}" tag='li' class="layui-nav-item"><a href="">聯系我們</a></router-link> </ul> <div class="layer-form"> <router-view></router-view> </div> </div> `, router: router }) </script> </body> </html>
瀏覽器打開運行,可見如圖效果:
在運行過程中,我們發現有一點體驗不好的地方,在初始化頁面時,頁面路徑為#/時,並沒有加載任何組件,因為我們沒有配置任何一個路由path為‘/’,針對這種情況,可以增加一條路由規則,當路由為/時,跳轉到默認路由;修改路由配置部分代碼如下即可:
routes: [ {path:'/',redirect:'/home'}, { name: 'home', path: '/home', component: HomeComponent }, { name: 'news', path: '/news', component: NewsComponent }, { name: 'about', path: '/about', component: AboutComponent } ]
2、嵌套路由
現在模塊之間跳轉已經OK,但是對於新聞列表,需要包含最新列表和歷史列表,這是在新聞列表模塊下,但是模式和外層路由一樣,還是按照我們的步驟來。
第一步,創建路由組件,這里是最新新聞列表和歷史新聞列表:
var LatestNewsComponent = { template: '<div>Latest News</div>' } var HistoryNewsComponent = { template: '<div>History News</div>' }
第二步,配置組件和路由映射關系:
var router = new VueRouter({ linkActiveClass: 'layui-this', routes: [ { path: '/', redirect: '/home' }, { name: 'home', path: '/home', component: HomeComponent }, { name: 'news', path: '/news', component: NewsComponent, children: [ { path: '', redirect: 'latest' },//默認路由 { name: 'latest-news', path: 'latest', component: LatestNewsComponent }, { name: 'history-news', path: 'hisotry', component: HistoryNewsComponent } ] }, { name: 'about', path: '/about', component: AboutComponent } ] })
第三步,編寫路由鏈接和路由容器,在這里修改NewsComponent:
var NewsComponent = { template: ` <div style="margin-top:5px"> <ul class="layui-nav layui-nav-tree"> <router-link :to="{name:'latest-news'}" class="layui-nav-item" tag="li">最新消息</router-link> <router-link :to="{name:'history-news'}" class="layui-nav-item" tag="li">歷史消息</router-link> </ul> <div> <router-view></router-view> </div> </div>` };
第四步,啟用路由,這個在配置基本路由的時候已經啟用,此處忽略此步驟即可,刷新運行(不要在乎頁面容顏,看功能,😅):
3、路由參數
在web開發中,頁面之間傳遞參數是最常見的業務場景,所以必不可少的前端路由也支持參數傳遞,有地方稱這種路由為動態路由,無論什么名稱,其實就是配置參數傳遞規則,針對我我們的demo,在最新新聞列表中,點擊記錄,訪問到詳情頁,這時候我們就需要傳遞一個動態的記錄id來確定具體是哪一條新聞,這種配置方式和angular-uirouter中的配置一樣,還是按照我們上述步驟一步一步來:
第一步,創建組件新聞明細組件:
var NewsDetailComponent = { template: '<div>新聞編號為{{id}}</div>', data: function () { return { id: '', } }, created: function () { this.id = this.$route.params.id; } }
路由對象啟用后,$route對象注入到了component中,在任何組件中都可以訪問,created方法是component生命周期方法,故名可思意,具體可查文檔,一般用於初始化數據;
接着來添加路由規則:
var router = new VueRouter({ linkActiveClass: 'layui-this', routes: [ { path: '/', redirect: '/home' }, { name: 'home', path: '/home', component: HomeComponent }, { name: 'news', path: '/news', component: NewsComponent, children: [ { name: 'latest-news', path: 'latest', component: LatestNewsComponent }, { name: 'history-news', path: 'hisotry', component: HistoryNewsComponent }, { name: 'news-detail', path: ':id', component: NewsDetailComponent } ] }, { name: 'about', path: '/about', component: AboutComponent } ] })
修改最新news組件,添加路由鏈接:
var LatestNewsComponent = { template: `<ul> <router-link tag='li' v-for="n in news" :key="n.id" :to="{name:'news-detail',params:{id:n.id}}">{{n.title}} </router-link> </ul>`, data: function () { return { news: [ { id: '1', title: 'news 1' }, { id: '2', title: 'news 2' }, { id: '3', title: 'news 3' } ] } } }
刷新頁面並運行結果如下圖所示:
4、小結
本篇只是對vue-router中最常用最簡單的部分做了一下介紹,其實其中包含了另外好多沒有介紹到的內容,比如路由生命周期,比如路由最大的話的組件重用處理,比如路由模式等等,這些。這些多了解一些的,可以直接去官方文檔查看,這里也只是拋磚引玉,先介紹常用的或者后期會用到的,其它的部分根據情況添加,這篇到此為止,下篇接着學習router部分。。。
附全部源碼:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Vue-demo2</title> <script src="https://cdn.bootcss.com/vue/2.4.1/vue.js"></script> <script src="https://cdn.bootcss.com/vue-router/2.7.0/vue-router.js"></script> <link href="./css/layui.css" rel="stylesheet"> </head> <body> <div id="app"> </div> <script> var HomeComponent = { template: '<div>Home</div>' }; var NewsComponent = { template: ` <div style="margin-top:5px"> <ul class="layui-nav layui-nav-tree"> <router-link :to="{name:'latest-news'}" class="layui-nav-item" tag="li">最新消息</router-link> <router-link :to="{name:'history-news'}" class="layui-nav-item" tag="li">歷史消息</router-link> </ul> <div> <router-view></router-view> </div> </div>` }; var AboutComponent = { template: '<div>About</div>' }; var LatestNewsComponent = { template: `<ul> <router-link tag='li' v-for="n in news" :key="n.id" :to="{name:'news-detail',params:{id:n.id}}">{{n.title}} </router-link> </ul>`, data: function () { return { news: [ { id: '1', title: 'news 1' }, { id: '2', title: 'news 2' }, { id: '3', title: 'news 3' } ] } } } var HistoryNewsComponent = { template: '<div>History News</div>' } var NewsDetailComponent = { template: '<div>新聞編號為{{id}}</div>', data: function () { return { id: '', } }, created: function () { this.id = this.$route.params.id; } } var router = new VueRouter({ linkActiveClass: 'layui-this', routes: [ { path: '/', redirect: '/home' }, { name: 'home', path: '/home', component: HomeComponent }, { name: 'news', path: '/news', component: NewsComponent, children: [ { name: 'latest-news', path: 'latest', component: LatestNewsComponent }, { name: 'history-news', path: 'hisotry', component: HistoryNewsComponent }, { name: 'news-detail', path: ':id', component: NewsDetailComponent } ] }, { name: 'about', path: '/about', component: AboutComponent } ] }) var app = new Vue({ el: '#app', template: ` <div> <ul class="layui-nav"> <router-link :to="{name:'home'}" tag='li' class="layui-nav-item" extract><a href="">首頁</a></router-link> <router-link :to="{name:'latest-news'}" tag='li' class="layui-nav-item"><a href="">新聞列表</a></router-link> <router-link :to="{name:'about'}" tag='li' class="layui-nav-item"><a href="">聯系我們</a></router-link> </ul> <div class="layer-form"> <router-view></router-view> </div> </div> `, router: router }) </script> </body> </html>