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()
    );
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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