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>
  • 相关阅读:
    [Algorithm] Universal Value Tree Problem
    [HTML5] Using the focus event to improve navigation accessibility (nextElementSibling)
    [Javascript] Coding interview problem: Scheduler functional way
    [Algorithm] Tree: Lowest Common Ancestor
    [NPM] Execute Code from a Remote GitHub Branch with npx
    hdu 4740
    通过网页实现软件的布局
    STL 统计vector容器中指定对象元素出现的次数:count()与count_if()算法
    善待自己生存的空间
    青春散场
  • 原文地址:https://www.cnblogs.com/staff/p/11763063.html
Copyright © 2011-2022 走看看