美文网首页
barbajs源码分析

barbajs源码分析

作者: 这是我用来记录技术的一个博客 | 来源:发表于2017-12-19 19:26 被阅读95次

    就算有官方文档 其实做起来还是有些一头雾水啊。。。。
    官方地址: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()
        );
      }
    

    相关文章

      网友评论

          本文标题:barbajs源码分析

          本文链接:https://www.haomeiwen.com/subject/qtybwxtx.html