前言

什么是vue-router?

这里的路由并不是指我们平时所说的硬件路由器,这里的路由就是SPA(单页应用)的路径管理器。再通俗的说,vue-router就是WebApp的链接路径管理系统。
vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。路由模块的本质 就是建立起url和页面之间的映射关系
至于我们为啥不能用a标签,这是因为用Vue做的都是单页应用,就相当于只有一个主的index.html页面,所以你写的标签是不起作用的,你必须使用vue-router来进行管理。

vue-router实现原理

SPA(single page application):单一页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。单页面应用(SPA)的核心之一是: 更新视图而不重新请求页面;vue-router在实现单页面前端路由时,提供了两种方式:Hash模式和History模式;根据mode参数来决定采用哪一种方式。

1、Hash模式:

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。 hash(#)是URL 的锚点,代表的是网页中的一个位置,单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页,也就是说 #是用来指导浏览器动作的,对服务器端完全无用,HTTP请求中也不会不包括#;同时每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置;所以说Hash模式通过锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据

2、History模式:

由于hash模式会在url中自带#,如果不想要很丑的 hash,我们可以用路由的 history 模式,只需要在配置路由规则时,加入"mode: ‘history’",这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

//main.js文件中
const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

当你使用 history 模式时,URL 就像正常的 url,例如 http://yoursite.com/user/id,比较好看!
不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了。
所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

export const routes = [ 
  {path: "/", name: "homeLink", component:Home}

  {path: "/register", name: "registerLink", component: Register},

  {path: "/login", name: "loginLink", component: Login},

  {path: "*", redirect: "/"}]

此处就设置如果URL输入错误或者是URL 匹配不到任何静态资源,就自动跳到到Home页面

3、使用路由模块来实现页面跳转的方式

方式1:直接修改地址栏

方式2:this.$router.push(‘路由地址’)

方式3:<router-link to="路由地址"></router-link>

步入正题

前面我们已经了解了什么是vue-router和相关的使用方式,我们在实际的开发当中,如果我们的项目是动态网站的话,就需要我们进行用户权限判断以及相关的交互。

如果我们的项目是后台项目,在路由的设置当中我们的根路由不是登录页面,这样就会导致当用户访问到根的时候会加载出来根路由的页面,这样就算用户不知道这是一个什么网站,通过页面的第一次加载就已经泄露出来了,就可以略知一二。

而恰巧我们的主页面路由是/home,通过判断SessionStorage来判断是否含有token,使用this.rputer.push进行路由的跳转,熟悉前端开发的朋友们应该知道,页面的加载顺序是从上到下的,而js代码一般都是写在最下面的最后加载。这个时候我们就需要使用到路由重定向。这样当用户访问到根目录的时候就不会加载出来导致页面的跳转,影响C端用户的体验。下面是使用实例

var router = new VueRouter({
  routes:[
    // {path:'/', redirect:'跳转到的路由地址'}
    {path:'/', redirect:'/home'},
    {path:'/home', component:Home}
  ]
})

大概意思就是{path:‘路由地址A’, redirect:‘路由地址B’} // A 重定向执行 B,这样浏览器还没有加载页面就进行了页面跳转。

这是在router.js中的实例使用,在vue的页面布局中可以使用<router -link to = “” />来进行页面的跳转。

路由跳转的话我们也可以只用传参和不传参的两种方式,根据项目的合理使用。

*注意:vue中的redirect和nodejs中的redirect是两回事!