Vue-router学习笔记

一、Vue-router之集成

1. 功能

处理前端路由的功能

2. 安装

npm install vue-router --save

3. 集成

在项目中新建两个文件(router文件夹下)

index.js    // 路由配置
routes.js   // 路由内容

3.1 routes.js

存放路由映射关系,为一个数组

    import Component from '@/components/Component.vue'
    import Login from '@/components/Login.vue'

    export default [
      {
        path: '/component',  // 路径
        component: Component // 组件
      },
      {
        path: '/login',
        component: Login
      }
    ]

3.2 index.js

存放路由配置

  • 3.2.1 方式一:返回一个Router对象,全局import时皆为统一对象,不会自动释放,所以在使用服务端渲染时会导致内存溢出
    import Router from 'vue-router'
    import routes from './routes'
    // 使用Router
    Vue.use(Router)

    export default new Router({
      routes  // 路由配置
    })
  • 3.2.2 方式二:返回一个方法,每次import创建一个新的Router
    import Router from 'vue-router'
    import routes from './routes'
    // 使用Router
    Vue.use(Router)

    export default () => {
      return new Router({
        routes  // 路由配置
      })
    }

3.3 main.js

    import createRouter from './router'

    // 使用导入的createRouter方法创建一个router
    const router = createRouter()

    // 将router放入new Vue的配置项中
    new Vue({
      router: router,
    })

3.4 App.vue

    <template>
      <!-- <router-view />的位置显示路由对应的内容 -->
      <router-view />
    </template>

二、Vue-router之配置

1. routes.js

path

路由路径

component

组件

redirect

路由重定向

    import Component from '@/components/Component.vue'
    import Login from '@/components/Login.vue'


    export default [
      {
        path: '/',
        redirect: '/component'  // 将路由重定向
      },
      {
        path: '/component',  // 路径
        component: Component // 组件
      },
      {
        path: '/login',
        component: Login
      }
    ]

2. index.js

routes

路由配置

mode

路由模式,默认哈希路由,带#,history模式无#。

base

基路径

linkActiveClass linkExactActiveClass

<router-link>会带有这两个class,全局配置链接被激活时所展示的样式。

  • linkExactActiveClass:路径完全匹配
  • linkActiveClass:子集即可

scrollBehavior

    scrollBehavior (to, from, savedPosition) {}
  • to:路由跳转过程中要前往的路由
  • from:路由跳转过程中来自的路由
    • 注:to与from都是完整的路由对象
  • savedPosition:记录滚动条的位置

parseQuery stringifyQuery

?a=xxx&b=yyy
对象与字符串互相转换

fullback

浏览器不支持history会自动转为hash形式

    import Router from 'vue-router'
    import routes from './routes'
    // 使用Router
    Vue.use(Router)

    export default () => {
      return new Router({
        routes,           // 路由配置
        mode: 'history',  // 路由模式
        base: '/base/',   // 路由前会默认加上‘/base/’
        linkActiveClass: 'active-link',
        linkExactActiveClass: 'exact-active-link',
        // 记录滚动行为
        scrollBehavior (to, from, savedPosition) {
          if (savedPosition) {
            return savedPosition
          } else {
            return { x: 0, y: 0}
          }
        },
        // 字符串转对象
        parseQuery (query) {},
        // 对象转字符串
        stringifyQuery (obj) {},
        fullback: true
      })
    }

三、Vue-router之路由参数传递

1. routes.js

name

路由名字

    <template>
      <router-link :to="{name: 'component'}">app</router-link>
    </template>

meta

元信息

children

子路由,在该组件之下的<router-view />之中显示,嵌套路由

    import Component from '@/components/Component.vue'
    import Login from '@/components/Login.vue'

    export default [
      {
        path: '/component',     // 路径
        component: Component,   // 组件
        name: 'component',      // 名字
        meta: {                 // 元信息
          title: 'this is app',
          description: 'asdasd'
        },
        children: [             // 子路由
          {
            path: 'test',
            component: Login
          }
        ]
      },
      {
        path: '/login',
        component: Login
      }
    ]

2. transition

路由过渡动画

  • Component
    <template>
      <transition name="fade">
        <router-view />
      </transition>
    </template>
  • Style
    .fade-enter-active, .fade-leave-active {
      transition: opacity .5s
    }
    .fade-enter, .fade-leave-to {
      opacity: 0
    }

3. 参数

可从路由中获取信息
访问路径:/app/123?a=123&b=456

3.1 方法1

  • routes.js
    {
      path: '/app/:id',   // /app/xxx
      component: Login
    }
  • Component
    export default {
      mounted () {
        this.$route         // 路由的全部信息
        this.$route.params  // {id:"123"}
        this.$route.query   // {a:"123", b:"456"}
      }
    }

3.2 方法2

  • routes.js
    {
      path: '/app/:id',   // /app/xxx
      props: true         // 将id作为props传入
      component: Login
    }
  • Component
    export default {
      props: ['id']
      mounted () {
        console.log(this.id)  // 123
      }
    }
props的其他用法
  • routes.js
  {
    path: '/app/:id',   // /app/xxx
    // 自定义值
    props: {
      id: '456'
    },
    // 自定义方法
    props: (route) => (
      {
        id: route.query.b
      }
    ),
    component: Login
  }

四、Vue-router之导航守卫

1. 命名视图

解决同一组件下两个<router-view />显示不同内容

  • Component
    <template>
      <router-view />
      <router-view name="a"/>   // 给router-view一个名字
    </template>
  • routes.js
    component改为components
    {
      path: '/app',
      components: {
        default: Component,
        a: Login
      }
    }

2. 导航守卫

2.1 全局导航守卫 main.js

    const router = createRouter()
  • to:前往路由
  • from:来源路由
  • next:方法,执行下一步
    router.beforeEach((to, from, next) => {
      console.log('before each invoked');
      next()
    })

    router.beforeResolve((to, from, next) => {
      console.log('before resolve invoked');
      next()
    })

    router.afterEach((to, from) => {
      console.log('after each invoked')
    })
  • 执行顺序
    beforeEach => beforeResolve => afterEach
  • beforeEach
    • 进行数据校验
      router.beforeEach((to, from, next) => {
        // 跳转路径为'/login'时才进行跳转
        if (to.fullPath == '/login') {
          next()
        }
      })
      
    • next的写法,和vue-router上定义的props是一样的
      next('/login')
      next({path: '/login'})
      next({name: 'Login'})
      
2.2 路由配置中 routes.js
    {
      path: '/component',
      component: Component,
      beforeEnter (to, from, next) {
        console.log('app route before enter')
        next()
      }
    }
  • 执行顺序
    beforeEach => beforeEnter => beforeResolve => afterEach
2.3 组件内部 Component.Vue
    export default {
      beforeRouteEnter (to, from, next) {
        console.log('todo before enter')
        next()
      },
      beforeRouteUpdate (to, from, next) {
        console.log('todo update enter')
        next()
      },
      beforeRouteLeave (to, from, next) {
        console.log('todo leave enter')
        next()
      },
    }
  • 执行顺序
    beforeRouteLeave(上一路由) => beforeEach => beforeEnter => beforeRouteEnter / beforeRouteUpdate => beforeResolve => afterEach
    • beforeRouteUpdate
      同一个组件在不同路由下显示时触发,mounted()不会触发,需要使用beforeRouteUpdate
  • 在beforeRouteEnter中从this中获取数据
      beforeRouteEnter (to, from, next) {
        console.log('todo before enter')
        next(vm => {
          console.log(vm);  // vm相当于this
        })
      },
    
  • beforeRouteLeave应用场景
    控制页面离开,例如当前组件表单做了较大修改,在离开前可询问是否确认离开
    beforeRouteLeave (to, from, next) {
      console.log('todo leave enter')
      if (global.confirm('are you sure?')) {
        next()
      }
    },
    

3. 异步组件

将component修改为一个方法,即可在访问某个组件时只加载相应代码,而不是一开始就加载全部代码,可提高首页访问速度

    {
      path: '/component',
      component: () => import('/components/Component.vue')
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342