Vue-router(重新复习)


1.什么是Vue-router?(运行时依赖 --save)


  • 安装vue-router

  • 使用 vue - router

    • 第一步: 导入路由对象,并且调用Vue.use(VueRouter)
    const router = new VueRouter({
            mode: 'history',
            base: process.env.BASE_URL,
             routes
            })
  • 第二步: 创建路由实例,并且传入路由映射配置
            const router = new VueRouter({
            mode: 'history',
            base: process.env.BASE_URL,
             routes
            })
  • 第三步: 在Vue实例中挂在创建的路由实例
    const routes = [
            {
                path: '/',
                name: 'home',
                 component: Home
                 //配置的映射关系   一个组件对应一个路由
            },
            {
                path: '/about',
                name: 'about',
                component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
            }
            ]

## 2. 使用vue-router的步骤 **


  • 先创建对应的组件 .vue文件

  • 配置映射关系

  • 配置router-link 和 router-view

  • router-link 有 to属性 为你注册的path路径

  • router-view 决定你注册组件渲染在什么位置
    相当于一个占用一个位置,在什么地方来渲染我们的组件

  • 当我需要刚进来就进入到home路径可以redirect重新定向

  • 在VUe-router 实例里面渲染
    mode: ‘history’, //防止路径凭借的hash值的出现

  • router-link的其他属性(最后会被渲染为一个a标签)
    to属性 value设置为 路径 就可以实现跳转。
    tag属性 可以将router-link渲染为一个button标签。
    replace属性 没有值 防止返回按钮的实现。

      当某个router-link被点击时会增加一个calss 为 router-link-active
    
  • active-class :当router-link 对应的路由匹配除成功的时候,会自动给当前元素设置一个router-link-active的class,设置active-class可以修改默认的名称。
    + 在进行高亮显示的导航菜单或者底部tabbar时,会使用到这个类。
    + 通常不会修改类的属性,直接使用默认的router-link-active

  • 路由跳转的手动实现方式
    this. r o u t e r . p u s h ( ′ / h o m e ′ ) ; t h i s . router.push('/home'); this. router.push(/home);this.router.replace(’/home’);


3.动态路由的使用


拼接动态路由
path:’/user/:userId’,

    在app.vue里这样写
    this.$router.push('/user/余罪')


    手动拼接路由
    userClick(){
    this.$router.push(`/user/${this.user}`)
    }


    使用router.link 拼接路由
    <router-link :to="'/user/' + user" tag='button'> 用户 </router-link>

4.路由的懒加载

***+ 我们知道路由中通常会定义很多不同的页面。

  • 这个页面最后被打包放在一个js文件中

  • 但是,页面放在一个js文件中会使得这个页面非常的大。

  • 如果我们一次性从给服务器请求下来这个页面,可能需要花费一定的时间。

  • 如何避免这种情况呢? 使用路由的懒加载

  • 路由懒加载做了什么?
    主要时将路由对应的组件打包成一个个的小的js文件。
    只有在访问这个路由的时候,才会加载对应的组件。
    每一个路由懒加载都会多分配一个小的js文件。

  • 路由懒加载的写法
    以前的基本写法:import ‘’ from ‘’
    路由的懒加载写法: ES6 写法
    const home = () => import(’’)
    可以实现动态加载路由


5. 路由的嵌套使用


  • 比如在home页面中,我们希望使用/home/news 和 /home/message访问一些内容

  • 也就是创建子组件

  • 创建对应的子组件,并且配置对应的映射

  • 在组件内部使用显示出来

  • 子路由的path 不加/
    {
    path:‘news’,
    component:HomeNews
    },

  • 子路由的跳转的时候,用的是/home/news

  • 修改路由跳转总是暴露出来无关痛痒的promise报错
    const originalPush = VueRouter.prototype.push
    VueRouter.prototype.push = function push(location) {
    return originalPush.call(this, location).catch(err => err)
    }


6.路由传递参数一


  • 当我们从一个页面跳转到另外一个页面时,我们想要传递一些消息

1.第一种方式 动态路由(params的方式)

  • 配置为动态路由,方便路由间传递数据

  • 给别的路由to的时候需要拼接

  • 传递之后通过 this.$route.params 拿到你想要使用的数据

2.第二种方式 query的方式

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

  • 传递的方式:对象中使用query的key作为传递方式

  • 传递后形成的路径: /router?id=123,/router?id=abc

  • 传递数据的方式 {}

  • 自定义按钮路由跳转 query传递参数

   profileClick(){
        this.$router.push({
        path:'/profile',
        query:{
          userId:'kjh',passWord:861918672
        }
        })
    }

6.$router $route (1) 简单了解


  • 是我们new 的router对象

  • 哪一个路由处于活跃拿到的就是谁
    从路径后面拿到你当前的用户id
    return this.$route.params.userId 这里的userId 时 index.js中路径后面拼接的


7. $router $toute (2) 详细了解


  •    routerClick(){
          console.log(this.$router);
      },
      打印结果为:VueRouter  即我们导入的Vue对象实例
      任何组件里面拿到的this.$router 都是Vue对象实例
    
  •    routeClick(){
          console.log(this.$route);
      }
      打印结果为:{name: undefined, meta: {…}, path: "/profile", hash: "", query: {…}, …}
      也就是当前的活跃路由 profile
      里面有query params 等
    

8. vue导航守卫


为什么使用导航守卫
  • 我们来考虑一个需求:在一个spa应用中,如何改变网页的标题呢?
  • 网页标题是通过来显示的,但是spa只有一个固定的HTML,切换不同的页面的时候,标题并不会改变。
  • 但是我们可以通过javascripot来修改titile内容, window.document.title = ‘new title’
  • 那么在vue中我们在哪里修改,如何修改呢?

导航守卫
前置守卫(guard)
beforeEach()
三个参数的解析:

to: 即将要进入的目标的路由对象
from:当前导航即将要离开的路由对象
next(): 调用该方法后才能进入下一个钩子

router.beforeEach((to, from, next) => {
//从from跳转到to
document.title = to.meta.title;
next(); //如果没有next() 就不能发生跳转了
})
使用这个的时候会有问题,当路由嵌套时,拿出来的title时错的。
document.title = to.meta.title;

所以我们使用的是打印matched里面的第一个位置的title就是他的父亲路由
document.title = to.matched[0].meta.title;

后置钩子函数(如果是后置狗子,也就是affteEach,不需要调用next())

  • afterEach()

路由独享守卫(可以在配置映射关系的时候设置守卫)

const router = new VueRouter({
        routes:[
                {
                        path:'/home',
                        component:Home,
                        beforeEach:(to,from,next) => {
                                console.log('aaa');
                        }
                }
        ]
})

keep-alive(和vue-router的关系)

    router-view是一个组件,如果直接被包裹在keep-alive里面,所有的路径匹配到的组件都会被缓存
    keep-alive 是Vue内置的一个组件们可以是被包含的组件保留状态,避免重新渲染。
  • created(){
    console.log(‘home被创建’);
    },
    destroyed(){
    console.log(‘home被销毁’);
    }

    在home定义这两个寿命周期函数

    当你切换到home路由,他就会被创建,当你切换走,就会被销毁。
    也就是说每当你切换到home路由的时候,dom重新渲染了这个home路由里面的的组件。
    所以组件内部的状态并不能保存。

    方法:用<keep-alive>包裹<router-view> <keep-alive> <router-view></router-view> <keep-alive>

  • 当父亲下面有两个子路由的时候,要想保存这两个状态就会因为路由嵌套问题出错。
    解决方法:
    生命周期函数

      先给data里面定义一个默认的path
    
      当前路由活跃的时候
      activated(){
              this.$router.push(this.path)    //这个是因为我们修改了进入home页面的重定向路径
      }
    

activated detivated 这两个函数 只有在 keep-alive 激活时才会触发

 activated(){
    console.log(this.path)
    this.$router.push(this.path)   //这个是因为我们修改了进入home页面的重定向路径
},
    我们需要在home路由里面定义一个path变量存储我们想要重定向的路由,然后使用activated来重定向


beforeRouteLeave(to, from , next){   在组建离开时保存当前Home组件内活跃的子组件path
    this.path = this.$route.path;   //修改path为当前的活跃的路由  
    console.log(this.$route.path)
    next()
}


这样就实现了嵌套路由保存状态的操作。

vue全家桶 vuecore + vue-router + vuex ok!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值