zoukankan      html  css  js  c++  java
  • Vue-Router笔记

    一.安装路由

    npm install vue-router --save
    

    二.配置路由

    • 在src下面创建一个router目录

    • 在router目录下面创建一个index.js

    • 在index.js文件中添加如下结构的内容

      import VueRouter from 'vue-router'
      import Vue from 'vue'
      
      //1. 通过Vue.use(插件),安装插件
      Vue.use(VueRouter)
      // 组件与路由之间的映射关系
      const routes = [];
      // 2.创建路由对象
      const router = new VueRouter({
          // 配置路由与组件之间的映射关系.
          routes
      })
      // 3. 将router对象传入到vue实例
      export default router
      
    • 在main.js文件中将创建的路由实例挂载到Vue实例上.

      import router from "./router";
      new Vue({
          render: h => h(App),
          // 4. vue实例上面挂载路由对象.
          router,
      }).$mount('#app')
      
      

    三.配置路由与组件的映射关系

    • 创建组件,我这儿创建两个组件,Home.Vue 和 About.Vue

      <template>
          <div>
              <h2>我是主页</h2>
          </div>
      </template>
      
      <script>
          export default {
              name: "Home"
          }
      </script>
      
      <style scoped>
      
      </style>
      
      <template>
          <div>
             <h2> 我是About</h2>
          </div>
      </template>
      
      <script>
          export default {
              name: "About"
          }
      </script>
      
      <style scoped>
      
      </style>
      
    • 在router/index.js中配置路由与组件的映射关系

      import Home from '../components/Home'
      import About from "../components/About";
      
      const routes = [
          {
              path: '/home',
              component: Home
          },
          {
              path: '/about',
              component: About
          }
      ];
      
    • 在App.Vue中使用路由,这儿需要用到两个标签. router-link 和 router-view

      <template>
          <div id="app">
              <router-link to="/home">首页</router-link>
              <router-link to="/about">关于</router-link>
              <router-view></router-view>
          </div>
      </template>
      

      router-link : 路由对象. 实质就是一个a标签, to属性指向组件的路径

      router-view: 路由组件在App.Vue中的显示位置. 占位.

    四. 细节配置

    • 默认路径重定向

      const routes = [
          {
              path: '',
              // 重定向.
              redirect: '/home'
          },
          {
              path: '/home',
              component: Home
          },
          {
              path: '/about',
              component: About
          }
      ];
      

      以上示例,假如浏览器请求 http://127.0.0.1:8080 就会重定向到 http://127.0.0.1:8080/home

    • History模式

      html5默认是hash模式: http://127.0.0.1:8080/#/home, 其中有个#太难看,推荐使用history模式.

      const router = new VueRouter({
          // 配置路由与组件之间的映射关系.
          routes,
          mode:'history'
      })
      

      使用history模式之后,URL显示就是这样: http://127.0.0.1:8080/home

    • router-link

      • to : 路由组件映射的路径

      • tag: router-link渲染成什么样的组件. 比如: tag = 'button', 那么渲染之后就是一个按钮; tag='li', router-link渲染之后就是一个li标签. 默认是a标签.

      • replace : router-link默认是putState模式,使用replace之后,就改成了replace模式.

        <router-link to="/home" replace>首页</router-link>
        
      • active-class: 选中的router-link默认就会有一个router-link-active的class样式. 可以使用active-class对router-link-active进行重命名.

        <router-link to="/about" active-class="active">关于</router-link>
        

        还可以在router/index.js文件中进行统一配置

        const router = new VueRouter({
            // 配置路由与组件之间的映射关系.
            routes,
            mode:'history',
            linkActiveClass:'active'
        })
        
    • $router

      如果想使用代码的方式进行路由跳转.可以使用vue-router提供的$router对象来实现.

              methods:{
                  homeClick() {
                      // 触发homeClick方法,跳转到/home
                      this.$router.push('/home')
                  },
                  aboutClick() {
                      // 触发aboutClick方法,跳转到/about
                      this.$router.push('/about')
                  }
              }
      

      除了使用push方法之外,还可以使用replace方法. 使用replace方法之后路由不能前进后退. replace方法与router-link标签中的replace属性作用一样.

    五.动态路由

    • 在router/index.js配置动态路由

          {
              // username是动态改变的
              path: '/user/:username',
              component: User
          }
      
    • router-link 标签运态属性绑定

      <router-link :to="'/user/'+username">用户</router-link>
      
    • 从$route对象中获取动态路由参数

         <h2>我是用户....{{$route.params.username}}</h2>
      

      或者通过计算属性

      computed:{
                  getUserName() {
                      return this.$route.params.username
                  }
              }
      
        <h2>我是用户....{{getUserName}}</h2>
      

    六.路由的懒加载

    • 路由懒加载即是路由到那个模块,就加载那个模块组件的代码.
    import VueRouter from 'vue-router'
    import Vue from 'vue'
    import Home from '../components/Home'
    import About from '../components/About'
    import User from '../components/User'
    
    //1. 通过Vue.use(插件),安装插件
    Vue.use(VueRouter)
    // 2.创建路由对象
    const routes = [
        {
            path: '',
            // 重定向.
            redirect: '/home'
        },
        {
            path: '/home',
            component: Home
        },
        {
            path: '/about',
            component: About
        }
        ,
        {
            // username是动态改变的
            path: '/user/:username',
            component: User
        }
    ];
    const router = new VueRouter({
        // 配置路由与组件之间的映射关系.
        routes,
        mode: 'history',
        linkActiveClass: 'active'
    })
    // 3. 将router对象传入到vue实例
    export default router
    

    以上代码的路由配置不是懒加载模式.所有的js代码会打包成一个js文件. 浏览器请求时,会一次性的将打包js文件从请服务器请求到浏览器端.

    • 懒加载配置
    import VueRouter from 'vue-router'
    import Vue from 'vue'
    // import Home from '../components/Home'
    // import About from '../components/About'
    // import User from '../components/User'
    
    //1. 通过Vue.use(插件),安装插件
    Vue.use(VueRouter)
    // 2.创建路由对象
    const routes = [
        {
            path: '',
            // 重定向.
            redirect: '/home'
        },
        {
            path: '/home',
            component: () => import('../components/Home')
        },
        {
            path: '/about',
            component: ()=> import('../components/About')
        }
        ,
        {
            // username是动态改变的
            path: '/user/:username',
            component: ()=> import('../components/User')
        }
    ];
    const router = new VueRouter({
        // 配置路由与组件之间的映射关系.
        routes,
        mode: 'history',
        linkActiveClass: 'active'
    })
    // 3. 将router对象传入到vue实例
    export default router
    

    七.路由嵌套

    • 实现步骤

      • 创建对应的子组件, 并且在路由映射中配置对应的子路由
      • 在组件内部使用router-view标签 .
    • 代码实现

      • HomeMessage.Vue组件

        <template>
            <div>
                <ul>
                    <li>消息1</li>
                    <li>消息2</li>
                    <li>消息3</li>
                    <li>消息4</li>
                </ul>
            </div>
        </template>
        
        <script>
            export default {
                name: "HomeMessage"
            }
        </script>
        
        <style scoped>
        
        </style>
        
      • HomeNews.Vue组件

        <template>
            <div>
                <ul>
                    <li>新闻1</li>
                    <li>新闻2</li>
                    <li>新闻3</li>
                    <li>新闻4</li>
                </ul>
            </div>
        </template>
        
        <script>
            export default {
                name: "HomeNews"
            }
        </script>
        
        <style scoped>
        
        </style>
        
      • router/index.js文件中配置子路由

        import VueRouter from 'vue-router'
        import Vue from 'vue'
        //1. 通过Vue.use(插件),安装插件
        Vue.use(VueRouter)
        // 2.创建路由对象
        const routes = [
            {
                path: '',
                // 重定向.
                redirect: '/home'
            },
            {
                path: '/home',
                component: () => import('../components/Home'),
                children: [
                    {
                        path: '/home/news',
                        component: () => import('../components/HomeNews')
                    },
                    {
                        // path: '/home/message',  // 可以这样,绝对路径
                        path: 'message',  // 可以这样,相对路径
                        component: () => import('../components/HomeMessage')
                    }
                ]
            },
            {
                path: '/about',
                component: () => import('../components/About')
            }
            ,
            {
                // username是动态改变的
                path: '/user/:username',
                component: () => import('../components/User')
            }
        ];
        const router = new VueRouter({
            // 配置路由与组件之间的映射关系.
            routes,
            mode: 'history',
            linkActiveClass: 'active'
        })
        // 3. 将router对象传入到vue实例
        export default router
        

        或者

        import VueRouter from 'vue-router'
        import Vue from 'vue'
        
        const Home = () => import('../components/Home')
        const HomeNews = () => import('../components/HomeNews')
        const HomeMessage = () => import('../components/HomeMessage')
        //1. 通过Vue.use(插件),安装插件
        Vue.use(VueRouter)
        // 2.创建路由对象
        const routes = [
            {
                path: '',
                // 重定向.
                redirect: '/home'
            },
            {
                path: '/home',
                component: Home,
                children: [
                    {
                        path: '/home/news',
                        component: HomeNews
                    },
                    {
                        // path: '/home/message',  // 可以这样,绝对路径
                        path: 'message',  // 可以这样,相对路径
                        component: HomeMessage
                    }
                ]
            },
            {
                path: '/about',
                component: () => import('../components/About')
            }
            ,
            {
                // username是动态改变的
                path: '/user/:username',
                component: () => import('../components/User')
            }
        ];
        const router = new VueRouter({
            // 配置路由与组件之间的映射关系.
            routes,
            mode: 'history',
            linkActiveClass: 'active'
        })
        // 3. 将router对象传入到vue实例
        export default router
        

        使用上面这种方式配置路由映射关系进,router-link标签的to属性不能使用相对路径

        <router-link to="news" >新闻</router-link>   <--路由失败-->
        <router-link to="/home/news" >新闻</router-link>  <--路由成功-->
        
      • 在Home.Vue组件中配置两个子路由

        <template>
            <div>
                <h2>我是主页</h2>
                <router-link to="/home/news" >新闻</router-link>
                <router-link to="/home/message">消息</router-link>
                <router-view></router-view>
            </div>
        </template>
        

    八.参数传递

    • 路由动态传参的两种类型, params类型与query类型.

    8.1 params类型

    • 配置路由格式: /router/:id

          {
              // username是动态改变的
              path: '/user/:username',
              component: () => import('../components/User')
          }
      
    • 传递的方式: 在path后面跟上对应的值

           <router-link :to="'/user/'+username">用户</router-link>
      
    • 传递后形成的路径: router/123, router/admin等

      http://localhost:8080/user/admin
      
    • 取值方式

      $route.params.username
      

    8.2 query类型

    • 配置路由格式: /router . 普通配置

    • 传递的方式: query对象传参

    • 传递的形成的路径 : /router?id=123, 或者/router?name=admin.

    • 取值

      <h2>{{$route.query}}</h2>
      
    • 示例代码

      • 路由映射

           {
                path: '/profile',
                component: Profile
            }
        
      • router-link标签使用

                <router-link :to="{
                    path:'/profile',
                    query:{
                        name: 'admin',
                        age: 18,
                        gender: 'female'
                    }
                }">档案
                </router-link>
        
      • 浏览器显示

        http://localhost:8080/profile?name=admin&age=18&gender=female
        
      • 取值

        <h2>{{$route.query.name}}</h2>
        <h2>{{$route.query.age}}</h2>
        <h2>{{$route.query.gender}}</h2>
        
    • 示例代码2

    • 通过按钮点击跳转路由

        <button @click="profileClick">档案1</button>
      
        methods: {
                  profileClick() {
                      this.$router.push({
                          path:'/profile',
                          query:{
                              name:'bide',
                              age:1212,
                              gender:'male'
                          }
                      })
                  }
              }
      

    8.3 总结

    • 如果传参较多,建议使用query传参.

    九.全局导航守卫

    ​ 在路由发生改变时进行监控(做一些事.)

    • 在router/index.js添加以下配置

      // 路由全局导航穿守卫, 前置钩子. 在路由跳转之前执行.
      router.beforeEach((to,from,next)=>{
          // 从from 跳转到to
          // todo 改tab的title
          document.title = to.matched[0].meta.title
          console.log(to)
          next();
      })
      
    • 在组件路由映射关系中添加meta配置

      const routes = [
          {
              path: '',
              // 重定向.
              redirect: '/home'
          },
          {
              path: '/home',
              component: Home,
      
              children: [
                  {
                      path: '/home/news',
                      component: HomeNews
                  },
                  {
                      // path: '/home/message',  // 可以这样,绝对路径
                      path: 'message',  // 可以这样,相对路径
                      component: HomeMessage
                  }
              ],
              meta:{
                  title:'首页'
              }
          },
          {
              path: '/about',
              component: () => import('../components/About'),
              meta: {
                  title: '关于'
              }
      
          },
          {
              // username是动态改变的
              path: '/user/:username',
              component: () => import('../components/User'),
              meta: {
                  title: '用户'
              }
          },
          {
              path: '/profile',
              component: Profile,
              meta: {
                  title: '档案'
              }
          }
      ];
      

    十. 路由独享守卫

    十一.keep-alive

    • 使用keep-alive之后,组件不会每次都是创建 , 可以通过组件的created函数进行验证.

      <keep-alive>
      	<router-view></router-view>
      </keep-alive>
      
    • 两个属性

      • include : 指定那些组件会被缓存,正则表达式或字符串,多个组件用逗号进行分隔

      • exclude : 指定那些组件不会被缓存. 正则表达式或字符串,多个组件用逗号进行分隔

  • 相关阅读:
    Python for Infomatics 第14章 数据库和SQL应用四(译)
    展望2017
    bing的简单英文字典工具
    自我安慰
    Python for Infomatics 第14章 数据库和SQL应用三(译)
    Python for Infomatics 第14章 数据库和SQL应用二(译)
    Python for Infomatics 第14章 数据库和SQL应用一(译)
    希望父亲早日恢复
    Python for Infomatics 第13章 网页服务四(译)
    Python for Infomatics 第13章 网页服务三(译)
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/13055042.html
Copyright © 2011-2022 走看看