下面整理根据官方文档以及自我理解整理,如有不足,请指教。

下面是来自一段官方的原话。

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

来一个简单的栗子

 1 js
2 // 引入vue
3 // 引入vue-router, 假如是模块化编程,需要Vue.use(VueRouter)来使用插件
4
5 // 1、引入组件,定义也可
6 import Bar from './Bar'
7
8
9
10
11 // 2、定义路由
12 const routes = [
13 {path: '/bar', component:Bar}
14 ]
15
16 // 3、创建一个router实例,然后传入routes
17
18 const router = new VueRouter({
19 router
20 })
21
22 // 4、创建跟实例并挂载
23 cosnt app = new Vue({
24 router
25 }).$mount('#app')

这样一个简单的路由就实现了,可以在vue的根实例就来访问路由。比如:this.$router,this.$route

this.$router: 表示用来访问路由器

this.$route: 表示当前路由

比如:this.$router.go(-1) 用来后退一步,而this.$route.params查看当前路由url的参数

这里的this.$router和上诉代码的router实例其实是一致的,如:也可以直接使用上面的router实例来进行操作,当然这样的话,就需要在每一个需要使用路由的地方来引入路由,这样的话略显麻烦。所以还是采取使用this.$router来使用的比较方便。

另一个概念:视图

视图:路由匹配到的组件讲渲染到改视图处,这往往很有用,比如将一个页面切分成很多区域,实际路由实际去刷新那一部分区域即可。

 1 <div class="app">
2 <p>
3 <!-- 使用 router-link 组件来导航. -->
4 <!-- 通过传入 `to` 属性指定链接. -->
5 <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
6 <router-link to="/bar">Go to Bar</router-link>
7 </p>
8 <!-- 路由出口 -->
9 <!-- 路由匹配到的组件将渲染在这里 -->
10 <router-view></router-view>
11 </div>

动态路由:上面的路由都是写死的,比如/bar,但实际业务可能不止这样,所以可以使用动态路由来进行匹配

 1 const City = {
2 template: '<div>城市名字: {{$route.params.cityname}}</div>'
3 }
4
5 const router = new VueRouter({
6 routes: [
7 // 动态路由的参数,由冒号开头表示
8 { path: '/city/:cityname', component: City}
9 ]
10 })
11
12 // 这样,当路由访问到/city/广州,这样模板中,就会渲染出城市的名字,所以可以用$route.params来获取动态参数。

动态路由是可以嵌套的。

如:/city/:cityname/select/:select_id, 这里就有两个动态路由了。对应的cityname和select_id的值都会设置到$route.params中。

通配符匹配:可以使用*来匹配任意路径,这往往是有用的,毕竟谁也不想用户直接看到404状态码。

 1 {
2 // 这样会匹配所有的路径
3 path: '*'
4 }
5
6 // 通配符的位置需要放置路由的最后。
7 // 这里因为路由匹配的规则是根据路由定义的先后来跳转的
8
9 // 所以下面这种是错误的,会一直匹配到*
10 cosnt error = {
11 template: '<div>嘿,这里不是你该来的</div>'
12 }
13
14 const routes = [
15 {
16 path: ‘*’,
17 component: error
18 },
19 {
20 // 正常路由
21 path: '/city‘,
22 component: xxx
23 }
24 ]
25

所有为了避免这种情况,还是把通配符放最后吧。

 1 // 这样就正常了
2 const routes = [
3 {
4 // 正常路由
5 path: '/city‘,
6 component: xxx
7 },
8 {
9 path: ‘*’,
10 component: error
11 }
12 ]

这里就关于路由的匹配优先级的问题,路由的优先级是根据定义的顺序来排的

在使用通配符的时候,$route.params会自动添加一个pathMatch的参数,包含着URL通过通配符的部分。

1 // 如果按照上诉的路由
2 this.$router.push(/cityname) // 由于没有该路由,所以匹配通配符
3 this.$route.params.pathMatch // ’cityname‘

嵌套路由:嵌套路由属于经常通用的情况,毕竟/aaa显示一个组件,/aaa/bbb显示是另一个组件,所以嵌套来使路由便于管理

 1 const router = new VueRouter({
2 routes: [
3 { path: /city/:id, component: City,
4 children: [{
5 // 当路由进入 /city/:id/post 匹配成功
6 // 注意这里不能写/post,这样会直接匹配到根路由,也就失去了嵌套路由的意义
7 path: 'post',
8 component;CityPost
9 }]
10 }
11 ]
12 })
13
14 // 嵌套路由使用children作为子级的路由,这样可以嵌套多层路由,子子孙孙孙孙孙无穷尽

编程式内容

导航路由的时候,我们可以使用<router-link :to="xxx">来渲染成a标签来进行导航,可以使用this.$router的方法进行导航。

router的方法是效仿 window.history的api

router.push(location, onComplete, onAbort)

--location(路由地址)是必选的,其他两个是回调方法,在新版本中,会直接返回一个promise,直接.then来进行回调就可

// 推入路由来显示,vue-router的路由模式应该是根据栈来设计的(不知道,瞎讲的,没看过源码)

// 打脸了,还真是栈,不过是history栈,这个方法会向history栈,推入一条记录。

所以<router-link :to=“xxx”>和router.push(“xxx”) 是一样的。

--location: 这个参数可以是一个字符串路径,也可以是一个对象

 1 // 字符串
2 router.push(’city‘)
3
4 // 对象
5 router.push({path: 'ciry'})
6
7 // 命名路由, 相当于给路由定义一个名字,需要在路由那边使用name来定义
8 router.push({name: 'user', params: {userId: '123'}})
9 // 这里为什么使用path呢,由于使用path的话,params会被忽略掉,因为参数本来就是路径的一部分,所以要写满带参数的路径
10 // 如:
11 router.push({ path: `/user/${userId}` })
12
13
14
15 // 带查询参数,变成 /register?plan=private
16 router.push({ path: 'register', query: { plan: 'private' }})

router.replace(location, oncomplete, onAbort)

参数上同,不同点,在于不会像history添加新纪录,而是替换掉

<router-link :to="" replace>  // 声明式

router.go(n)

--n是一个整数,用来表示在history中前进或者后退几步,和window.history.go(n)原理,超出记录的长度则失败

命名路由:通过来个路由起一个别名来进行访问

 1 // 上诉代码块中,使用名字,是需要像下面这样使用name来定义就可
2 const router = new VueRouter({
3 routes: [
4 {
5 path: '/user/:userId',
6 name: 'user',
7 component: User
8 }
9 ]
10 })

命令视图:视图时路由的出口,组件渲染在这里,但是视图可以有多个,来渲染多个组件.

router-view中使用name属性来定义,默认不填为default

路由配置时,使用components来配置(需要添加s)

 1 const router = new VueRouter({
2 routes: [
3 {
4 path: '/',
5 components: {
6 default: Foo,
7 a: Bar,
8 b: Baz
9 }
10 }
11 ]
12 })

重定向:重新定位到另一个位置,在路由配置中使用redirect:'路径xxx'来声明

vue-router入门随笔的更多相关文章

  1. Vue Router的入门以及简单使用

    Vue Router 是Vue官方的路由管理器,是Vue用来实现SPA的插件.它和 Vue.js 的核心深度集成,让构建单页面应用(SPA)变得易如反掌. 基本概念: 路由:是一种映射关系,是 “pa ...

  2. vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)

    前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...

  3. vue框架入门和ES6介绍

    vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...

  4. VUE从入门到放弃(项目全流程)————VUE

    VUE从入门到放弃(第一天)--整体流程 先想想一个项目,vue项目是从什么到什么,然后再什么的?那是什么呢? 搭建 ( vue-cli) 代码内容 运行 封装 成品 一.搭建(脚手架vue-cli) ...

  5. vue.js入门语法

    1.入门 <div id="vue_det"> <h1>site : {{site}}</h1> //两个大括号显示参数 <h1>u ...

  6. Vue CLi3入门

    摘自:https://www.jianshu.com/p/cf9b56efd3b8 Vue CLi3入门 12018.11.15 14:16:17字数 1222阅读 8895 地址 Vue CLi3 ...

  7. Vue项目入门实例

    前言 本文记录Vue2.x + Element-UI + TypeScript语法入门实例 为什么要用TypeScript? 1.TypeScript是JavaScript的超集,利用es6语法,实现 ...

  8. vue 快速入门 系列 —— vue loader 扩展

    其他章节请看: vue 快速入门 系列 vue loader 扩展 在vue loader一文中,我们学会了从零搭建一个简单的,用于单文件组件开发的脚手架.本篇将在此基础上继续引入一些常用的库:vue ...

  9. vue 快速入门 系列 —— vue-cli 上

    其他章节请看: vue 快速入门 系列 Vue CLI 4.x 上 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...

  10. vue 快速入门 系列 —— vue-cli 下

    其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...

随机推荐

  1. MySQL的共享锁阻塞会话案例浅析输入日志标题

        这是问题是一个网友遇到的问题:一个UPDATE语句产生的共享锁阻塞了其他会话的案例,对于这个案例,我进一步分析.总结和衍化了相关问题.下面分析如有不对的地方,敬请指正.下面是初始化环境和数据的 ...

  2. 二分类问题 - 【老鱼学tensorflow2】

    什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...

  3. 《Java从入门到失业》第四章:类和对象(4.5):包

    4.5包 前面我们已经听过包(package)这个概念了,比如String类在java.lang包下,Arrays类在java.util包下.那么为什么要引入包的概念呢?我们思考一个问题:java类库 ...

  4. Spring学习(五)--Spring的IOC

    1.BeanDefinition在IOC的注册 当BeanDefinition完成载入和解析之后,用户定义的BeanDefinition在IOC容器中已经建立自己的数据结构和数据表示,但是无法使用,需 ...

  5. Centos-shell-特殊字符

    shell 通配符 # 注意完全不同于正则,类似正则 * 任意至少一个字符 ? 任意一个字符 []   []中任意一个字符,相关字符集a-z A-Z 0-9 shell 重定向 # 重新指定系统标准输 ...

  6. MarkDown系列教程

    编辑了一个Markdown的系列教程,前一部分是摘编自 菜鸟教程 网站 目录 第一篇 Markdown 使用教程 入门

  7. Windows控件的属性与事件

    Treeview控件重要属性和事件 属性 说明 Nodes Treeview控件中所有树节点 SelectdNode 当前Treeview控件中选定的树节点,如果当前没有选定树节点,返回值为null ...

  8. 008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字

    008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字 关键字 关键字就是一些有特殊意义的词 之前学习的程序中涉及到的关键字 Java中 ...

  9. C++extern关键字理解

    extern是一种"外部声明"的关键字,字面意思就是在此处声明某种变量或函数,在外部定义. 下面的示意图是我的理解. extern关键字的主要作用是扩大变量/函数的作用域,使得其它 ...

  10. C#实现——十大排序算法之选择排序

    选择排序法 1.工作原理(算法思路) 给定一个待排序数组,找到数组中最小的那个元素 如果最小元素不是待排序数组的第一个元素,则将其和第一个元素互换 在剩下的元素中,重复1.2过程,直到排序完成. 2. ...