Vue学习:路由

一、什么是路由

  • 后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源
  • 前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现
  • 在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由)

二、路由的入门

<style>
    /* 路由按钮高亮 第一种  不需要注册linkActiveClass*/
    /* .router-link-active {
        color: red;
        font-weight: 800;
        font-style: italic;
        font-size: 80px;
        text-decoration: underline;
        background-color: green;
    } */
    /* 第二种 */
    .myactive {
        color: red;
        font-weight: 800;
        font-style: italic;
        font-size: 80px;
        text-decoration: underline;
        background-color: green;
    }
    .v-enter,
    .v-leave-to {
        opacity: 0;
        transform: translateX(140px);
    }
    .v-enter-active,
    .v-leave-active {
        transition: all 0.5s ease;
    }
</style>
<body>
    <!-- vue里面的路由基于hash的,不能用斜线(相当于调转到一个真实的页面) 前面需要加上# -->
    <!-- <a href="#/login">登录</a>
    <a href="#/register">注册</a> -->
    <div id="app">
        <!-- router-link 默认渲染为一个a 标签  tag="span"渲染成一个span标签,但是永远还是会绑定一个点击事件-->
        <router-link to="/login" tag="span">登录</router-link>
        <router-link to="/register">注册</router-link>
        <!-- vue提供的过度模式mode="out-in" -->
        <transition mode="out-in">
             <!-- 这是 vue-router提供的元素,专门用来当作占位符的,将来路由规则匹配到的组件,就会展示到这个router-view中去 -->
            <router-view></router-view>
        </transition>
    </div>
    <script>
        //创建组件
        var login = {
            template: '<h3>这是登陆的组件</h3>'
        }
        var register = {
            template: '<h3>注册组件</h3>'
        }
        //创建一个路由对象
        var routerObj = new VueRouter({
            //路由匹配规则 
            // 每个路由规则,都是一个对象,这个规则对象,身上,有两个必须的属性:
            //  属性1 是 path, 表示监听 哪个路由链接地址;
            //  属性2 是 component, 表示如果路由是前面匹配到的path,则展示component属性对应的那个组件。component 的属性值必须是一个组件的模板对象,不能是组件的引用名称;
            routes: [
                //默认初始加载某个组件   转发
                { path: '/', redirect: '/login' },
                { path: '/login', component: login },
                { path: '/register', component: register }
            ],
            // 高亮路由
            linkActiveClass: 'myactive'
        });
        var vm = new Vue({
            el: '#app',
            // 将路由规则对象,注册到 vm 实例上,用来监听 URL 地址的变化,然后展示对应的组件
            router: routerObj
        })
    </script>
</body>

    

三、路由传参

<body>
    <div id="app">
        <!-- 如果在路由中,通过地址栏给路由传递参数,则不需要修改路由规则的path属性 -->
        <router-link to="/login?id=10&name=张三">登陆</router-link>
        <router-link to="/register">注册</router-link>
        <router-view></router-view>
    </div>
    <script>
        var login = {
            template: '<h1>登录---{{$route.query.id}} ---{{$route.query.name}}</h1>',
            //data和methods已经初始化成功
            created() {
                //获取路由的参数
                console.log(this.$route)
                console.log("我是组件路由上面的参数:" + this.$route.query.id);
            }
        }
        var register = {
            template: '<h1>注册</h1>'
        }
        var router = new VueRouter({
            routes: [
                { path: '/login', component: login },
                { path: '/register', component: register }
            ]
        })
        var vm = new Vue({
            el: '#app',
            // router: router     //属性名和属性值一样可以简化
            router
        })
    </script>
</body>

 可以将地址栏传参修改一下

<router-link to="/login/10/张三">登陆</router-link>

        var login = {
            template: '<h1>登录--{{$route.params.id}}---{{$route.params.name}}</h1>',
            created() {
                console.log(this.$route);
                console.log("我是通过正则表达式匹配到的值:" + this.$route.params.id);
            }
        }

  { path: '/login/:id/:name', component: login },

四、路由的嵌套

<body>
    <div id="app">
        <router-link to="/test">路由嵌套</router-link>
        <router-view></router-view>
    </div>
    <template id="test">
        <div>
            <h1>下面开始嵌套路由</h1>
            <router-link to="/test/login">登录</router-link>
            <router-link to="/test/register">注册</router-link>

            <router-view></router-view>
        </div>
    </template>
    <script>
        var test = {
            template: '#test'
        }
        var login = {
            template: '<h3>登录</h3>'
        }
        var register = {
            template: '<h3>注册</h3>'
        }
        var router = new VueRouter({
            routes: [
                {
                    path: '/test',
                    component: test,
                    // 使用children属性,实现子路由同时,子路由的path前面不要带/ ,会自动加上面的路由地址
                    children: [
                        { path: 'login', component: login },
                        { path: 'register', component: register }
                    ]
                }
            ]
        })
        var vm = new Vue({
            el: '#app',
            router
        })
    </script>
</body>

   

五、使用命名视图

<style>
    html,
    body {
        margin: 0;
        padding: 0;
    }
    .header {
        background-color: orange;
        height: 80px;
    }
    h1 {
        margin: 0;
        padding: 0;
        font-size: 16px;
    }
    .container {
        display: flex;
        height: 600px;
    }
    .left {
        background-color: lightgreen;
        flex: 2;
    }
    .main {
        background-color: lightpink;
        flex: 8;
    }
</style>
<body>
    <div id="app">
            <router-view></router-view>
            <div class="container">
              <router-view name="left"></router-view>
              <router-view name="main"></router-view>
            </div>
    </div>
    <script>
        var header = {
            template: '<h1 class="header">Header头部区域</h1>'
        }
        var leftBox = {
            template: '<h1 class="left">Left侧边栏区域</h1>'
        }
        var mainBox = {
            template: '<h1 class="main">mainBox主体区域</h1>'
        }
        var router = new VueRouter({
            routes: [
                // { path: "/", component: header },
                // { path: "/left", component: leftBox },
                // { path: "/main", component: mainBox }
                {
          path: '/', components: {
            'default': header,
            'left': leftBox,
            'main': mainBox
          }
        }
            ]
        })
        var vm = new Vue({
            el: '#app',
            router
        })
    </script>
</body>

猜你喜欢

转载自www.cnblogs.com/yangk1996/p/10845037.html