一步一步學Vue(五)


本篇是是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>
View Code

瀏覽器打開運行,可見如圖效果:

  在運行過程中,我們發現有一點體驗不好的地方,在初始化頁面時,頁面路徑為#/時,並沒有加載任何組件,因為我們沒有配置任何一個路由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>
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM