• 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>'
            }![](https://img2018.cnblogs.com/blog/1449832/201905/1449832-20190512211311339-2130357793.png)
            //创建一个路由对象
            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>
    

    在这里插入图片描述

  • 相关阅读:
    react + iscroll5 实现完美 下拉刷新,上拉加载
    Masuit.Tools:C#硬核开源工具库!
    react 下拉刷新上拉加载更多通用组件
    前端必备基础知识:window.location 详解
    浅谈流媒体
    ThinkPad P15v:专业移动工作站,表现如何?
    react 上拉加载组件的使用
    说一说前端路由与后端路由的区别
    主流开源流媒体服务器有哪些?(转)
    15个有用的React动画库,马上让你的项目变得高大上
  • 原文地址:https://www.cnblogs.com/yangk1996/p/12656567.html
Copyright © 2020-2023  润新知