Vue中的路由

134 阅读3分钟

Vue中的路由

一、路由理解
二、基本配置

第一步:在main.js中引入并且使用插件

第二步:在src文件夹下创建一个router文件夹然后在文件夹下创建index.js

第三步:回到main.js中引入创建的router并在vue实例对象中使用

三、路由的使用

第一点:a标签在路由中的改变

第二点:多级路由

第三点:路由传参

query传参

params传参

replace属性

四、编程式路由导航
五、缓存组件和两个生命周期钩子

1、缓存路由组件

2、两个新的生命周期钩子

六、路由守卫

第一种、全局守卫

第二种、局部守卫

第三种、组件守卫

一、路由的理解

什么是路由:

1、路由就是一组映射关系

2、key为路,value可能是function或component

路由的工作过程:

当浏览器的路径改变时,对应的组件就会显示

二、路由的使用

1、实现点击切换以及高亮样式的配置

2、作用:控制路由跳转时操作浏览器历史记录的模式

3、浏览器的历史记录有两种模式:

一、push:

push是追加历史记录

二、

replace是替换当前记录,路由跳转时候默认为push

三、 直接在添加replace

指定显示位置:

路由的注意点: (vue路由钩子和路由守卫都是同一个意思。)

1、当我们使用vue-router的hash路由模式的时候,进入同路径组件,但参数不一样的时候,我们无法触发他的加载声明周期,这样的话会导致,我要请求数据的接口的方法不会触发,那我就无法拿到数据进行页面的渲染。

    beforeRouteEnter: (to,from,next) => {
    console.log('beforeRouteEnter ==', to,from)
    // 不!能!获取组件实例 `this`
    // 因为当钩子执行前,组件实例还没被创建
    next()
  },

  beforeRouteUpdate: (to,from,next) => {
    
    console.log('beforeRouteUpdate ==', to,from)
    
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    
    // 可以访问组件实例 `this`
    next()
  },

  beforeRouteLeave: (to,from,next) => {
    
    console.log('beforeRouteLeave ==', to,from)  // 可以访问组件实例 `this`
         //业务使用场景:
        //1.清除定时器
        //2.当页面中有未关闭的窗口, 或未保存的内容时, 阻止页面跳转
    next()
  },
    

2、这个时候,我们却可以触发beforeRouteUpdate这个生命周期,这样的话,我们是可以在这个组件路由钩子调用发起请求的方法的,我们这个生命周期是能拿到this的。

三、多级路由的嵌套

1、配置路由规则,使用children配置项:

    routes:[
        {
            path:'/about',
            name:'',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children:[
                {
                    path:'news',
                    component:News
                },
                {
                    path:'message',
                    component:Message
                }

            ]

        }

    ]
    

2、跳转的时候要写完整路径:

<router-link class="list-group-item" to="/home/news" active-class="active"></router-link>

四、路由守卫

1.全局守卫

    router.beforeEach((to, from, next) => {
    
     if (to.path == '/login') {
    
         if (sessionStorage.getItem("token")) {
    
            next("/")
    
         } else {
    
            next()
    
         }
    
     } else {
    
        if (sessionStorage.getItem("token")) {
    
             next()
    
         } else {
    
             next("/login")
         }
    
     }
    
 });

2.局部守卫(在需要守卫的页面添加(meta:{isLogin:true }));

 router.beforeEach((to, from, next) => {
    
     if (to.matched.some(v => { return v.meta.isLogin == true })) {
    
         if (sessionStorage.getItem('token')) {
    
            next()
    
         } else {
    
            next('/login')
    
         }
    
     } else {
    
         next()
    
     }
    
 })