1、vue-router

  • 安装方式
    1. npm/cnpm:(个人偏向于cnpm)

      npm/cnpm  install vue-router --save-dev 
    2. bower:
      bower install vue-router --save-dev
    3. 手动编译:省略
  • 基本使用

    • 概念:

      后端路由:根据不同的url返回不同的内容(node)
      前端路由:根据不同的hash返回不同的组件(Vue生成的项目叫做单页应用(SPA),单页面应用的特点就是可以在改变URL不重新请求页面的情况下更新页面视图。)
    • 类型:
      一、经常使用,无兼容性问题的方式hash
      二、history方式
           history.pushState(stateObj,'page2','2.html');----页面重新加载了吗?为什么
      url地址栏发生变化,显示为2.html,但并不会跳转到2.html页面上,也不会检查这个路径是否存在,它只是成为浏览历史中的最新记录,假定你访问了google.com,然后点击了倒退按钮,页面的url将显示为2.html,但是内容还是原来的1.html,再点击一次,url变为1.html,内容不变,总之,这个方法不会触发页面刷新,只会导致history对象发生变化,地址栏会有反应
      三、node下的默认实现方式abstract
      import Vue from 'vue' 在router文件下的index.js文件中
      import Router from 'vue-router'
      import { routes } from './router' 在router文件下的router.js文件中定义路由
      Vue.use(Router)//注册 // 路由配置
      const RouterConfig = {
      // mode: 'history',
      routes,
      };
    • 路由的重定向:
      redirect: { path: '/zh-CN/login' },
    • 错误路由的匹配(如任意路径或者 404 Not Found)
      {
      path: '**', // 错误路由,使用通配符,并且此路由应该放到最后
      redirect: { path: '/zh-CN/login' },//重定向
      }
    • 路由元信息:路由中的meta字段;
    • 路由视图:
      <router-view></router-view>相当于一个占位符,匹配到的组件展示到其中去
    • 路由导航:
      • 使用<router-link> 创建 a 标签来定义导航链接

        <router-link to="/path"  tag="">标签</router-link>
        默认渲染为一个a标签,通过tag属性可以改变标签,仍然可以跳转
      • 使用 router.push 方法(编程式导航)
        一、跳转
        1、this.$router.push('/list/' + type);
        2、this.$router.push({path : '/list/' + type})
        3、this.$router.push({//常用
        name: "list",
        params: {
        a: a,
        b: b,
        c: c
        },
        query: {//查询参数
        reason: 'reason',
        },
        }); 跳转之后进行取值
        this.$route.params.a /list/a/b/c
        this.$route.query.reson /list?reason = reason 二、替换
        this.$router.replace(‘/home’)
        前进后退按钮失效,清除路由跳转的历史记录 三、前进
        this.$router.go(1) === window.history.forward() 四、后退
        this.$router.go(-1) === window.history.back()
    • 在vue组件中的使用:
      • 建立router文件夹,里面建立index.js与router.js,引入文件夹时会自动寻找index文件
      • router.js的文件代码是:
        import title from '../config/title.config'
        const titleConfig = title['zh-CN']
        const rootRouter = {
        path: '/',
        redirect: { path: '/zh-CN/login' },
        meta: {},
        } // 首页
        const homeRoute = {
        path: '/:language(zh-CN|en-US)/home',
        name: 'home',
        component: () =>
        import('../views/home.vue'),
        meta: {
        title: `${titleConfig.home}`
        },
        }
        // 登录页
        const loginRoute = {
        path: '/:language(zh-CN|en-US)/login',
        name: 'login',
        component: () =>
        import('../views/login/login.vue'),
        meta: {
        title: `${titleConfig.login}`
        },
        } // 个人中心首页
        const userHomeRoute = {
        path: '/:language(zh-CN|en-US)/userHome',
        name: 'userHome',
        component: () =>
        import('../views/user/userHome.vue'),
        meta: {
        title: `${titleConfig.home}`
        },
        redirect: { path: '/zh-CN/userHome/userInfo' },
        children: [{
        path: 'userInfo',
        name: 'userInfo',
        component: () =>
        import('../views/user/userInfo.vue'),
        meta: {
        title: `${titleConfig.userInfo}`
        }
        }, {
        path: 'myCollection',
        name: 'myCollection',
        component: () =>
        import('../views/user/myCollection.vue'),
        meta: {
        title: `${titleConfig.myCollection}`
        }
        }, {
        path: 'message',
        name: 'message',
        component: () =>
        import('../views/user/message.vue'),
        meta: {
        title: `${titleConfig.message}`
        }
        },]
        } // 商品详情页面
        const goodsInfoRoute = {
        path: '/:language(zh-CN|en-US)/goodsInfo/:id/:booksPrice',
        name: 'goodsInfo',
        component: () =>
        import('../views/goodsInfo/index.vue'),
        meta: {
        title: `${titleConfig.goodsInfo}`
        },
        } // 所有路由
        export const routes = [
        rootRouter,
        homeRoute,
        loginRoute,
        userHomeRoute,
        goodsInfoRoute ,
        ]
      • index.js的文件代码是:
        import Vue from 'vue'
        import Router from 'vue-router'
        import { routes } from './router'
        Vue.use(Router) // 路由配置
        const RouterConfig = {
        // mode: 'history',
        routes,
        }; export const router = new Router(RouterConfig) router.beforeEach((to, from, next) => {
        if (to.meta.title) document.title = to.meta.title
        next()
        }) router.afterEach((to, from) => {
        })
  • 导航守卫
    • 官网https://router.vuejs.org/zh/guide/advanced
    • 全局前置守卫
      router.beforeEach((to, from, next) => {
      if (to.meta.title) document.title = to.meta.title
      next()
      }) 注解:
      to: 即将要进入的目标(当前导航即将要去的路由)
      from: 当前导航正要离开的路由
      next: 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
    • 全局后置钩子
      router.afterEach((to, from) => {
      
      })
      
      注解: 不接受next函数也不改变导航本身
    • 路由独享的守卫
      可以在路由配置上直接定义-----在执行之前可以执行一个钩子函数,通过验证next,否则显示警告信息
      routes: [
      {
      path: '/foo',
      component: Foo,
      beforeEnter : (to,from,next)=>{//next才可以进来 进入之前进行的判断
      if(sessionStorage.getItem("user")){
      next();
      }else{
      alert("您还没有登录")
      }
      })
      }
    • 组件内的守卫
      beforeRouteEnter (to,from,next) {
      next(vm => { // 通过 `vm` 访问组件实例 })
      }
      注解:
      1、执行比beforeCreate早
      2、在渲染该组件的对应路由被 confirm 前调用
      3、不!能!获取组件实例 `this`
      4、 因为当守卫执行前,组件实例还没被创建 beforeRouteUpdate (to,from,next) {//详情页面 }) 注解:
      1、在当前路由改变,但是该组件被复用时调用
      2、举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
      3、 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
      4、可以访问组件实例 `this` beforeRouteLeave (to, from , next) {
      const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
      if (answer) {
      next()
      } else {
      next(false)
      }
      }) 注解:
      1、这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。
      2、导航离开该组件的对应路由时调用
      3、可以访问组件实例 `this`
  • 路由懒加载
    • 定义:懒加载也叫延迟加载,即在需要的时候进行加载,随用随载;
    • 单页面开发:

      优点:用户的体验性好,无需跳转;
      缺点:像vue这种单页面应用,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出现长时间的白屏,
      而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载时间,简单来讲,就是进
      入首页不用一次加载过多资源造成用时过长
      (面试题:单页面开发有什么问题/用户项目打包完毕后出现短暂白屏,如何解决)
    • 用法:
      1、
      const homeRoute = {
      path: '/:language(zh-CN|en-US)/home',
      name: 'home',
      component: () =>
      import('../views/home.vue'),
      meta: {
      title: `${titleConfig.home}`
      },
      } 2、
      const homeRoute = {
      path: '/:language(zh-CN|en-US)/home',
      name: 'home',
      component: resolve =>
      require(['../views/home.vue'],resolve)
      meta: {
      title: `${titleConfig.home}`
      },
      }

简述Vue的路由与视图的更多相关文章

  1. Vue路由-命名视图实现经典布局

    Vue路由-命名视图实现经典布局 相关Html: <!DOCTYPE html> <html lang="en"> <head> <met ...

  2. Vue Router 路由实现原理

    一.概念 通过改变 URL,在不重新请求页面的情况下,更新页面视图. 二.实现方式 更新视图但不重新请求页面,是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有2种方式: 1.Hash  ...

  3. vue的路由安全验证

    在传统的网页中: view层是由后端控制的,用户的请求到达后端的控制器中,只有当安安全全没有丝毫异常的情况下,后端才会将完成数据的渲染,返回给前端视图 前后端分离的项目: view层的切换权,转交给了 ...

  4. Vue之路由

    1. SPA是什么 单页Web应用(single page application,SPA),就是只有一个Web页面的应用, 是加载单个HTML页面,并在用户与应用程序交互时动态更新该页面的Web应用 ...

  5. Vue(十)---路由

    Vue.js 路由允许我们通过不同的 URL 访问不同的内容.通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA). 需要引入vue-r ...

  6. [VUE]关于路由哪些事儿

    什么是路由 之前有个小伙伴面试被问到:面试官:不用vue能不能写单页面应用?答:用angular啊(咳咳,开个玩笑),答案确实是可以的,原生js中有个事件叫做onhashchange,可以在windo ...

  7. Vue 路由懒加载, VueRouter一步完成Vue的路由懒加载 一行代码搞定懒加载

    Vue Router路由配置中的component里面配置即可 1 // 路由懒加载的方式加载组件 2 3 component: () => import('@/views/Detail'), ...

  8. vue(5)—— vue的路由插件—vue-router 常用属性方法

    前端路由 看到这里可能有朋友有疑惑了,前端也有路由吗?这些难道不应该是在后端部分操作的吗?确实是这样,但是现在前后端分离后,加上现在的前端框架的实用性,为的就是均衡前后端的工作量,所以在前端也有了路由 ...

  9. vue父路由默认选中第一个子路由,切换子路由让父路由高亮不会消失

    vue父路由默认选中第一个子路由,切换子路由让父路由高亮不会消失 正常默认会有 .router-active-class 识别高亮 达到以上注意: 1. exact 不要加 注意是不要加,exact ...

随机推荐

  1. bootstrap-table.min.js不同版本返回分页参数不同的问题

    1.使用公司用的bootstrap-table.min.js ,刚开始bootstrap-table分页参数是这么写的 分页查询参数: 后端代码为: Result返回类的参数为list,以及total ...

  2. Quartz(二)

    1 SchedulerFactory 1.1 概述 Quartz是以模块的方式构建的,因为,要使它运行,几个组件必须很好的组合在一起.非常幸运的是,已经有了一些现存的助手可以完成这些工作. 所有Sch ...

  3. 5G技术被夸大?专家来测试一下

    像大多数新技术一样,5G也带来了大量媒体宣传.这种炒作中有些伴随着事实的严重扭曲和5G技术实际功能的放大.但是,有一个普遍共识的说法是5G将实现“极速”,换句话说,与前几代产品相比,带宽要高得多. 这 ...

  4. Docker(2)--Centos7 上安装部署

    Centos7 上安装docker Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比 ...

  5. Linux入门培训教程 常见linux命令释义

    快到中午吃饭了,然后忽然想起来samba里面没有添加用户.于是乎,就玩弄起了samba. Samba三下五除二就安装好了,想想window里面不断的点击下一步,还要小心提防各种隐藏再角落里的绑定软件. ...

  6. UVa 572 Oil Deposits (Floodfill && DFS)

    题意 :输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横竖以及对角方向),就是说它们属于同一个八连块. 分析 :可以考虑种子填充深搜的方法.两重for循 ...

  7. sublime安装完插件后出现的一些问题

    1.安装anaconda后代码前面出现小方框 解决办法:这是由于不符合PEP8代码规范,在空白地方右击,选择anaconda --> autoformat PEP8 Errors ,同时保证导入 ...

  8. 【python学习之五】自定义函数实现用 Python 发送电子邮件

    前言 之前论坛里有人发过关于发送邮件的帖子,设计器也有关于发送邮件的控件.我这里再次重复,希望能有帮到大家的地方. 信息准备 发送邮件前必须准备好一些基本信息,例如发件人邮箱地址.发件人邮箱密码.收件 ...

  9. CentOS查看进程端口号以及kill操作

    查看端口: 使用 netstat   -anp   |   grep  8090即:netstat –apn | grep  8090 查看进程:1.ps 命令用于查看当前正在运行的进程,grep 是 ...

  10. sqli-labs(24)

    0x1 前言 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 .二次注入不是注入两次的意思,请不要混淆 0x2 什么是二阶注入 二阶注入是指客通过构造数据的形式,在浏览器或者 ...