vue 路由

什么是路由

自己理解路由
  • 简单地说,路由就是根据不同的url地址展示不同的页面和内容
  • 说起路由,最先想到的应该就是路由器,那么路由器的工作原理是什么呢?
  • 路由器的功能就是一个中转站,就是把网络中的包通过一个一个路由器到达转发的目的

实现原理:

就像一个人如果要去某个地方,一定要在他的脑海里有一张地图,在每个路由器的内部也有一张地图,这张地图就是路由表。

前端路由
  • 随着 ajax 的流行,异步数据请求交互运行在不刷新浏览器的情况下进行
  • 异步交互体验的更高级版本就是 SPA —— 单页应用
  • 单页应用不仅仅是在页面交互是无刷新的,连页面跳转都是无刷新的,为了实现单页应用,所以就有了前端路由
单页面应用 - SPA

单页面应用(SPA),通俗一点说就是指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入,单页面的页面跳转,仅刷新局部资源。

  • 优点
    • 用户体验好,快,内容的改变不需要重新加载整个页面,基于这一点spa对服务器压力较小
    • 前后端分离
  • 缺点
    • 初次加载时耗时多
    • 导航不可用,如果一定要导航需要自行实现前进、后退。(由于是单页面不能用浏览器的前进后退功能,所以需要自己建立堆栈管理)或使用hash模式
    • 不利于seo

在vue-cli3中使用vue-router

  • 比默认配置多的文件
    • views 存放页面
    • router.js 配置路由对象信息
  • routerjs中
export default new Router({
  routes: [
    {
      path: '/',  // 匹配的路由名称
      name: 'home',
      component: Home // 匹配上路由所显示的内容
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (about.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
    }
  ]
})

传参

查询字符串
<router-link to="/login?id=1"></router-link>

{
    path: "/login"
}
参数形式
<router-link to="/login/123"></router-link>
{
    path: "/login/:id"
}

路由守卫

  • 全局路由守卫
    • 写在main.js
    • router.beforeEach((to, from, next) => {})
    • 触发机制:只要有路由的跳转,都会触发全局路由守卫,所以,当需要被拦截的路由较多时,建议使用全局路由守卫
let arr = ["/home/my", "/home/cart"];// 这个数组存的是需要被拦截的路由
router.beforeEach((to, from, next) => {
  console.log("全局路由守卫被触发")
  let uid = localStorage.getItem("uid");
  if (arr.indexOf(to.path) != -1) {
    console.log("该路由需要被拦截")
    if (uid) {
      next()
    } else {
      next('/login')
    }
  } else {
    next()
  }
  // to 是一个对象,是你将要访问的路由的对象信息,我到哪里去
  // from 是一个对象,是你从哪里来
  // next之前就可以做一些验证判断,是否登录
  // 用户想看首页 => /home  
  // 我得先判断你是否已经登录过,如果没有登录,我就让你去登录页,如果已经登录
  // console.log(from)
  // if (to.path == '/home') {
  //   // 从本地存储拿出uid
  //   let uid = localStorage.getItem('uid');
  //   if (uid) {
  //     next()
  //   } else {
  //     next('/login')
  //   }
  // }
  // next app.use((req, res, next) => {next()})
  // 只有调用了next,你想to的那个页面才能被展示
  next()
})
  • 路由独享守卫
    • 只要想去该路由的时候,就会触发
    • 该路由守卫只属于某一路由
{
    path: "my/:id",
    component: () => import("@/views/my.vue"),
    beforeEnter: (to, from, next) => {
        console.log(to)
        console.log(from)
        // next之前又可以判断了
        let uid = localStorage.getItem("uid");
        if (uid) {
          next()
        } else {
          next('/login')
        }
        // next()
    }
}
  • 组件内的守卫
    • 只要组件被渲染到页面
    • beforeRouteEnter(to, from, next) {this不能访问}
    • beforeRouteUpdate(to, from, next) {当路由改变,但是组件没变}
    • beforeRouteLeave(to,from, next) {当要离开此路由的时候}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值