vue路由(2)、编程式导航&嵌套路由&动态路由&keep-alive

编程式导航

在 Vue 实例内部,你可以通过 $router 访问路由实例,可以调用 this.$router.push方法注入参数。

想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。

当你点击 <router-link> 时,这个方法会在内部调用,所以说,点击 <router-link :to="..."> 等同于调用 router.push(...)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>vue测试</title>
    <script src="vue.js"></script>

    <!--1、引入全局的VueRouter对象-->
    <script src="vue-router.js"></script>
</head>
<body>
<div id="app">
</div>
</body>

<script>
    // 2、让Vue使用该VueRouter对象,
    // VueRouter还提供了两个全局的组件router-link和router-view
    Vue.use(VueRouter);

    // 3、定义局部组件
    var UserP={
        template:'<div><h1>我是用户1</h1></div>',
        created(){
            // 参数(query、params)都存储在组件的$route参数对象中
            console.log(this.$route.params.userId)
        }
    };

    var UserQ={
        template:'<div><h1>我是用户2</h1></div>'
    };

    var my_router=new VueRouter({
        routes:[
            {
                // 动态路由参数,以冒号开头
                path:'/user/:userId', // 会加载 params中的参数
                component:UserP,
                name:'user_p',
            },
            {
                path:'/user', // 会加载query参数,例如?userId=2
                component:UserQ,
                name:'user_q',
            },
        ]
    });

    var App={
         template:'' +
            ' <div>' +
         '      <button @click="paramsHandler">用户1</button>' +
         '      <button @click="queryHandler">用户2</button>' +
             '  <router-view></router-view>' +
             '</div>',
        methods:{
            paramsHandler(){
                this.$router.push({name:'user_p',params:{userId:123}})
            },
            queryHandler(){
                this.$router.push({name:'user_q',query:{userId:321}})
            },
        }
    };

    new Vue({
        el:'#app',
        data:{
        },
        components:{
            App
        },
        template:'<App/>',
        router:my_router,
    })

</script>
</html>

嵌套路由

一个router-view嵌套另外一个router-view。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>vue测试</title>
    <script src="vue.js"></script>
    <!--1、引入全局的VueRouter对象-->
    <script src="vue-router.js"></script>
</head>
<body>
<div id="app">
</div>


</body>

<script>
    // 嵌套路由:进入首页后,点击 音乐/home/music、电影/home/movie
    Vue.use(VueRouter);

    var Music={
        template:'<div><h2>我是音乐</h2></div>'
    };

    var Movie={
        template:'<div><h2>我是电影</h2></div>'
    };

    var Home={
        template:'' +
        '<div>' +
        '   <h1>我是主页面</h1>' +
        '   <router-link to="/home/music">音乐</router-link>' +
        '   <router-link to="/home/movie">电影</router-link>' +
        '   <router-view></router-view>' + // 渲染子组件视图
        '</div>',
    };


    var my_router=new VueRouter({
        routes:[
            {
                path:'/home',
                component:Home,
                name:'home',
                //
                children:[
                    // 子路由:动态路由匹配,表示你的子组件中的结构是不同的
                    {
                        path:'music',
                        component:Music,
                    },
                    {
                        path:'movie',
                        component:Movie,
                    }

                ]
            },
        ]
    });

    var App={
         template:'' +
            ' <div>' +
         '      <router-link :to="{name:\'home\'}">首页</router-link>' +
             '  <router-view></router-view>' +
             '</div>',
    };

    new Vue({
        el:'#app',
        data:{
        },
        components:{
            App
        },
        template:'<App/>',
        router:my_router,
    })

</script>
</html>

动态路由

1、以命名方式绑定url并通过params/query传递参数;

2、在与url绑定的子组件中可以通过{{$route.params.arg}}取出参数。

# 简单示例
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>vue测试</title>
    <script src="vue.js"></script>
    <!--1、引入全局的VueRouter对象-->
    <script src="vue-router.js"></script>
</head>
<body>
<div id="app">
</div>


</body>

<script>
    // 嵌套路由:进入首页后,点击 音乐/home/music、电影/home/movie
    Vue.use(VueRouter);

    var Home={
        template:'' +
        '<div>' +
        '   <h1>我是主页面</h1>' +
        '   <p>ID:{{$route.params.id}}</p>' +
        '</div>',
    };

    var my_router=new VueRouter({
        routes:[
            {
                path:'/home/:id',
                component:Home,
                name:'home'
            },
        ]
    });

    var App={
         template:'' +
            ' <div>' +
             // url传递参数,在子组件Home中可以通过{{$route.params.id}}取出参数
            '   <router-link :to="{name:\'home\',params:{id:\'123\'}}">首页</router-link>' +
            '   <router-view></router-view>' +
             '</div>',
    };

    new Vue({
        el:'#app',
        data:{
        },
        components:{
            App
        },
        template:'<App/>',
        router:my_router,
    })

</script>
</html>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>vue测试</title>
    <script src="vue.js"></script>
    <!--1、引入全局的VueRouter对象-->
    <script src="vue-router.js"></script>
</head>
<body>
<div id="app">
</div>


</body>

<script>
    Vue.use(VueRouter);

    var Common={
        template:'<div class="content">{{ $route.params.id }}页面</div>',
        // created(){
        //     console.log(this.$route)
        // }
    };

    var Home={
        template:'' +
        '<div>' +
        '   <h1>我是主页面</h1>' +
            // 利用动态路由,向同一个组件传递不同的参数
        '   <router-link :to="{name:\'sub_title\', params:{id:\'android\'}}">安卓</router-link>' +
        '   <router-link :to="{name:\'sub_title\', params:{id:\'web\'}}">web前端</router-link>' +
        '   <router-view></router-view>' +
        '</div>',
    };

    var my_router=new VueRouter({
        routes:[
            {
                path:'/home',
                component:Home,
                children:[
                    {
                        path:'/home/:id',
                        component:Common,
                        name:'sub_title',
                    }

                ]
            },
        ]
    });

    var App={
         template:'' +
            ' <div>' +
             // url传递参数,在子组件Home中可以通过{{$route.params.id}}取出参数
            '   <router-link to="/home"">首页</router-link>' +
            '   <router-view></router-view>' +
             '</div>',
    };

    new Vue({
        el:'#app',
        data:{
        },
        components:{
            App
        },
        template:'<App/>',
        router:my_router,
    })

</script>
</html>

keep-alive缓存组件

<keep-alive>包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>vue测试</title>
    <script src="vue.js"></script>
    <!--1、引入全局的VueRouter对象-->
    <script src="vue-router.js"></script>
</head>
<body>
<div id="app">
</div>
</body>

<script>
    Vue.use(VueRouter);

    var Pins={
        template:'' +
        '   <div>' +
        '       <h1 @click="change_handle">我是沸点页面</h1>' +
        '   </div>',
        methods:{
            change_handle:function(e){
                e.target.style.color='red'
            },
        },
        created(){
            console.log('Pins 创建')
        },
        mounted(){
            console.log('Pins 加载到dom')
        },
        beforeDestroy(){
           console.log('Pins 被销毁')
        }
    };

    var Home={
        template:'' +
        '<div>' +
        '   <h1>我是主页面</h1>' +
        '</div>',
        created(){
            console.log('Home 创建')
        },
        mounted(){
            console.log('Home 加载到dom')
        },
        beforeDestroy(){
           console.log('Home 被销毁')
        }
    };

    var my_router=new VueRouter({
        routes:[
            {
                path:'/home',
                component:Home,
            },
            {
                path:'/pins',
                component:Pins,
            }
        ]
    });

    var App={
         template:'' +
            ' <div>' +
            '   <router-link to="/home"">首页</router-link>' +
            '   <router-link to="/pins"">沸点</router-link>' +
                // 包裹动态组件router-view,其内部的组件实例会缓存起来,不会被销毁
                 '<keep-alive>' +
                    '<router-view></router-view>' +
                 '</keep-alive>' +
             '</div>',
    };

    new Vue({
        el:'#app',
        data:{
        },
        components:{
            App
        },
        template:'<App/>',
        router:my_router,
    })

</script>
</html>

猜你喜欢

转载自www.cnblogs.com/fqh202/p/9649408.html