• Vue之VueRouter


    Vue之VueRouter实现原理

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
    
    </div>
    <script>
        let oDiv = document.getElementById('app');
    
        window.onhashchange = function () { # onhashchange事件,只需要修改hash值即可响应onhashchange事件中的函数(适用于上一题下一题和跳转页面等功能)
            switch (location.hash) {
                case '#/login':
                    oDiv.innerHTML = `<h1>这是登录页面</h1>`;
                    break;
                case '#/register':
                    oDiv.innerHTML = `<h1>这是注册页面</h1>`;
                    break;
                default:
                    oDiv.innerHTML = `<h1>这是首页</h1>`;
                    break;
            }
        }
    </script>
    </body>
    </html>
    

    Vue之VueRouter安装使用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <script src="static/vue.min.js"></script>
        <script src="static/vue-router.js"></script>
    </head>
    <body>
        <div id="app">
    
        </div>
    <script>
        // 1.在Vue根实例中使用,VueRouter
        Vue.use(VueRouter);
    
        let Home = {
            template: `
                <div>
                    <h1>这是主页页面</h1>
                </div>
            `,
        };
    
        let Login = {
            template: `
                <div>
                    <h1>这是登录页面</h1>
                </div>
            `,
        };
    
        let Register = {
            template: `
                <div>
                    <h1>这是注册页面</h1>
            </div>
            `,
        };
    
        let App = {
            // 4.第四步,router-link会渲染成a标签,to会变成href属性,to后面是router中定义的路径
            // 5.第五步,router-view是页面内容的渲染出口
            template: `
                <div>
                    <router-link to="/">首页</router-link>
                    <router-link to="/login">登录</router-link>
                    <router-link to="/register">注册</router-link>
    
                    <router-view></router-view>
                </div>
            `,
        };
    
        // 2.第二步实例化一个VueRouter对象
        // 本质上是将路径和页面内容绑定了对应关系
        let router = new VueRouter({
            routes: [
                {
                    path: '/',
                    // 注册Home
                    component: Home,
                },
                {
                    path: '/login',
                    component: Login,
                },
                {
                    path: '/register',
                    component: Register,
                },
            ],
        });
    
        new Vue({
            el: '#app',
            template: `<App/>`,
            // 3.第三步,在根实例中注册router对象
            router: router,
            components: {
                App,
            }
        });
    </script>
    </body>
    </html>
    

    Vue之VueRouter命名路由

    let App = {
            // 第四步,router-link会渲染成a标签,to会变成href属性,to后面是router中定义的路径
            // 第五步,router-link是页面内容的渲染出口
            template: `
                // 注意这里需要绑定
                <div>
                    <router-link :to="{ name: 'home' }">首页</router-link>
                    <router-link :to="{ name: 'login' }">登录</router-link>
                    <router-link :to="{ name: 'register' }">注册</router-link>
    
                    <router-view></router-view>
                </div>
            `,
        };
    
    let router = new VueRouter({
            routes: [
                {
                    name: 'home',  // 新增的
                    path: '/',
                    component: Home,
                },
                {
                    name: 'login',
                    path: '/login',
                    component: Login,
                },
                {
                    name: 'register',
                    path: '/register',
                    component: Register,
                },
            ]
        });
    
    // 其他的和上一个安装使用一样
    

    Vue之VueRouter路由参数

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <script src="static/vue.min.js"></script>
        <script src="static/vue-router.js"></script>
    </head>
    <body>
    <div id="app">
    
    </div>
    <script>
        // 在真实的场景中,可有以下路径形式
        // user/1;
        // user/userId: 1;
        // 1.在Vue根实例中使用,VueRouter
        Vue.use(VueRouter);
    
        let Home = {
            template: `
                <div>
                    <h1>这是主页页面</h1>
                </div>
               `,
        };
    
        let userParams = {
            template: `
                <div>
                    <h1>这是用户一的信息</h1>
                </div>
               `,
        };
    
        let userQuery = {
            template: `
                <div>
                    <h1>这是用户二的信息</h1>
                </div>
            `,
        };
    
        let App = {
            // 第四步,router-link会渲染成a标签,to会变成href属性,to后面是router中定义的路径
            // 第五步,router-link是页面内容的渲染出口
            template: `
                // 注意这里需要绑定
                <div>
                    <router-link :to="{ name: 'home' }">首页</router-link>
                    <router-link :to="{ name: 'userParams', params: { userId: 1 } }">登录</router-link>
                    <router-link :to="{ name: 'userQuery', query: { userId: 2 } }">注册</router-link>
    
                    <router-view></router-view>
                </div>
            `,
        };
    
        let router = new VueRouter({
            routes: [
                {
                    name: 'home',
                    path: '/',
                    component: Home,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'userParams',
                    path: '/user/:userId',
                    component: userParams,
                },
                {
                    // xxx/?userId=1 这是路径显示
                    name: 'userQuery',
                    path: '/user',
                    component: userQuery,
                },
            ]
        });
    
        new Vue({
            el: '#app',
            // 第三步,在根实例中注册router对象,
            template: `<App/>`,
            router: router,
            components: {
                App,
            }
        })
    </script>
    </body>
    </html>
    

    Vue之VueRouter子路由

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <script src="static/vue.min.js"></script>
        <script src="static/vue-router.js"></script>
    </head>
    <body>
    <div id="app">
    
    </div>
    <script>
        // 在真实的场景中,可有以下路径形式
        // user/1;
        // user/userId: 1;
        // 1.在Vue根实例中使用,VueRouter
        Vue.use(VueRouter);
    
        let Home = {
            template: `
                <div>
                    <h1>这是主页页面</h1>
                </div>
               `,
        };
    
        let Courses = {
            template: `
                <div>
                    <h1>这是课程页面</h1>
                    <router-link to="lightcourses">轻课</router-link>
                    <router-link to="degreecourses">学位课</router-link>
    
                    <router-view></router-view>
                </div>
               `,
        };
    
        let LightCourses = {
            template: `
                <div>
                    <h1>这是轻课页面</h1>
                </div>
            `,
        };
    
        let DegreeCourses = {
            template: `
                <div>
                    <h1>这是学位课程页面</h1>
                </div>
            `,
        };
    
        let App = {
            // 第四步,router-link会渲染成a标签,to会变成href属性,to后面是router中定义的路径
            // 第五步,router-link是页面内容的渲染出口
            template: `
                // 注意这里需要绑定
                <div>
                    <router-link :to="{ name: 'home' }">首页</router-link>
                    <router-link :to="{ name: 'courses' }">课程页面</router-link>
    
                    <router-view></router-view>
                </div>
            `,
        };
    
        let router = new VueRouter({
            routes: [
                {
                    name: 'home',
                    path: '/',
                    component: Home,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'courses',
                    path: '/courses',
                    component: Courses,
                    children: [
                        {
                            path: 'lightcourses',
                            component: LightCourses,
                        },
                        {
                            path: 'degreecourses',
                            component: DegreeCourses,
                        }
                    ]
                },
            ]
        });
    
        new Vue({
            el: '#app',
            // 第三步,在根实例中注册router对象,
            template: `<App/>`,
            router: router,
            components: {
                App,
            }
        })
    </script>
    </body>
    </html>
    

    Vue之VueRouter子路由append版

     <router-link to="lightcourses" append >轻课</router-link> // 加append
    

    Vue之VueRouter子路由append升级版

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <script src="static/vue.min.js"></script>
        <script src="static/vue-router.js"></script>
    </head>
    <body>
    <div id="app">
    
    </div>
    <script>
        // 在真实的场景中,可有以下路径形式
        // user/1;
        // user/userId: 1;
        // 1.在Vue根实例中使用,VueRouter
        Vue.use(VueRouter);
    
        let Home = {
            template: `
                <div>
                    <h1>这是主页页面</h1>
                </div>
               `,
        };
    
        let Courses = {
            template: `
                <div>
                    <h1>这是课程页面</h1>
                    <router-link :to="{ name: 'lightcourses'  }">轻课</router-link>
                    <router-link :to="{ name: 'degreecourses' }">学位课</router-link>
    
                    <router-view></router-view>
                </div>
               `,
        };
    
        let LightCourses = {
            template: `
                <div>
                    <h1>这是轻课页面</h1>
                </div>
            `,
        };
    
        let DegreeCourses = {
            template: `
                <div>
                    <h1>这是学位课程页面</h1>
                </div>
            `,
        };
    
        let App = {
            // 第四步,router-link会渲染成a标签,to会变成href属性,to后面是router中定义的路径
            // 第五步,router-link是页面内容的渲染出口
            template: `
                // 注意这里需要绑定
                <div>
                    <router-link :to="{ name: 'home' }">首页</router-link>
                    <router-link :to="{ name: 'courses' }">课程页面</router-link>
    
                    <router-view></router-view>
                </div>
            `,
        };
    
        let router = new VueRouter({
            routes: [
                {
                    name: 'home',
                    path: '/',
                    component: Home,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'courses',
                    path: '/courses',
                    component: Courses,
                    children: [
                        {
                            name: 'lightcourses',
                            path: 'lightcourses',
                            component: LightCourses,
                        },
                        {
                            name: 'degreecourses',
                            path: 'degreecourses',
                            component: DegreeCourses,
                        }
                    ]
                },
            ]
        });
    
        new Vue({
            el: '#app',
            // 第三步,在根实例中注册router对象,
            template: `<App/>`,
            router: router,
            components: {
                App,
            }
        })
    </script>
    </body>
    </html>
    

    Vue之VueRouter子路由重定向

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <script src="static/vue.min.js"></script>
        <script src="static/vue-router.js"></script>
    </head>
    <body>
    <div id="app">
    
    </div>
    <script>
        // 在真实的场景中,可有以下路径形式
        // user/1;
        // user/userId: 1;
        // 1.在Vue根实例中使用,VueRouter
        Vue.use(VueRouter);
    
        let Home = {
            template: `
                <div>
                    <h1>这是主页页面</h1>
                </div>
               `,
        };
    
        let Login = {
            template: `
                <div>
                    <h1>这是登录页面</h1>
                </div>
               `,
        };
    
        let Pay = {
            template: `
                <div>
                    <h1>这是支付页面</h1>
                </div>
               `,
        };
    
    
        let App = {
            // 第四步,router-link会渲染成a标签,to会变成href属性,to后面是router中定义的路径
            // 第五步,router-link是页面内容的渲染出口
            template: `
                // 注意这里需要绑定
                <div>
                    <router-link :to="{ name: 'home' }">首页</router-link>
                    <router-link :to="{ name: 'login' }">登录</router-link>
                    <router-link :to="{ name: 'pay' }">支付</router-link>
    
                    <router-view></router-view>
                </div>
            `,
        };
    
        let router = new VueRouter({
            routes: [
                {
                    name: 'home',
                    path: '/',
                    component: Home,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'login',
                    path: '/login',
                    component: Login,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'pay',
                    path: '/pay',
                    redirect: '/login',  // 重定向点击支付还是跳转登录页面
                    component: Pay,
                },
            ]
        });
    
        new Vue({
            el: '#app',
            // 第三步,在根实例中注册router对象,
            template: `<App/>`,
            router: router,
            components: {
                App,
            }
        })
    </script>
    </body>
    </html>
    

    Vue之VueRouter子路由的钩子函数

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <script src="static/vue.min.js"></script>
        <script src="static/vue-router.js"></script>
    </head>
    <body>
    <div id="app">
    
    </div>
    <script>
        // 在真实的场景中,可有以下路径形式
        // user/1;
        // user/userId: 1;
        // 1.在Vue根实例中使用,VueRouter
        Vue.use(VueRouter);
    
        let Home = {
            template: `
                <div>
                    <h1>这是主页页面</h1>
                </div>
               `,
        };
    
        let Login = {
            template: `
                <div>
                    <h1>这是登录页面</h1>
                </div>
               `,
        };
    
        let Pay = {
            template: `
                <div>
                    <h1>这是支付页面</h1>
                </div>
               `,
        };
    
    
        let App = {
            // 第四步,router-link会渲染成a标签,to会变成href属性,to后面是router中定义的路径
            // 第五步,router-link是页面内容的渲染出口
            template: `
                // 注意这里需要绑定
                <div>
                    <router-link :to="{ name: 'home' }">首页</router-link>
                    <router-link :to="{ name: 'login' }">登录</router-link>
                    <router-link :to="{ name: 'pay' }">支付</router-link>
    
                    <router-view></router-view>
                </div>
            `,
        };
    
        let router = new VueRouter({
            routes: [
                {
                    name: 'home',
                    path: '/',
                    component: Home,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'login',
                    path: '/login',
                    component: Login,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'pay',
                    path: '/pay',
                    meta: { required_login: true },
                    component: Pay,
                },
            ]
        });
        
         // 通过router对象的beforeEach(function(to,from,next))
            router .beforeEach(function (to, from, next) {
                if (to.meta.required_login){
                    next('/login');
                }else{
                    next();
                }
            });
    
        new Vue({
            el: '#app',
            // 第三步,在根实例中注册router对象,
            template: `<App/>`,
            router: router,
            components: {
                App,
            }
        })
    </script>
    </body>
    </html>
    

    Vue之VueRouter子路由去掉井号

    let router = new VueRouter({
            mode: 'history',   // 新加的去掉井号的内容
            routes: [
                {
                    name: 'home',
                    path: '/',
                    component: Home,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'login',
                    path: '/login',
                    component: Login,
                },
                {
                    // xxx/1 这是路径显示
                    name: 'pay',
                    path: '/pay',
                    meta: { required_login: true },
                    component: Pay,
                },
            ]
        });
    

    $route和$router的区别

    $route 表示(当前路由信息对象)

    **1.$route.path**
          字符串,对应当前路由的路径,总是解析为绝对路径,如 "/foo/bar"。
    **2.$route.params**
          一个 key/value 对象,包含了 动态片段 和 全匹配片段,
          如果没有路由参数,就是一个空对象。
    **3.$route.query**
          一个 key/value 对象,表示 URL 查询参数。
          例如,对于路径 /foo?user=1,则有 $route.query.user == 1,
          如果没有查询参数,则是个空对象。
    **4.$route.hash**
          当前路由的 hash 值 (不带 #) ,如果没有 hash 值,则为空字符串。锚点
    **5.$route.fullPath**
          完成解析后的 URL,包含查询参数和 hash 的完整路径。
    **6.$route.matched**
          数组,包含当前匹配的路径中所包含的所有片段所对应的配置参数对象。
    **7.$route.name    当前路径名字**
    **8.$route.meta  路由元信息
    

    $router全局的路由实例,是router构造方法的实例

    // 字符串
          this.$router.push('home')
    // 对象
          this.$router.push({ path: 'home' })
    // 命名的路由
          this.$router.push({ name: 'user', params: { userId: 123 }})
    // 带查询参数,变成 /register?plan=123
          this.$router.push({ path: 'register', query: { plan: '123' }})
    
    
    // 页面路由跳转 前进或者后退
    this.$router.go(-1) // 后退
    
    
    //push方法会向 history 栈添加一个新的记录,而replace方法是替换当前的页面,
    不会向 history 栈添加一个新的记录
    <router-link to="/05" replace>05</router-link>
    // 一般使用replace来做404页面
    this.$router.replace('/')
    

    push方法其实和<router-link :to="...">是等同的。
    注意:push方法的跳转会向 history 栈添加一个新的记录,当我们点击浏览器的返回按钮时可以看到之前的页面。

  • 相关阅读:
    django--模型层(orm)-查询补充及cookie
    django-模型层(model)-多表相关操作(图书管理练习)
    Linux-正则表达式与三剑客
    网络配置命令优先级和元字符
    Linux-Nginx和NFS
    Linux-内存进程和软件安装
    乌龟棋
    倍增 Tarjan 求LCA
    切蛋糕
    HDU1505 City Game/玉蟾宫/全0子矩阵 悬线法
  • 原文地址:https://www.cnblogs.com/wjs521/p/9949774.html
Copyright © 2020-2023  润新知