vue-router之路由守卫与路由模式

538 阅读2分钟

1.0 路由守卫-全局前置守卫

路由跳转之前, 会触发一个函数

语法:

router.beforeEach((to, from, next) => {})

  1. 在路由对象上使用固定方法beforeEach
// 场景: 当你要对路由权限判断时
// 语法: router.beforeEach((to, from, next)=>{//路由跳转"之前"先执行这里, 决定是否跳转})
// 参数1: 要跳转到的路由 (路由对象信息)    目标
// 参数2: 从哪里跳转的路由 (路由对象信息)  来源
// 参数3: 函数体 - next()才会让路由正常的跳转切换, next(false)在原地停留, next("强制修改到另一个路由路径上")
// 注意: 如果不调用next, 页面留在原地
​
// 例子: 判断用户是否登录, 是否决定去"我的音乐"/my
const isLogin = true; // 登录状态(未登录)
router.beforeEach((to, from, next) => {
  if (to.path === "/my" && isLogin === false) {
    alert("请登录")
    next(false) // 阻止路由跳转
  } else {
    next() // 正常放行
  }
})

总结: next()放行, next(false)留在原地不跳转路由, next(path路径)强制换成对应path路径跳转

2.0 全局后置守卫

路由跳转后, 触发的函数

语法:router.afterEach((to, from) => {})

router.afterEach((to, from) => {
    console.log(to);
    console.log(from);
    console.log("路由发生了跳转");
})

3.0路由模式设置

修改路由在地址栏的模式

路由的两种模式: hash模式 history模式

配置history模式:

const router = new VueRouter({
  routes,
  mode: "history" // 打包上线后需要后台支持
})

history和hash模式对比:

  1. 它们都实现页面的跳转功能一样(跳转页面)

  2. 它们的区别体现在3个方面

    • 外观:history模式的path路径不带#号,hash有#号
    • 原理:hash模式使用onhashchange , history使用pushState。导致有兼容性的差异。hash模式兼容性好(对浏览器的兼容性,onhashchange ),history的兼容性比hash模式差一些 (底层使用的API是Html5的API: ,对浏览器有一定的要求。 )
    • 项目上线之后有区别。history开发的项目,在打包上线之后,需要后端配置来支持,不然就会出现404页面。官网上有介绍。
  3. 我在开发中,没有特殊的要求,一般就用hash。如果要修改模式,就改mode: "history"

  4. 为啥会有404页面?

    • history访问这个地址时, www.xxx.com/find ,后端收到的 req.url 是 /find, 但是我们是单页应用程序,我们只有一个资源是index.html,没有资源叫/find,所有就会报404。
    • history访问这个地址时, www.xxx.com/#/find ,后端收到的 req.url 是 /, 有一个资源是index.html,能正常显示