Vue入門(8)路由

1.原生js模擬路由實現原理

<a href="#/login">登錄</a>
<a href="#/register">註冊</a>
<div id="app"></div>
<script>
    var oDiv = document.getElementById(("app"))
	window.onhashchange = function(){
        console.log(location.hash);
        switch (location.hash) {
            case "#/login":
                oDiv.innerHTML = "<h2>我是登錄頁面</h2>"
                break;
            case "#/register":
                oDiv.innerHTML = "<h2>我是註冊頁面</h2>"
                break;    
            default:
                break;
        }
    }
</script>

2.安裝Vue Router

npm install vue-router -S

3.引入Vue Router

<script src="node_modules/vue-router/dist/vue-router.js"></script>

4.使用Vue Router

如果在一個模塊化工程中使用它,必須要通過 Vue.use() 明確地安裝路由功能:

Vue.use(VueRouter)

<div id="app"></div>
<script>
    var Login = {
        template:`
            <div>我是登錄頁面</div>
        `,
    }

    var Register = {
        template:`
            <div>我是註冊頁面</div>
        `,
    }
    //配置路由對象
    var router = new VueRouter({
        routes : [
            {
                path : "/login",
                component : Login
            },
            {
                path : "/register",
                component : Register
            }
        ]
    })
    //引入vue-router模塊,就有了兩個全局組件,router-link 和 router-view
    //router-link會被渲染成a標籤,to渲染成href
    //router-view是路由匹配組件的出口
    var App = {
        template:`
            <div>
                <router-link to="/login">登錄</router-link>
                <router-link to="/register">註冊</router-link>
                <router-view></router-view>
            </div>
        `,
    }

    new Vue({
        el : "#app",
        data(){
            return {

            }
        },
        template:`
            <App/>
        `,
        router,
        components : {
            App
        }
    })

</script>

5.命名路由

//配置路由對象
var router = new VueRouter({
    routes : [
        {
            path : "/login",
            name : "login",
            component : Login
        },
        {
            path : "/register",
            name : "register",
            component : Register
        }
    ]
})

<router-link :to="{name:'login'}">登錄</router-link>
<router-link :to="{name:'register'}">註冊</router-link>

6.路由參數

動態路由參數

注意看URL變化
點擊用戶1時候:http://localhost:8000/8-1.路由參數.html#/user/1
點擊用戶2時候:http://localhost:8000/8-1.路由參數.html#/user?userId=2

<script>
    var UserP = {
        template:`
            <div>我是用戶111</div>
        `,
        created(){
            //拋出來倆個對象掛在到了vue實例對象中$route和$router
            console.log(this.$route.params.id);//1
        }
    }

    var UserQ = {
        template:`
            <div>我是用戶222</div>
        `,
        created(){
            console.log(this.$route.query.userId);//2
        }
    }
    //配置路由對象
    var router = new VueRouter({
        routes : [
            {   //動態路由參數,以冒號開頭
                path : "/user/:id",
                name : "user1",
                component : UserP
            },
            {   
                path : "/user",
                name : "user2",
                component : UserQ
            }
        ]
    })
    //引入vue-router模塊,就有了兩個全局組件,router-link 和 router-view
    //router-view是路由匹配組件的出口
    var App = {
        template:`
            <div>
                <router-link :to="{name:'user1',params:{id:1}}">用戶1</router-link>
                <router-link :to="{name:'user2',query:{userId:2}}">用戶2</router-link>
                <router-view></router-view>
            </div>
        `,
    }
</script>

7.路由嵌套

<script>
    var Home = {
        template:`
            <div>
                我是首頁
                </br>
                <router-link to="/home/song">歌曲</router-link>
                <router-link to="/home/movie">電影</router-link>
                <router-view></router-view>
            </div>
        `
    }

    var Song = {
        template:`
            <div>
                我是歌曲頁
            </div>
        `
    }

    var Movie = {
        template:`
            <div>
                我是電影頁
            </div>
        `
    }
    //配置路由對象
    var router = new VueRouter({
        routes : [
            {   //動態路由參數,以冒號開頭
                path : "/home",
                name : "home",
                component : Home,
                children : [
                    {   
                        path : "song",
                        component : Song,
                    },
                    {   
                        path : "movie",
                        component : Movie,
                    }
                ]
            }
        ]
    })

    var App = {
        template:`
            <div>
                <router-link :to="{name:'home'}">首頁</router-link>
                <router-view></router-view>
            </div>
        `,
    }
</script>

8.動態路由匹配

<script>
    
    var Timeline = {
        template:`
            <div id=""timeline>
                 <router-link :to="{name:'comDesc',params:{id:'frontend'}}">前端</router-link>
                 <router-link :to="{name:'comDesc',params:{id:'backend'}}">後端</router-link>
                 <router-view></router-view>
            </div>
        `,
    }

    var Pins = {
        template:`
            <div>我是沸點</div>
        `
    }

    //提醒一下,當使用路由參數時,例如從 /user/foo 導航到 /user/bar,
    //原來的組件實例會被複用。因爲兩個路由都渲染同個組件,比起銷燬再創建,複用則顯得更加高效。
    //不過,這也意味着組件的生命週期鉤子不會再被調用。

    //複用組件時,想對路由參數的變化作出響應的話,你可以簡單地 watch (監測變化) $route 對象:

    var ComDesc = {
        data(){
            return {
               msg : ""
            }
        },
        template:`
            <div>我是{{msg}}</div>
        `,
        created(){
            console.log(111);
            this.msg = "前端"
        },
        watch: {
            '$route' (to, from){
                // 對路由變化作出響應...
                // 發送ajax請求
                console.log(to);
                console.log(from);
                if(to.params.id == "frontend"){
                    this.msg = "前端"
                }else if(to.params.id == "backend"){
                    this.msg = "後端"
                }
            }
        }
    }
    //配置路由對象
    var router = new VueRouter({
        mode : "history",	//把url中的#去掉
        routes : [
            {   //動態路由參數,以冒號開頭
                path : "/timeline",
                component : Timeline,
                children : [
                    {
                        name : "comDesc",
                        path : "/timeline/:id",
                        component : ComDesc
                    }
                ]
            },
            {   
                path : "/pins",
                component : Pins
            }
        ]
    })

    var App = {
        template:`
            <div>
                <router-link to="/timeline">首頁</router-link>
                <router-link to="/pins">沸點</router-link>
                <router-view></router-view>
            </div>
        `,
    }

    new Vue({
        el : "#app",
        data(){
            return {

            }
        },
        template:`
            <App/>
        `, 
        router,
        components : {
            App
        }
    })

</script>

9.路由重定向

重定向也是通過 routes 配置來完成,下面例子是從 /a 重定向到 /b:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }
  ]
})

10.keep-alive在路由中的使用

使用keep-alive內置組件可以在組件切換的過程中把組件的狀態保存起來,不會反覆的創建銷燬組件

下面例子中,點擊我是沸點會讓字體變紅,如果不使用keep-alive的話組件切到首頁再切回沸點的時候,之前的字體變紅狀態就會消失。

    
var Timeline = {
    template:`
        <div id=""timeline>
             我是首頁
        </div>
    `,
    created(){
        console.log("首頁組件創建了");
    },
    mounted(){
        console.log("首頁組件dom加載了"); 
    },
    destroyed(){
        console.log("首頁組件銷燬了");
    }
}

var Pins = {
    template:`
        <div>
            <h3 @click="handler">我是沸點</h3>
        </div>
    `,
    methods : {
        handler(e){
            e.target.style.color = "red"
        }
    },
    created(){
        console.log("沸點組件創建了");
    },
    mounted(){
        console.log("沸點組件dom加載了"); 
    },
    destroyed(){
        console.log("沸點組件銷燬了");
    }
}
//配置路由對象
var router = new VueRouter({
    routes : [
        {   //動態路由參數,以冒號開頭
            path : "/timeline",
            component : Timeline
        },
        {   
            path : "/pins",
            component : Pins
        }
    ]
})
var App = {
    template:`
        <div>
            <router-link to="/timeline">首頁</router-link>
            <router-link to="/pins">沸點</router-link>
            <keep-alive>
                <router-view></router-view>
            </keep-alive>
        </div>
    `,
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章