zoukankan      html  css  js  c++  java
  • Vue--路由

    43、前端路由介绍

    44、前端路由原理

    45、vue-router的基本使用

    46、命名路由的使用

    47、小结

    48、路由参数之params和query的使用

    49、编程式导航

    50-51、嵌套路由的使用及警告处理

    52、动态路由匹配

    53、keep-alive在路由中的使用


    43、前端路由介绍

    vue+vue-router主要来做单页面应用(SinglePageApplication)

    为什么我们要做单页面应用?
    1)传统的开发方式URL改变后,立马发送请求,响应整个页面,
    有可能资源过多,传统开发会让前端页面出现“白屏”用户体验不好
    2)SPA单页面应用:锚点值的改变后,不会立刻发送请求,而是在某个合适的时机
    发送ajax请求,局部改变页面中的数据,页面不立刻跳转。用户体验好

    44、前端路由原理

    SPA:SinglePageApplication

    1)锚点值 监视
    2)ajax获取动态的数据
    3)核心点是锚点值的改变
    前端中vue/react/angular都很适合做单页面应用

    <body>
    <a href="#/login">登录页面</a>
    <a href="#/register">注册页面</a>
    <div id="app">
    
    </div>
    <script type="text/javascript">
        window.onhashchange = function () {
            oDiv = document.getElementById('app');
            //onhashchange事件监听URL上锚点数据(#/xxx的改变)
            console.log(location.hash);
            //根据不同的锚点值,对页面不同的切换
            switch (location.hash) {
                case '#/login':
                    oDiv.innerHTML='<h2>登录页面</h2>';
                    break;
                case '#/register':
                    oDiv.innerHTML='<h2>注册页面</h2>';
                    break;
                default:
                    break;
            }
        }
    </script>
    </body>

    45、vue-router的基本使用

    下载vue-router:

    npm init --yes

    npm install vue-router --save

     router-link标签上不能用类似“@click”语句绑定事件,要这样绑定事件必须用a标签或者button按钮

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title> 
        </head>
        <body>
            <div id="app">
                <router-link to="/login">登录</router-link>
                <router-link to="/register">注册</router-link>
                <router-view></router-view>
            </div>
        </body>
        <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
        <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
        <script type="text/javascript">
            // 0.如果使用模块化机制编程,导入Vue和VueRouter,要调用 Vue.use(VueRouter)
            // 1. 定义模块
            const Login = {template:`<h1>登录页面</h1>`};
            const Register = {template:`<h1>注册页面</h1>`};
            // 2. 定义路由
            const routes = [{path:"/login", component:Login},{path:"/register", component:Register}];
            // 3. 实例化VueRouter
            let router = new VueRouter({
                routes:routes
            });
            // 4.在Vue中使用
            new Vue({
                router:router
            }).$mount("#app");
        </script>
    </html>
    vue-router简单示例

    被选中的<router-link>标签有router-link-active样式,如果自己定义了一个a标签的样式,例如:a.is-active{ color: red} ,怎样让a标签的is-active应用到router-link标签上呢???

    实例化VueRouter时,加上linkActiveClass:"is-active"即可

    如果不想要路由时候的‘#’号, 把路由模式改为‘history’模式即可

    改之前:

    改之后:

    <body>
    <div id="app">
    
    </div>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <!--1. 引入vue-router对象 全局的VueRouter对象-->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">
        // 2. 让Vue使用该VueRouter创建(如果使用模块化机制编程,导入Vue和VueRouter要写Vue.use(VueRouter),实际上此处可以不写)
        Vue.use(VueRouter);
             // 创建路由组件
        var Login = {
          template:`<h2>登录页面</h2>`
        };
        var Register = {
          template:`<h2>注册页面</h2>`
        };
        // 3. 创建一个路由对象
        var router = new VueRouter({
            // 配置路由对象
            routes:[
                {
                    path:'/login',
                    component:Login,
                },
                {
                    path:'/register',
                    component:Register,
                },
            ]
        });
    
        //4. 创建Vue对象
        var App={
            template:`<div>
        <router-link to="/login">登录页面</router-link>
        <router-link to="/register">注册页面</router-link>
    
        <div id="view">
        <router-view></router-view>
        </div>
    </div>`
        };
        new Vue({
            el:'#app',
            template:`<App />`,
            components:{
                App
            },
            router,  //要让vue使用router
        })
    </script>
    </body>

    效果:

    46、命名路由的使用

    <body>
    <div id="app">
    
    </div>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <!--1. 引入vue-router对象 全局的VueRouter对象-->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">
        // 2. 让Vue使用该VueRouter创建
        Vue.use(VueRouter);
             // 创建路由组件
        var Login = {
          template:`<h2>登录页面</h2>`
        };
        var Register = {
          template:`<h2>注册页面</h2>`
        };
        // 3. 创建一个路由对象
        var router = new VueRouter({
            // 配置路由对象
            routes:[
                {
                    path:'/login',
                    name:'login', //命名路由
                    component:Login,
                },
                {
                    path:'/register',
                    name:'register', //命名路由
                    component:Register,
                },
            ]
        });
    
        //4. 创建Vue对象
        var App={
            template:`<div>
        <router-link :to="{name:'login'}">登录页面</router-link>
        <router-link :to="{name:'register'}">注册页面</router-link>
    
        <div id="view">
        <router-view></router-view>
        </div>
    </div>`
        };
        new Vue({
            el:'#app',
            template:`<App />`,
            components:{
                App
            },
            router,  //要让vue使用router
        })
    </script>
    </body>

    47、小结

    1)引入vue-router的模块,产生VueRouter对象和两个全局组件router-link和router-view     

    我们可以在任何组件内通过 this.$router 访问路由器

    push方法: this.$router.push({ name: 'userp', params: { userId: '1' }})   ----当你点击 <router-link> 时,这个方法会在内部调用,所以说,点击 等同于调用 router.push(…)。

    repalce方法:this.$router.replace('/')  // 一般使用replace来做404页面

    也可以通过 this.$route 访问当前路由(http://xxx.com/code/1  或者 http://xxx.com/code?id=1 ) this.$route.params /  this.$route.query / this.$route.path
    2)Vue.use(VueRouter)
    3)创建路由对象
    4)路由对象挂载到vue实例化对象中
    5)命名路由,给当前的配置路由信息对象设置name属性
    :to="{name:'login'}"

    48、路由参数之params和query的使用

    两种路由范式如何实现?
    1)xxx.html#/user/1
    2)xxx.html#/user?userID=1

    <body>
    <div id="app">
    
    </div>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <!--1. 引入vue-router对象 全局的VueRouter对象-->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">
        // 2. 让Vue使用该VueRouter创建
        Vue.use(VueRouter);
             // 创建路由组件
        var UserParams = {
          template:`<h2>我是用户1</h2>`,
            created(){
              // console.log(this.$route);  //路由配置信息
              // console.log(this.$router);  //VueRouter对象
                //发送ajax请求
                console.log(this.$route.params.userId);  // 1
            }
        };
        var UserQuery = {
          template:`<h2>我是用户2</h2>`,
            created(){
              // 发送ajax请求
              console.log(this.$route.query.userId);  // 2
            }
        };
        // 3. 创建一个路由对象
        var router = new VueRouter({
            // 配置路由对象
            routes:[
                {
                    // 路由范式一:xxx.html#/user/1
                    path:'/user/:userId',
                    name:'userp',
                    component:UserParams,
                },
                {
                    // 路由范式二:xxx.html#/user?userId=1
                    path:'/user',
                    name:'userq',
                    component:UserQuery,
                },
            ]
        });
    
        //4. 创建Vue对象
        var App={
            template:`<div>
        <router-link :to="{name:'userp', params:{userId:1}}">用户1</router-link>
        <router-link :to="{name:'userq', query:{userId:2}}">用户2</router-link>
    
        <div id="view">
        <router-view></router-view>
        </div>
    </div>`
        };
        new Vue({
            el:'#app',
            template:`<App />`,
            components:{
                App
            },
            router,  //要让vue使用router
        })
    </script>
    </body>

    效果:

     

    49、编程式导航

    上面的例子可以用编程式导航来实现:

    <body>
    <div id="app">
    
    </div>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <!--1. 引入vue-router对象 全局的VueRouter对象-->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">
        // 2. 让Vue使用该VueRouter创建
        Vue.use(VueRouter);
             // 创建路由组件
        var UserParams = {
          template:`<h2>我是用户1</h2>`,
            created(){
              // console.log(this.$route);  //路由配置信息
              // console.log(this.$router);  //VueRouter对象
                //发送ajax请求
                console.log(this.$route.params.userId);  // 1
            }
        };
        var UserQuery = {
          template:`<h2>我是用户2</h2>`,
            created(){
              // 发送ajax请求
              console.log(this.$route.query.userId);  // 2
            }
        };
        // 3. 创建一个路由对象
        var router = new VueRouter({
            // 配置路由对象
            routes:[
                {
                    // 路由范式一:xxx.html#/user/1
                    path:'/user/:userId',
                    name:'userp',
                    component:UserParams,
                },
                {
                    // 路由范式二:xxx.html#/user?userId=1
                    path:'/user',
                    name:'userq',
                    component:UserQuery,
                },
            ]
        });
    
        //4. 创建Vue对象
        var App={
            template:`<div>
        <button type="button" @click="paramsHandler">用户1</button>
        <button type="button" @click="queryHandler">用户2</button>
    
        <div id="view">
        <router-view></router-view>
        </div>
    </div>`,
            methods:{
                paramsHandler(){
                    this.$router.push({ name: 'userp', params: { userId: '1' }})
                },
                queryHandler(){
                    this.$router.push({ name: 'userq', query: { userId: '2' }})
                }
            }
        };
        new Vue({
            el:'#app',
            template:`<App />`,
            components:{
                App
            },
            router,  //要让vue使用router
        })
    </script>
    </body>

    50-51、嵌套路由的使用及警告处理

    嵌套路由:
    一个router-view里面包含另一个router-view
    例如:一个导航按钮点开,里面有子导航按钮
    而且子导航按钮,各自打开的结构还不一样(不能用数据驱动视图)就要用到嵌套路由

    <body>
    <div id="app">
    
    </div>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <!--1. 引入vue-router对象 全局的VueRouter对象-->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">
        // 2. 让Vue使用该VueRouter创建
        Vue.use(VueRouter);
        /*
        嵌套路由:
        需求:进入首页之后 点击音乐/home/music 电影/home/movie
        加载两个不同的组件
         */
        var Home = {
          template:`<div>
            <router-link to="/home/music">音乐</router-link>
            <router-link to="/home/movie">电影</router-link>
            <router-view></router-view>
            </div>`,
        };
        var Music = {
          template:`<p>我是音乐</p>`
        };
        var Movie = {
          template:`<p>我是电影</p>`
        };
        // 3. 创建一个路由对象
        var router = new VueRouter({
            routes:[
                {
                  path:'/',
                  // redirect:{name:'home'}
                  redirect:'/home'
                }, //默认跳转到/home
                {
                    path:'/home',
                    // name:'home',  //如果有这个会报警告,如果父路由有子路由时,父路由最好不要弄命名路由
                    component:Home,
                    //动态路由匹配 表示你的子组件中的结构是不同的
                    children:[
                        //当访问/home时,Home组件的出口是不会渲染任何内容,这是因为没有匹配到合适的子路由,这样写表示渲染Music组件
                        {
                            path:'', //表示访问的/home
                            component:Music
                        },
                        {
                            path:'music',
                            component:Music
                        },
                        {
                            path:'movie',
                            component:Movie
                        },
                    ]
                },
            ]
        });
    
        //4. 创建Vue对象
        var App={
            template:`<div>
            <router-link to="/home">首页</router-link>
    
        <div id="view">
        <router-view></router-view>
        </div>
    </div>`,
        };
        new Vue({
            el:'#app',
            template:`<App />`,
            components:{
                App
            },
            router,
        })
    </script>
    </body>

    效果:访问根路径后显示的页面

    52、动态路由匹配

    动态路由
    跟嵌套路由相反,例如:一个导航按钮点开,里面有子导航按钮
    而且子导航按钮,各自打开的结构一样,只是数据不同,可以用数据驱动视图,
    这时,就要用到动态路由。

    --------核心思想-------

    [“Android” 链接+ “前端” 链接+其<router-view>]  都放在首页的<router-view>里面,

    点击“Android” 或 “前端” 在其<router-view>里共享同一个组件

     

     

    <body>
    <div id="app">
    
    </div>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <!--1. 引入vue-router对象 全局的VueRouter对象-->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">
        // 2. 让Vue使用该VueRouter创建
        Vue.use(VueRouter);var Timeline = {
          template:`<div>
            <router-link :to="{name:'commonDesc', params:{id:'android'}}">Android</router-link>
            <router-link :to="{name:'commonDesc', params:{id:'frontend'}}">前端</router-link>
    
            <router-view></router-view>
    </div>`
        };
        var Pins = {
          template:`<p>我是沸点</p>`
        };
        var CommonDesc = {
            data(){
              return {
                  msg:'',
              }
            },
            template:`<p>我是一个{{msg}}</p>`,
            // 当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。
            // 因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
            // 复用组件时,想对路由参数的变化作出响应的话,你可以简单地 watch (监测变化) $route 对象
            created(){
              this.msg = 'android';
            },
            watch:{
                $route(to, from){
                    // console.log(from);   //更新前$route
                    // console.log(to);     //更新后$route
                    this.msg = to.params.id;
                    console.log(this.msg);
                }
            }
        };
        // 3. 创建一个路由对象
        var router = new VueRouter({
            routes:[
                {
                    path:'/timeline',
                    component:Timeline,
                    children:[
                        {
                            path:'',
                            component:CommonDesc
                        },
                        {
                            path:':id',
                            // path:'/timeline/:id',
                            name:'commonDesc',
                            component:CommonDesc
                        },
                    ]
                },
                {
                    path:'/pins',
                    component:Pins,
                },
            ]
        });
    
        //4. 创建Vue对象
        var App={
            template:`<div>
            <router-link to="/timeline">首页</router-link>
            <router-link to="/pins">沸点</router-link>
    
        <div id="view">
        <router-view></router-view>
        </div>
    </div>`,
        };
        new Vue({
            el:'#app',
            template:`<App />`,
            components:{
                App
            },
            router,
        })
    </script>
    </body>

     53、keep-alive在路由中的使用

    keep-alive的作用是将<router-view>里渲染的内容缓存起来,下次切换的时候直接使用。

    keep-alive使用后,生命周期钩子函数中的created  mounted 只调用一次, activated和deactivated生效

    下面案例中:点击“沸点”, 将字体变红,再点击“首页”,再点回“沸点”,字体颜色依然是红色,就是keep-alive的产生的缓存效果

    <body>
    <div id="app">
    
    </div>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <!--1. 引入vue-router对象 全局的VueRouter对象-->
    <script type="text/javascript" src="./node_modules/vue-router/dist/vue-router.js"></script>
    <script type="text/javascript">
        // 2. 让Vue使用该VueRouter创建
        Vue.use(VueRouter);
        var Timeline = {
          template:`<p>我是首页</p>`
        };
        var Pins = {
            template:`<p @click="clickHandler">我是沸点</p>`,
            methods:{
                clickHandler(e){
                    e.target.style.color = 'red';
                }
            }
        };
        // 3. 创建一个路由对象
        var router = new VueRouter({
            routes:[
                {
                    path:'/timeline',
                    component:Timeline,
                },
                {
                    path:'/pins',
                    component:Pins,
                },
            ]
        });
    
        //4. 创建Vue对象
        var App={
            template:`<div>
            <router-link to="/timeline">首页</router-link>
            <router-link to="/pins">沸点</router-link>
    
        <div id="view">
        <keep-alive>
            <router-view></router-view>
        </keep-alive>
        </div>
    </div>`,
        };
        new Vue({
            el:'#app',
            template:`<App />`,
            components:{
                App
            },
            router,
        })
    </script>
    </body>
  • 相关阅读:
    【Java EE 学习 81】【CXF框架】【CXF整合Spring】
    【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
    【Java EE 学习 80 上】【WebService】
    【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
    【Java EE 学习 79 上】【mybatis 基本使用方法】
    【Java EE 学习 78 下】【数据采集系统第十天】【数据采集系统完成】
    【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】
    【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
    【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
    【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
  • 原文地址:https://www.cnblogs.com/staff/p/11763063.html
Copyright © 2011-2022 走看看