vue router hash原理,vue路由hash模式原理
这篇文章主要介绍了某视频剪辑软件的混杂跳转原理,帮助大家更好的理解和学习使用某视频剪辑软件框架,感兴趣的朋友可以了解下
目录
哈希和历史的区别HashHistorygetCurrentLocation实现设置监听器实现过渡到实现比赛方法在新武鲁特的时候我们可以传入一个方式属性,他可以接收三个值:哈希/历史/摘要
hash和history的区别
历史的路径更美观一点比如http://yoursite.com/user/id,history是基于pushState()来完成统一资源定位器跳转而无须重新加载页面。但是强制刷新还是会有问题(服务端来解决这个问题),所以历史模式需要后端人员配合使用。
混杂的路径会带有#,比如http://yoursite.com#/user/id
HashHistory
武鲁特类{
构造函数(选项){
这个。matcher=创建匹配器(选项。routes []);
//这里为了讲解混杂模式所以就不进行判断用户传进来的是哪种模式了
这个。历史=新哈希历史(this);//这个某视频剪辑软件路由器的实例
}
}
源码这里创建了一个基类我们这里和源码统一,这个基类封装了三种模式公用的方法和属性,那么我们在这里创建一个哈希历史和基类历史
从导入历史记录 0.25/基数
//哈希路由
导出默认类哈希历史扩展历史{
构造器(路由器){
超级(路由器);//继承调用父类等于呼叫
}
}
//路由的基类
导出默认课程历史记录{
构造器(路由器){
this.router=路由器;
}
}
如果是混杂路由,打开网站如果没有混杂默认应该添加#/
从导入历史记录./基地;
函数ensureSlash(){
if(window.location.hash){
返回
}
window.location.hash=/
}
导出默认类哈希历史扩展历史{
构造器(路由器){
超级(路由器);
确保斜杠();//确保有混杂
}
}
再看一下初始化的逻辑(上面的路由器。初始化函数)
初始化(应用程序){
常数历史=这.历史
//初始化时,应该先拿到当前路径,进行匹配逻辑
//让路由系统过度到某个路径
const setupHashListener=()={
历史。设置侦听器();//监听路径变化
}
history.transitionTo( //父类提供方法负责跳转
history.getCurrentLocation(),//子类获取对应的路径
//跳转成功后注册路径监听,为视图更新做准备
setupHashListener
)
}
这里我们要分别实现过渡到(基类方法)、getCurrentLocation、setupListener
getCurrentLocation实现
函数getHash(){
返回窗户。位置。哈希。切片(1);
}
导出默认类哈希历史扩展历史{
//.
getCurrentLocation(){
返回get hash();
}
}
setupListener实现
导出默认类哈希历史扩展历史{
//.
setupListener(){
窗户。addevent侦听器( hashchange ,()={
//根据当前混杂值过度到对应路径
这个。转换到(get hash());
})
}
}
TransitionTo实现
导出函数createRoute(记录,位置){//{路径:/,匹配:[记录,记录]}
设RES=[];
如果(记录){ //如果有记录
而(记录){
res.unshift(记录);//就将当前记录的父亲放到前面
记录=记录。父级
}
}
返回{
.位置,
匹配:分辨率
}
}
导出默认课程历史记录{
构造器(路由器){
this.router=路由器;
//根据记录和路径返回对象,稍后会用于路由器视图的匹配
this.current=createRoute(null,{
路径:"/"
})
}
//核心逻辑
过渡到(位置,完成时){
//去匹配路径
让route=this。路由器。匹配(位置);
//相同路径不必过渡
如果(
位置===路径。路径
路线。匹配。长度===这个。当前。匹配。长度){
返回
}
//更新路由并且下面会提到改变根实例上的_路线属性
this.updateRoute(路由)
在complete()上完成;
}
}
导出默认类VueRouter{
//.
//做一个代理
匹配(位置){
返回this.matcher.match(位置);
}
}
macth方法
match(location){//稍后根据路径找到对应的记录。
let record=pathMap[location]
If (record) {//根据记录创建相应的路径
//参数:/about/a: {path: xx,component.},路径:“/about/a”
返回createRoute(记录,{
路径:位置
})
}
//如果找不到,将返回一个空匹配
返回createRoute(null,{
路径:位置
})
}
不难发现,当路径改变时,当前属性也随之改变。我们可以使当前属性具有响应性,并在每次当前属性改变时刷新视图。
在安装方法中
安装(Vue) {
Vue.mixin({ //将beforeCreate方法添加到所有组件的生命周期中。
创建之前(){
如果(这个。$options.router) {
//调用Vue类中的双向数据绑定方法
Vue.util.defineReactive(this, _route ,this。_路由器.历史.当前);
}
}
});
//$route和$router方法只是vue中最常见的代理,只是为了方便起见。
object . define property(vue . prototype, $route ,{//每个实例都可以获取$ route属性。
get(){
归还这个。_routerRoot。_ route//上面只是进行了双向数据绑定。
}
});
object . define property(vue . prototype, $ router ,{//每个实例都可以得到路由器实例。
get(){
归还这个。_routerRoot。_路由器;
}
})
}
每次路由初始化都需要调用updating _route的方法,因为_route在安装的时候是双向绑定数据的,没有这个。_router.history.current第一次进来的时候。订阅和更新操作通过发布和订阅进行;在init方法中添加监听函数。
History.listen((route)={//需要更新_route属性才能进入和退出一个函数。
app。_route=路线
});
导出默认课程历史记录{
构造器(路由器){
//.
this.cb=null
}
听(cb){
this.cb=cb//寄存器功能
}
更新路线(路线){
this.current=route
this.cb this.cb(路由);//在更新当前后更新_route属性
}
}
以上是对vue的哈希跳转原理的详细说明。更多关于vue的哈希跳转原理,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。