vue路由router和路由守卫

542 阅读4分钟

安装

vue-cil脚手架安装了router

在router/index.js里

import Vue from 'vue'   //引入Vue
import Router from 'vue-router'  //引入vue-router
import Hello from '@/components/Hello' 在引入需要路由的页面
Vue.use(Router)  //Vue全局使用Router

再导出

export default new Router({
  routes: [              //配置路由,这里是个数组
    {                    //每一个链接都是一个对象
      path: '/',         //链接路径
      name: 'Hello',     //路由名称,
      component: Hello   //对应的组件模板
    },{
      path:'/hi',
      component:Hi,
      children:[        //子路由,嵌套路由 (此处偷个懒,免得单独再列一点)
        {path:'/',component:Hi},
        {path:'hi1',component:Hi1},
        {path:'hi2',component:Hi2},
      ]
    }
  ]

router-link和**router-view **

1.router-link 是一个组件,它默认会被渲染成一个带有链接的a标签,通过to属性指定链接地址。

注意:被选中的router-link将自动添加一个class属性值.router-link-active。

<router-link to="/">[text]</router-link>

2.router-view 用于渲染匹配到的组件。

3.keep-alive可以缓存数据 保存DOM操作

动态路由匹配,调用router的map方法映射路由

vue-router参数传递

1.用name传值(不推荐)

在路由里面配置

router:[{
	path:'/',
	name:'hello'
}]

在app.vue用$router.name

{{$router.name}}

2.通过 标签中的to传参

<router-link :to="{name:‘dxl’,params:{key:value}}">东西里</router-link>

3.用url传参

 :冒号的形式传递参数

(1).在router路由配置文件里以冒号的形式设置参数

{
    path:'/params/:newsId/:userName,
    component:Params
}
    <p>新闻ID:{{ $route.params.newsId}}</p>
    <p>用户名:{{ $route.params.userName}}</p>

(2).标签path路径中传值

其他方法有很多,但感觉用不到。

路由重定向

const routes = [
  { path: '/', redirect: '/goods'}
]

重定向的目标也可以是一个命名的路由

const routes = [
  { path: '/', redirect: { name: 'goods' }}
]

重定向时也可以传递参数

{
  path:'/',
  redirect:'/goods/:newsId(\\d+)/:userName'
}

alias别名

1.首先我们在路由配置文件里给路径起一个别名,dxl。

alias:'/dxl'

2.配置我们的,起过别名之后,可以直接使用标签里的to属性,进行重新定向。

<router-link to="/dxl">jspang</router-link>

重定向和别名的区别

redirect:仔细观察URL,redirect是直接改变了url的值,把url变成了真实的path路径。

alias:URL路径没有别改变,这种情况更友好,让用户知道自己访问的路径,只是改变了中的内容。

编程式导航

1.router.push( )

router.push方法就是用来动态导航到不同的链接的,这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。

当你点击 时,这个方法会在内部调用,所以说,点击 等同于调用 router.push(...)。

2.router.replace( )

router.replace跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。 

3.router.go(n) 类似 window.history.go(n)。

<script>
export default {
  name: 'app',
  methods:{
    goback(){
      this.$router.go(-1);
    },
    goHome(){
      this.$router.push('/');
    }
  }
}
</script>

路由中的钩子

1.路由配置文件中的钩子函数:

beforeEnter,就是在进入此路由配置时

三个参数:

to:路由将要跳转的路径信息,信息是包含在对像里边的。

from:路径跳转前的路径信息,也是一个对象的形式。

next:路由的控制参数,常用的有next(true)和next(false)。

2.写在模板中的钩子函数:

beforeRouteEnter:在路由进入前的钩子函数。

beforeRouteLeave:在路由离开前的钩子函数。

History 模式  mode:history

路由守卫

导航守卫其实也是路由守卫,也可以是路由拦截,我们可以通过路由拦截,来判断用户是否登录,该页面用户是否有权限浏览,需要结合meta来实现

一、全局路由守卫

router.beforeEach((to, from, next) => {
    console.log(to) => // 到哪个页面去?
    console.log(from) => // 从哪个页面来?
    next() => // 一个回调函数
}
router.afterEach(to,from) = {}

next():回调函数参数配置

next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址 

next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项

二、组件路由守卫

// 跟methods: {}等同级别书写,组件路由守卫是写在每个单独的vue文件里面的路由
守卫
beforeRouteEnter (to, from, next) {
    // 注意,在路由进入之前,组件实例还未渲染,所以无法获取this实例,只能通
过vm来访问组件实例
    next(vm => {})
}
beforeRouteUpdate (to, from, next) {
    // 同一页面,刷新不同数据时调用,
}
beforeRouteLeave (to, from, next) {
    // 离开当前路由页面时调用
}

三、路由独享守卫

路由独享守卫是在路由配置页面单独给路由配置的一个守卫

export default new VueRouter({
    routes: [
        {
            path: '/',
            name: 'home',
            component: 'Home',
            beforeEnter: (to, from, next) => {
               // ...
            }
        }
    ]
})