2020-05-07--Vue路由2--Vue Router簡(jiǎn)介,使用以及嵌套路由,動(dòng)態(tài)路由

Vue Router簡(jiǎn)介

  • 它是一個(gè)Vue.js官方提供的路由管理器。是一個(gè)功能更加強(qiáng)大的前端路由器,推薦使用。
  • Vue Router和Vue.js的核心深度集成,因此非常契合,可以一起方便的實(shí)現(xiàn)SPA單頁(yè)應(yīng)用程序的開發(fā)。
  • Vue Router依賴于Vue,所以需要先引入Vue,再引入Vue Router

Vue Router的特性:

  • 支持H5歷史模式或者h(yuǎn)ash模式
  • 支持嵌套路由
  • 支持路由參數(shù)
  • 支持編程式路由
  • 支持命名路由
  • 支持路由導(dǎo)航守衛(wèi)
  • 支持路由過(guò)渡動(dòng)畫特效
  • 支持路由懶加載
  • 支持路由滾動(dòng)行為

Vue Router的使用步驟(★★★)

    <script src="./js/vue.js"></script>
    <script src="./js/vue-router_3.0.2.js"></script>

在html中

  • A.導(dǎo)入js文件和為全局window對(duì)象掛載VueRouter構(gòu)造函數(shù)
    <script src="./js/vue.js"></script>
    <script src="./js/vue-router_3.0.2.js"></script>
  • B.添加路由鏈接 <router-link>是vue中提供的標(biāo)簽,默認(rèn)會(huì)被渲染為a標(biāo)簽, to屬性默認(rèn)被渲染為href屬性, to屬性的值會(huì)被渲染為#開頭的hash地址
<a href='#user'>user</a>

<router-link to="/user">User</router-link> //與a標(biāo)簽等效
<router-link to="/login">Login</router-link> 

對(duì)應(yīng)關(guān)系:


  • C.添加路由填充位(路由占位符) 最后路由展示的組件就會(huì)在占位符的位置顯示
<component></component>

<router-view></router-view>   //與上邊等效

在js中:

  • D.定義路由組件
#定義組件
var User = { 
        template:"<div>This is User</div>" 
         } 
var Login = { 
        template:"<div>This is Login</div>" 
        } 
  • E.配置路由規(guī)則并創(chuàng)建路由實(shí)例,類似于Vue實(shí)例
var myRouter = new VueRouter({
    //routes是路由規(guī)則數(shù)組
    routes:[
        //每一個(gè)路由規(guī)則都是一個(gè)對(duì)象,對(duì)象中至少包含path和component兩個(gè)屬性
        //path表示  路由匹配的hash地址,component表示路由規(guī)則對(duì)應(yīng)要展示的組件對(duì)象
        {path:"/user",component:User},
        {path:"/login",component:Login}
    ]
})
  • F.將路由掛載到Vue實(shí)例中
var vm = new Vue({
            el:'#app',
            //通過(guò)router屬性掛載路由對(duì)象
            router:myRouter
        })

補(bǔ)充:
路由重定向:可以通過(guò)路由重定向?yàn)轫?yè)面設(shè)置默認(rèn)展示的組件 在路由規(guī)則中添加一條路由規(guī)則即可,如下:

var myRouter = new VueRouter({
    //routes是路由規(guī)則數(shù)組
    routes: [
        //path設(shè)置為/表示頁(yè)面最初始的地址 / ,redirect表示要被重定向的新地址,設(shè)置為一個(gè)路由即可
        { path:"/", redirect:"/user"},             
        { path: "/user", component: User },
        { path: "/login", component: Login }
    ]
})

那么一個(gè)用VueRouter的搭建的小案例實(shí)現(xiàn)了
運(yùn)行:
默認(rèn)顯示頁(yè)面:



點(diǎn)擊login:


嵌套路由的概念

當(dāng)我們進(jìn)行路由的時(shí)候顯示的組件中還有新的子級(jí)路由鏈接以及內(nèi)容。

嵌套路由最關(guān)鍵的代碼在于理解子級(jí)路由的概念: 比如我們有一個(gè)/login的路由 那么/login下面還可以添加子級(jí)路由,如:

  • /login/account
  • /login/phone
<body>
    <div id="app">
        <!-- 路由鏈接 -->
        <router-link to="/user">User</router-link> 
        <router-link to="/login">Login</router-link>
         <!--占位符  -->
        <router-view></router-view>   
    </div>

    <!-- login的模板 -->
    <template id="login">
        <div>
            <h1>This is Login</h1>
            <hr>
            <router-link to="/login/account">賬號(hào)密碼登錄</router-link>
            <router-link to="/login/phone">掃碼登錄</router-link>
            <router-view></router-view>
        </div>
    </template>
    <script>
        //定義組件
        var User = { 
            template:"<div>This is User</div>" 
         } 
        var Login = { 
            template:'#login' 
        } 
        //定義login子路由的組件
        var account = {template: "<div>賬號(hào):<input><br>密碼:<input></div>"};
        var phone = {template: "<h1>掃我二維碼</h1>"};

        //路由實(shí)例
        var myRouter = new VueRouter({
            //routes是路由規(guī)則數(shù)組
            routes:[
                { path:"/", redirect:"/user"},  
                {path:"/user",component:User},
                {
                    path:"/login",
                    component:Login,
                    //定義子路由
                    children: [
                        {path: "/login/account", component: account},
                        {path: "/login/phone", component: phone},
                    ]
                }
            ]
        })
        var vm = new Vue({
            el:'#app',
            //通過(guò)router屬性掛載路由對(duì)象
            router:myRouter
        })
    </script>
</body>

思路:首先用戶點(diǎn)擊Login時(shí),通過(guò)to屬性的值到路由實(shí)例中的定義路由規(guī)則匹配



找到之后通過(guò)component顯示相應(yīng)的組件模板,填充占位符。



結(jié)果顯示:

在該模板中又定義了兩個(gè)路由和一個(gè)占位符,當(dāng)用戶點(diǎn)擊某個(gè)路由后,再次通過(guò)該路由的to屬性到路由規(guī)則數(shù)組中匹配,(因?yàn)槭亲勇酚?,所以直接在父路由的children中尋找匹配)



找到后,顯示組件模板。填充到占位符中。

動(dòng)態(tài)路由

動(dòng)態(tài)路由就是路由鏈接的to屬性的值是動(dòng)態(tài)變化的,
在路由實(shí)例的規(guī)則數(shù)組中進(jìn)行統(tǒng)一獲取,并可以對(duì)該值進(jìn)行操作或顯示到該路由指向的組件模板中。

<!-- 動(dòng)態(tài)路由 -->
<body>
    <div id="app">
        <!-- 路由鏈接 -->
        <router-link to="/user/22">User</router-link> 
        <router-link to="/login">Login</router-link>
         <!--占位符  -->
        <router-view></router-view>   
    </div>
    <script>
        //定義組件
        var User = { 
            template:"<div>User is {{ $route.params.id }}</div>" 
         } 
        var Login = { 
            template:"<div>This is Login</div>" 
        } 

        //路由實(shí)例
        var myRouter = new VueRouter({
            //routes是路由規(guī)則數(shù)組
            routes:[
                //path設(shè)置為/表示頁(yè)面最初始的地址 / ,redirect表示要被重定向的新地址,設(shè)置為一個(gè)路由即可
                { path:"/", redirect:"/user"},  
                  
                //每一個(gè)路由規(guī)則都是一個(gè)對(duì)象,對(duì)象中至少包含path和component兩個(gè)屬性
                //path表示  路由匹配的hash地址,component表示路由規(guī)則對(duì)應(yīng)要展示的組件對(duì)象
                {path:"/user/:id",component:User},
                {path:"/login",component:Login}
            ]
        })
        var vm = new Vue({
            el:'#app',
            //通過(guò)router屬性掛載路由對(duì)象
            router:myRouter
        })
    </script>
</body>

解析:
User的路由鏈接to屬性的值為:



怎么獲取這個(gè)值呢?,到路由規(guī)則數(shù)組中進(jìn)行匹配:



我們發(fā)現(xiàn)修改他的path值為
'/user/:id'

即可獲取id(id為隨便取的名字,可以為pid,bid等)
怎么在其指向的組件模板中顯示該獲取的id值?



在模板中通過(guò)插值的方式----{{$router.params.id}}進(jìn)行獲取。

{{$router.params.id}}

運(yùn)行:
點(diǎn)擊User后,顯示id值



可以在路由對(duì)應(yīng)的組件中使用$route.params.id來(lái)獲取路徑傳參的id參數(shù)值,但是這種方式不夠靈活。今后可以盡量使用props將組件和路由解耦。

1.通過(guò)props來(lái)接收參數(shù)

html中的路由鏈接不變,改變路由規(guī)則數(shù)組和定義組件

//定義組件
 var User = { 
            props: ['id'],  //使用props接收id參數(shù)
            template:"<div>User is {{ id }}</div>" 
        } 

        //路由實(shí)例
        var myRouter = new VueRouter({
            routes:[
                //通過(guò)/:參數(shù)名  的形式傳遞參數(shù)

                // {path:"/user/:id",component:User},

                //如果props設(shè)置為true,route.params將會(huì)被設(shè)置為組件屬性
                {path:"/user/:id",component:User,props: true},
            ]
        })

運(yùn)行:


2.還有一種情況,我們可以將props設(shè)置為對(duì)象,直接將靜態(tài)數(shù)據(jù)傳遞給組件進(jìn)行使用。 但是這樣id的值就訪問(wèn)不到了。
var User = { 
    props:["username","pwd"],
    template:"<div>用戶:{{username}}---{{pwd}}</div>"
    }

var myRouter = new VueRouter({
    //routes是路由規(guī)則數(shù)組
    routes: [
        //通過(guò) /:參數(shù)名  的形式傳遞參數(shù) 
        //如果props設(shè)置為對(duì)象,則傳遞的是對(duì)象中的數(shù)據(jù)給組件
        { path: "/user/:id", component: User, props:{username:"jack",pwd:123} },

    ]
})

可以訪問(wèn)到props的數(shù)據(jù),但是path中的id訪問(wèn)不到。

3.如果既想要獲取路由傳遞的參數(shù)值,又想獲取傳遞的對(duì)象數(shù)據(jù),那么props應(yīng)該設(shè)置為函數(shù)形式。
var User = { 
            props: ['id','username','password'],  //使用props接收id參數(shù)
            template:"<div>User is--{{username}}---{{password}}---{{ id }}</div>" 
        } 
 //路由實(shí)例
        var myRouter = new VueRouter({
            routes:[
                //如果props設(shè)置為函數(shù),則通過(guò)函數(shù)的第一個(gè)參數(shù)獲取路由對(duì)象
                //并可以通過(guò)路由對(duì)象的params屬性獲取傳遞的參數(shù)
                {path:"/user/:id",component:User,props:function(route){
                    return {    username:'lizhao',
                                password:'123456',
                                id:route.params.id
                            }
                    }
                },
            ]
        })

運(yùn)行:


最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

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