zoukankan      html  css  js  c++  java
  • 03-vue-router

    前端路由的实现原理

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <!--
        SPA : Single Page Application
    
        前端路由
            1.锚点值 监视
            2.ajax获取动态的数据
            3.核心点是锚点值的改变
    
        前端中 vue|react|angular 都很适合做单页面应用
     -->
    
    <a href="#/login">登录页面</a>
    <a href="#/register">注册页面</a>
    <div id="app">
    
    
    </div>
    
    <script type="text/javascript">
    
        // onhashchange 事件  url上的锚点数据(#/xxx改变)
        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:
                    // statements_def
                    break;
            }
        }
    </script>
    
    </body>
    </html>
    View Code

    vue+vue-router 主要来做单页面应用(Single Page Application)

    为什么我们要做单页面应用?

    (1)传统的开发方式 url改变后,立马发送请求,响应整个页面,有可能资源过多,传统开发会让前端的页面出现 “白屏” 用户体验不好

    (2)SPA 单页面应用 : 锚点值的改变后,不会立刻发送请求,而是在某个合适的时机,发送ajax请求,局部改变页面中的数据

    页面不立刻跳转用户体验好



    vue-router集成

    它是vue中核心插件
    1. 下载vue-router

      npm init --yes
      npm install vue-router --save
      • 引入vue-router的模块 默认会抛出一个VueRouter对象 另外还有两个全局的组件router-link 和router-view

    2. Vue.use(VueRouter)

    3. 创建路由对象

    var router = new VueRouter({

    // 配置路由对象

    routes:[
    {
    path:'/login',
    name:'login',
    component:Login
    },
    {
    path:'/register',
    name:'register',
    component:Register
    }
    ]

    });

    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

     
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <div id="app"></div>
    <script type="text/javascript" src="vue.js"></script>
    <!-- 1.引入 vue-router的对象 -->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <!-- 全局的VueRouter对象   vue-router 还给咱们提供了两个全局的组件 router-link  router-view-->
    <script type="text/javascript">
    
    
        // 2.让Vue使用该VueRouter创建
        Vue.use(VueRouter);
    
    
        var Login = {
            template: `
                    <div>登录页面</div>
                `
        };
        var Register = {
            template: `
                    <div>注册页面</div>
                `
        };
    
        // 3.创建一个路由对象
        var router = new VueRouter({
            // 配置路由对象
    
            routes: [
                {
                    path: '/login',
                    component: Login
                },
                {
                    path: '/register',
                    component: Register
                }
            ]
    
        });
        var App = {
    
            <!--router-link默认会被渲染成a标签 to属性默认会被渲染成href属性-->
            template: `
                <div>
                    <router-link to="/login">登录页面</router-link>
                    <router-link to="/register">注册页面</router-link>
                    <router-view></router-view>
                </div>
                `, <!--路由组件的出口-->
    
        };
    
        new Vue({
            el: '#app',
            components: {
                App
            },
            router,      //使用路由,不然会报错
            template: `<App />`
    
        });
    
    
    </script>
    
    </body>
    </html>
    02-router 使用
     
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <div id="app"></div>
    <script type="text/javascript" src="vue.js"></script>
    <!-- 1.引入 vue-router的对象 -->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <!-- 全局的VueRouter对象   vue-router 还给咱们提供了两个全局的组件 router-link  router-view-->
    <script type="text/javascript">
    
        // 2.让Vue使用该VueRouter创建
        Vue.use(VueRouter);
    
        var Login = {
            template: `
                    <div>登录页面</div>`
        };
        var Register = {
            template: `
                    <div>注册页面</div>`
        };
        // 3.创建一个路由对象
        var router = new VueRouter({
            // 配置路由对象
            routes: [
                {
                    path: '/login',
                    name: 'login',
                    component: Login
                },
                {
                    path: '/register',
                    name: 'register',
                    component: Register
                }
            ]
    
        });
        var App = {
            // 绑定路由
            template: `
                <div>
                    <router-link :to="{name:'login'}">登录页面</router-link>
                    <router-link :to="{name:'register'}">注册页面</router-link>
                    <router-view></router-view>
                </div>`
            //路由组件的出口
        };
        new Vue({
            el: '#app',
            components: {
                App
            },
            router,
            template: `<App />`
        });
    </script>
    </body>
    </html>
    03-命名路由
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <div id="app"></div>
    <script type="text/javascript" src="vue.js"></script>
    <!-- 1.引入 vue-router的对象 -->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <!-- 全局的VueRouter对象   vue-router 还给咱们提供了两个全局的组件 router-link  router-view-->
    <script type="text/javascript">
    
        // 路由范式
        // (1)xxxx.html#/user/1         params
        // (2)xxxx.html#/user?userId = 2    query
        // 2.让Vue使用该VueRouter创建
        Vue.use(VueRouter);
        var UserParams = {
            template: `
                    <div>我是用户1</div>
                `,
            created() {
                console.log(this.$route.params.userId);
                // 发送ajax请求
                console.log(this.$router);
            }
        };
        var UserQuery = {
            template: `
                    <div>我是用户2</div>
                `,
            created() {
                console.log(this.$route);
                // 发送ajax请求
                console.log(this.$router);  // 总的 router 对象
                console.log('route',this.$route)   // 单个的route 对象 
    
    
            }
        };
    
        // 3.创建一个路由对象
        var router = new VueRouter({
            // 配置路由对象
            routes: [
                {   // 动态的路由参数 以冒号开头
                    path: '/user/:userId',
                    name: 'userp',
                    component: UserParams
                },
                {
                    path: '/user',
                    name: 'userq',
                    component: UserQuery
                }
            ]
        });
        var App = {
            <!--router-link默认会被渲染成a标签 to属性默认会被渲染成href属性-->
            template: `
                <div>
                <router-link :to="{name:'userp',params:{userId:1}}">用户1</router-link>
                <router-link :to="{name:'userq',query:{userId:2}}">用户2</router-link>
                <router-view></router-view>
                </div>
                `,
            <!--路由组件的出口-->
        };
    
        new Vue({
            el: '#app',
            components: {
                App
            },
            router,
            template:
                `<App />`
        });
    </script>
    </body>
    </html>
    04-路由参数


    4.路由对象挂载到vue实例化对象中

    var App = {
    template:`
    <div>
    <!--router-link默认会被渲染成a标签 to属性默认会被渲染成href属性-->
    <router-link :to="{name:'login'}">登录页面</router-link>
    <router-link :to="{name:'register'}">注册页面</router-link>

    <!--路由组件的出口-->

    <router-view></router-view>

    </div>
    `
    };

    new Vue({
    el:'#app',
    components:{
    App
    },
    //挂载
    router,
    template:`<App />`
    });

    命名路由

    给当前的配置路由信息对象设置name:'login'属性

    :to = "{name:'login'}"

    路由范式

    (1)xxxx.html#/user/1 配置路由对象中

             {
      path:'/user/:id',
      component:User
      }

      <router-link :to = "{name:'user',params:{id:1}}"></router-link>

    (2)xxxx.html#/user?userId = 1

    { path:'/user' } <router-link :to = "{name:'user',query:{id:1}}"></router-link>

    在组件内部通过this.$route 获取路由信息对象

    嵌套路由

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

    动态路由匹配

    let User = {
     template: '<div>User</div>'
    }

    let router = new VueRouter({
     routes: [
       // 动态路径参数 以冒号开头
      { path: '/user/:id', component: User }
    ]
    })

    现在呢,像 /user/foo/user/bar 都将映射到相同的路由。

    一个“路径参数”使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到 this.$route.params,可以在每个组件内使用。于是,我们可以更新 User 的模板,输出当前用户的 ID:

    let User = {
    template: '<div>User {{ $route.params.id }}</div>'
    }
  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/wenyule/p/10122747.html
Copyright © 2011-2022 走看看