vue-router入门随笔
下面整理根据官方文档以及自我理解整理,如有不足,请指教。
下面是来自一段官方的原话。
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入门随笔的更多相关文章
- Vue Router的入门以及简单使用
Vue Router 是Vue官方的路由管理器,是Vue用来实现SPA的插件.它和 Vue.js 的核心深度集成,让构建单页面应用(SPA)变得易如反掌. 基本概念: 路由:是一种映射关系,是 “pa ...
- vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)
前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...
- vue框架入门和ES6介绍
vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...
- VUE从入门到放弃(项目全流程)————VUE
VUE从入门到放弃(第一天)--整体流程 先想想一个项目,vue项目是从什么到什么,然后再什么的?那是什么呢? 搭建 ( vue-cli) 代码内容 运行 封装 成品 一.搭建(脚手架vue-cli) ...
- vue.js入门语法
1.入门 <div id="vue_det"> <h1>site : {{site}}</h1> //两个大括号显示参数 <h1>u ...
- Vue CLi3入门
摘自:https://www.jianshu.com/p/cf9b56efd3b8 Vue CLi3入门 12018.11.15 14:16:17字数 1222阅读 8895 地址 Vue CLi3 ...
- Vue项目入门实例
前言 本文记录Vue2.x + Element-UI + TypeScript语法入门实例 为什么要用TypeScript? 1.TypeScript是JavaScript的超集,利用es6语法,实现 ...
- vue 快速入门 系列 —— vue loader 扩展
其他章节请看: vue 快速入门 系列 vue loader 扩展 在vue loader一文中,我们学会了从零搭建一个简单的,用于单文件组件开发的脚手架.本篇将在此基础上继续引入一些常用的库:vue ...
- vue 快速入门 系列 —— vue-cli 上
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 上 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- vue 快速入门 系列 —— vue-cli 下
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
随机推荐
- MySQL的共享锁阻塞会话案例浅析输入日志标题
这是问题是一个网友遇到的问题:一个UPDATE语句产生的共享锁阻塞了其他会话的案例,对于这个案例,我进一步分析.总结和衍化了相关问题.下面分析如有不对的地方,敬请指正.下面是初始化环境和数据的 ...
- 二分类问题 - 【老鱼学tensorflow2】
什么是二分类问题? 二分类问题就是最终的结果只有好或坏这样的一个输出. 比如,这是好的,那是坏的.这个就是二分类的问题. 我们以一个电影评论作为例子来进行.我们对某部电影评论的文字内容为好评和差评. ...
- 《Java从入门到失业》第四章:类和对象(4.5):包
4.5包 前面我们已经听过包(package)这个概念了,比如String类在java.lang包下,Arrays类在java.util包下.那么为什么要引入包的概念呢?我们思考一个问题:java类库 ...
- Spring学习(五)--Spring的IOC
1.BeanDefinition在IOC的注册 当BeanDefinition完成载入和解析之后,用户定义的BeanDefinition在IOC容器中已经建立自己的数据结构和数据表示,但是无法使用,需 ...
- Centos-shell-特殊字符
shell 通配符 # 注意完全不同于正则,类似正则 * 任意至少一个字符 ? 任意一个字符 [] []中任意一个字符,相关字符集a-z A-Z 0-9 shell 重定向 # 重新指定系统标准输 ...
- MarkDown系列教程
编辑了一个Markdown的系列教程,前一部分是摘编自 菜鸟教程 网站 目录 第一篇 Markdown 使用教程 入门
- Windows控件的属性与事件
Treeview控件重要属性和事件 属性 说明 Nodes Treeview控件中所有树节点 SelectdNode 当前Treeview控件中选定的树节点,如果当前没有选定树节点,返回值为null ...
- 008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字
008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字 关键字 关键字就是一些有特殊意义的词 之前学习的程序中涉及到的关键字 Java中 ...
- C++extern关键字理解
extern是一种"外部声明"的关键字,字面意思就是在此处声明某种变量或函数,在外部定义. 下面的示意图是我的理解. extern关键字的主要作用是扩大变量/函数的作用域,使得其它 ...
- C#实现——十大排序算法之选择排序
选择排序法 1.工作原理(算法思路) 给定一个待排序数组,找到数组中最小的那个元素 如果最小元素不是待排序数组的第一个元素,则将其和第一个元素互换 在剩下的元素中,重复1.2过程,直到排序完成. 2. ...