vue-router实现原理及简易demo
自定义路由demo,git地址: git@github.com:xsk-walter/Vue-router.git
一、router基本使用
① 创建和路由相关的组件
②Vue.use(vueRouter)注册插件
③创建路由对象,此时配置路由规则
④注册router对象,vue实例时,选项里配置创建好的router对象
⑤通过router-view,设置占位,路径匹配成功后,组件替换掉占位,router-link创建一些链接
二、Hash和History模式的区别
表现形式
原理:①Hash基于锚点,以及onhashchange事件②History模式是基于HTML5中的History API
- history.pushState()\history.replaceState()
history模式需要服务器支持:在服务端应该除了静态资源外都返回单元应用的index.html
三、VueRouter原理
Hash模式
#号后的内容作为路径,可以通过location.url改变,如果只是#号后内容改变,不像服务器端发送请求,但会存储到历史记录里,监听hashchange事件,根据当前路由地址找到对应组件重新渲染
History模式
- 通过history.pushState()方法改变地址栏,并把当前地址存储到访问历史中,不向服务发送请求,监听popstate事件,可以得到浏览器的变化,pushstate和replacestate不会触发该事件,当点击浏览器前进和后退按钮时触发或者back和forward方法时。
- 当地址改变之后,根据当前地址找到对应组件重新渲染。
四、类图
类名 VueRouter
属性 options\data\routeMap
方法
①Constructor(options):VueRouter
②_install(Vue):void
③init():void => initEvent():void 、createRouteMap(): void 、initComponents(Vue):void
五、Vue的构建版本
- 运行时版本:不支持template模板,需要打包的时候提前编译
- 完整版:包含运行时和编译器,程序运行时把模板转换成render函数
Vue-Router
一、普通、动态路由传参方式
// 路由代码传参
import About from 'about'
// routes 配置
{
path: '/about/:id', // 动态路由
component: About,
props: true // ①布尔模式
}
{
path: '/about', // 普通路由
component: 'About',
props: { id: 19 } // ②对象模式
}
// 接收方式 props
props;['id'] 或者
props: {
id: { type: Number, default: 12}
}
// ③函数模式
routes:[
{
path: '/about',
component: About,
// props: route => ({id:route.query.id}) // url='/about?id="89"' 或者
props: route => ({id: route.params.id}) // url='/about/:id' => '/about/89'
}
]
二、动态路由:将给定匹配模式的路由映射到同一个组件,复用一个组件,相对与销毁后重建更高效。
Keep-alive包括时,组件的声明周期钩子函数不会被重复调用。
要对同一个组件中参数变化做出响应的话,可以通过watch 侦听$route对象上的任意属性
watch: {
$route: {
immediate: true,
handler(route) {
// 处理事件 对路由变化做出响应
}
}
}
或者使用导航守卫,beforeRouteUpdate,也可以取消导航
三、捕获所有路由或404路由
四、路由的匹配语法
自定义正则 像可以区分 /list/100 和/list/xsk 等路由
- routes: [ { path: '/list/:id(\\d+)'}, {path: '/list/:name'} ]
可以重复的参数 匹配多个部分的路由,可以用 * 号和 +号将参数标记为重复
也可通过使用?号修饰符(0个或1个)将一个参数标记为可选
五、嵌套路由、命名路由
六、编程式导航
声明式()\编程式路由 router.push(...)
Router.push(params):
Params: 字符串路径、路径对象、命名的路由并加上参数、带查询参数、带hash
'/users/detail'
{ path: '/users/detail' }
{ name: 'detail', params: {id: '0'}}
{ path: '/users/detail', query: {id: '0'} }
替换当前位置 router.replace({path: '/users'}) 或者router.push({path:'users', replace: true}); 导航时不会向history添加记录
history.go()横跨历史
七、命名视图:
八、重定向配置
// 通过routes配置来完成
const routes = [{ path: '/home', redirect: '/'}]
// 重定向的目标也可以是一个命名的路由 redirect: { name: 'Details'}
// 一个方法动态返回重定向目标
const routes = [
{
path: '/home/:id',
redirect: to => {
return {path:'Details', query: { q: to.params.searchText}}
}
}
]
// 别名
alias: '/home'
九、路由组件传参 props、$route.query$route.params
布尔模式 routes配置时 props:true设置即可
对象模式 props: { id: '0' } 当props为静态的时候很有用
函数模式 创建一个返回props的函数,允许你将参数转换为其他类型,将静态值与基于路由的值相结合等操作
props: route => ({ query: route.query.id })
props: route => ({ params: route.params.id})
对于命名视图的路由,必须为每个命名视图定义props配置
const routes = [{
path: '/home',
components: { default: Home, sidebar: Sidebar},
props: { default: true, sidebar: true}
}]
十、不同的历史模式
- Hash模式:history: createWebHashHistory() SEO受影响
- HTML5模式:history:createWbeHistory() 如果没有适当的服务器配置,就会404,需要在服务器上添加一个简单的回退路由
进阶
一、导航守卫:vue-router提供的主要是通过跳转或取消的方式守卫导航。
方式:全局、单个路由独享、组件
全局前置守卫:beforeEnter:
- 每个守卫都接收两个__参数__:to\from\next(可选)
- 返回值 ①false:取消当前导航、②一个路由地址:通过一个路由地址跳转到不同的地址,类似于router.push()可配置,当前的 导航被中断然后进行一个新的导航。
- next可选参数
全局后置守卫:afterEach 不接受next函数也不会改变导航本身
全局解析守卫:beforeResolve
路由独享守卫:在routes中配置
组件内的守卫 可用配置API:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave
beforeRouteEnter:唯一可传递next回调守卫;解决不可访问this;
next()里的内容执行时机在组件mounted周期之前;
beforeRouteUpdate: 该组件复用时被调用
vue-router实现原理及简易demo的更多相关文章
- 「进阶篇」Vue Router 核心原理解析
前言 此篇为进阶篇,希望读者有 Vue.js,Vue Router 的使用经验,并对 Vue.js 核心原理有简单了解: 不会大篇幅手撕源码,会贴最核心的源码,对应的官方仓库源码地址会放到超上,可以配 ...
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
- Vue Router的原理及history模式源码实现
Hash 模式 URL中 # 后面的内容作为路径地址,可以通过location.url直接切换路由地址,如果只改变了#后面的内容,浏览器不会向服务器请求这个地址,会把这个地址 记录到浏览器的访问历史中 ...
- vue双向绑定原理分析
当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理. 简易vue源码地址:https://github.com/jiangzhenf ...
- [Vue源码]一起来学Vue双向绑定原理-数据劫持和发布订阅
有一段时间没有更新技术博文了,因为这段时间埋下头来看Vue源码了.本文我们一起通过学习双向绑定原理来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫 ...
- 06 Vue路由简介,原理,实现及嵌套路由,动态路由
路由概念 路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源. 那么url地址和真实的资源之间就有一种对应的关系,就是路由. 路 ...
- vue router.push(),router.replace(),router.go()和router.replace后需要返回两次的问题
转载:https://www.cnblogs.com/lwwen/p/7245083.html https://blog.csdn.net/qq_15385627/article/details/83 ...
- 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI
一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...
- 深入浅出的webpack4构建工具---webpack+vue+router 按需加载页面(十五)
1. 为什么需要按需加载? 对于vue单页应用来讲,我们常见的做法把页面上所有的代码都打包到一个bundle.js文件内,但是随着项目越来越大,文件越来越多的情况下,那么bundle.js文件也会越来 ...
随机推荐
- centos安装服务参考博客,亲测可用
centos 安装nginx参考 日志log报错 nginx -c /etc/nginx/nginx.conf https://blog.csdn.net/weixin_41004350/articl ...
- 关于CPU、指令集、架构、芯片的一些科普
作者:王强链接:https://zhuanlan.zhihu.com/p/19893066来源:知乎 随着智能设备的广泛普及,这几年媒体上越来越多的出现关于"架构""AR ...
- 基于MPC算法的车辆多目标自适应巡航控制系统研究_荆亚杰
- 实现自定义的小程序底部tabbar
背景 诶,当然是为了实现更有温度的代码啦(背后设计师拿着刀对着我) 自带tabbar app.json中配置: tabBar: { backgroundColor: '#fff', borderSty ...
- AcWing 1050. 鸣人的影分身
题目链接 题目描述: 在火影忍者的世界里,令敌人捉摸不透是非常关键的. 我们的主角漩涡鸣人所拥有的一个招数--多重影分身之术--就是一个很好的例子. 影分身是由鸣人身体的查克拉能量制造的,使用的查克拉 ...
- Android搞定权限申请
0x00 前言 使用EasyPermissions库进行申请权限 打开App时就申请权限,如果用户拒绝权限后,会循环申请 如果永久拒绝后,会跳转到设置里继续申请 效果图: 注:不讲原理,先教你怎么实现 ...
- typora简单使用手册
typora简单使用手册讲解`` 下载网站 网址:https://typoraio.cn/ 苹果电脑:https://typora.en.softonic.com/ 正版呢当然是收费 破解版自行百度 ...
- CPUs Intel 925X/915 Chipset (925X主板芯片组)
这个是2004年的intel产品的设计(主板,主板芯片组,北桥,南桥),结构也比较清晰,主要想看南桥和北桥的设计. 一些英文解释 ECC是一种能够实现"错误检查和纠正"的技术D92 ...
- Oracle数据库包括两个部分数据库和数据库实例
olsnodes,这个命令用来显示集群点列表(grid即oracle rac的第三个安装包内的软件,可找到) //集群名称[grid@shdb02 ~]$ olsnodes -cshfpdb-clus ...
- VMware下ubuntu 20.04扩容/磁盘
最近搞zabbix监控,发现搭建的监控server主机磁盘告警.提示/超过阈值80%. 有实在VMware软件下的虚拟机,首先我就是给虚机磁盘增加容量. 增加后发现没什么改变,看来还需要其他操作. 在 ...