barbajs源码分析

就算有官方文档 其实做起来还是有些一头雾水啊。。。。
官方地址:http://barbajs.org/index.html

运行流程如下:
每一个应用基本上都先调用这两个方法

Barba.Pjax.init();
Barba.Prefetch.init();
  • onLinkClick 函数init时,会监听整个儿document的click事件,交给onLinkClick函数执行。
  • onLinkClick函数先将所有点击元素的默认事件取消,trigger一个linkClicked事件,将点击元素和事件传递进去
  • 然后取得这个元素的href,运行goTo函数
  • goTo函数pushState,塞进一个历史,运行onStateChange函数
  • onStateChange函数在'popstate'事件之后或者goTo函数之后运行
  • onStateChange函数运行load方法,取得后台数据,返回一个newContainer
  • onStateChange函数通过getTransition函数初始化一个transition对象,运行transition.init方法,将this.Dom.getContainer(),newContainer带入 这是oldContainer, newContainer

BaseView类分析

BaseView里面写了一些接口函数和一些监听函数,如果trigger了相关监听,则调用里面的接口函数。

  • 接口函数有:

    • namespace 视图命名空间 需要与container的data-namespace关联
    • extend 对象继承
    • onEnter 当 container准备装载到dom上触发
    • onEnterCompleted 当这个container过场动画完成触发
    • onLeave 一个新container开始其过场动画触发
    • onLeaveCompleted container从dom中被移除触发
  • 在init方法中,写了所有的钩子

    • initStateChange钩子:两个参数 newStatus, oldStatus 如果oldStatus存在并其命名空间等于当前的命名空间,运行 onLeave
    • newPageReady钩子:三个参数 newStatus, oldStatus, container 如果newStatus其命名空间等于当前命名空间 运行onEnter
    • transitionCompleted钩子:两个参数 newStatus, oldStatus 还是判断命名空间,如是newStatus,运行onEnterCompleted 如是oldStatus,运行onLeaveCompleted

用法如下:


var Home = Barba.BaseView.extend({
  namespace: 'home',
  onEnter: function() {
  },
  onEnterCompleted: function() {
    document.body.classList.add('home');
  },
  onLeave: function() {
    document.body.classList.remove('home');
  },
  onLeaveCompleted: function() {
  }
});

Home.init();

var About = Barba.BaseView.extend({
  namespace: 'about',
  onEnter: function() {
  },
  onEnterCompleted: function() {
    document.body.classList.add('about');
  },
  onLeave: function() {
    document.body.classList.remove('about');
  },
  onLeaveCompleted: function() {
  }
});

About.init();

Barba.Pjax.start();

在pjax里面用到了上述监听
init方法

 Dispatcher.trigger('initStateChange', this.History.currentStatus());
    Dispatcher.trigger('newPageReady',
      this.History.currentStatus(),
      {},l
      container,
      this.Dom.currentHTML
    );
    Dispatcher.trigger('transitionCompleted', this.History.currentStatus());

onStateChange方法

Dispatcher.trigger('initStateChange',
      this.History.currentStatus(),
      this.History.prevStatus()
    );
var transitionInstance = transition.init(
      this.Dom.getContainer(),
      newContainer
    );

    newContainer.then(
      this.onNewContainerLoaded.bind(this)
    );

    transitionInstance.then(
      this.onTransitionEnd.bind(this)
    );
/**
   * new container一准备好就调用
   *
   * @memberOf Barba.Pjax
   * @private
   * @param {HTMLElement} container
   */
  onNewContainerLoaded: function(container) {
    var currentStatus = this.History.currentStatus();
    currentStatus.namespace = this.Dom.getNamespace(container);

    Dispatcher.trigger('newPageReady',
      this.History.currentStatus(),
      this.History.prevStatus(),
      container,
      this.Dom.currentHTML
    );
  },

  /**
   * 动画一结束就调用
   *
   * @memberOf Barba.Pjax
   * @private
   */
  onTransitionEnd: function() {
    this.transitionProgress = false;

    Dispatcher.trigger('transitionCompleted',
      this.History.currentStatus(),
      this.History.prevStatus()
    );
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,668评论 18 139
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,341评论 0 2
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,050评论 0 29
  • 昨梦白马兴乘之, 前途莫问, 迷径莫止。 一任飘零秋霜, 经年堆砌。 轻蹄长叩处, 荒沙漫道, 残阳斜西。 曾许人...
    城子玄阅读 390评论 0 2
  • 有段时间很沾沾自喜自己的眼光,觉得自己精心挑选的寥寥几个微信公众号特别干货,比周围人每天花大量的时间看很多无聊的垃...
    珞小六阅读 674评论 0 0