`

ReactReconcileTransaction源码(待定)

 
阅读更多

ReactReconcileTransaction模块用于在组件元素挂载前后执行指定的钩子函数,特别是componentDidMount、componentDidUpdate生命周期调用方法,其次是向组件实例注入updater参数,实现setState、replaceState、forceUpdate方法。

 

'use strict';

var _assign = require('object-assign');

// 回调函数队列,经PooledClass工厂化,使用getPooled方法创建实例、release方法销毁实例数据,即回调函数及其上下文
var CallbackQueue = require('./CallbackQueue');

// PooledClass.addPoolingTo(CopyConstructor)用于将构造函数CopyConstructor转化为工厂函数
// 意义是管理实例数据的创建和销毁,并将销毁数据的实例推入到实例池CopyConstructor.instancePool中
var PooledClass = require('./PooledClass');

// ReactBrowserEventEmitter模块的isEnabled、setEnabled方法默认使用ReactEventListener模块的同名方法
var ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');

// 输入框、文本框、contentEditable节点选中文案相关操作
var ReactInputSelection = require('./ReactInputSelection');

var ReactInstrumentation = require('./ReactInstrumentation');

// 原型继承Transaction的某构造函数的实例将拥有perform(method,args)方法
// 实现功能为,method函数执行前后,调用成对的前置钩子initialize、及后置钩子close;initialize为close提供参数
var Transaction = require('./Transaction');

// 作为组件构造函数ReactComponent的第三个参数updater传入
// 组件内的setState、replaceState、forceUpdate方法都通过调用ReactUpdateQueue的相应方法实现
var ReactUpdateQueue = require('./ReactUpdateQueue');

// 缓存选中文案的数据后,再行选中文案
var SELECTION_RESTORATION = {
  // 获取选中节点及文案的信息
  initialize: ReactInputSelection.getSelectionInformation,
  // 以initialize选中文案的信息选中相关节点及文案
  close: ReactInputSelection.restoreSelection
};

// 组件绘制过程中截断事件派发,ReactBrowserEventEmitter.ReactEventListener._enabled置否实现
var EVENT_SUPPRESSION = {
  initialize: function () {
    var currentlyEnabled = ReactBrowserEventEmitter.isEnabled();
    ReactBrowserEventEmitter.setEnabled(false);
    return currentlyEnabled;
  },
  close: function (previouslyEnabled) {
    ReactBrowserEventEmitter.setEnabled(previouslyEnabled);
  }
};

// 通过CallbackQueue回调函数队列机制,即this.reactMountReady
//    执行this.reactMountReady.enqueue(fn)注入componentDidMount、componentDidUpdate方法
// 通过Transaction添加前、后置钩子机制
//    前置钩子initialize方法用于清空回调队列;close用于触发回调函数componentDidMount、componentDidUpdate执行
var ON_DOM_READY_QUEUEING = {
  initialize: function () {
    this.reactMountReady.reset();
  },
  close: function () {
    this.reactMountReady.notifyAll();
  }
};

var TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING];

// 开发环境调试相关
if (process.env.NODE_ENV !== 'production') {
  TRANSACTION_WRAPPERS.push({
    initialize: ReactInstrumentation.debugTool.onBeginFlush,
    close: ReactInstrumentation.debugTool.onEndFlush
  });
}

// 参数useCreateElement决定创建dom节点的时候是使用document.createElement方法,还是拼接字符串
function ReactReconcileTransaction(useCreateElement) {
  this.reinitializeTransaction();// 通过Transaction模块清空前后钩子

  // 浏览器端渲染使用,虽然浏览器端渲染使用ReactServerRenderingTransaction
  // 客户端渲染设置此值为否,是ReactDOMComponent、ReactDOMTextComponent模块执行mountComponent的需要
  this.renderToStaticMarkup = false;

  // 用于挂载回调函数,如componentDidMount、componentDidUpdate等
  // 通过Transcation机制,作为后置钩子执行
  this.reactMountReady = CallbackQueue.getPooled(null);
  this.useCreateElement = useCreateElement;
}

var Mixin = {
  // 通过Transaction模块设定前置及后置钩子,[{initialize,close}]形式
  getTransactionWrappers: function () {
    return TRANSACTION_WRAPPERS;
  },

  // 获取this.reactMountReady,用于添加回调函数如getReactMountReady().enqueue(fn)
  getReactMountReady: function () {
    return this.reactMountReady;
  },

  // 作为组件构造函数ReactComponent的第三个参数updater传入
  // 组件内的setState、replaceState、forceUpdate方法都通过调用ReactUpdateQueue的相应方法实现
  getUpdateQueue: function () {
    return ReactUpdateQueue;
  },

  // 获取this.reactMountReady中添加的回调函数componentDidMount、componentDidUpdate的个数
  checkpoint: function () {
    return this.reactMountReady.checkpoint();
  },

  // 将this.reactMountReady中添加的回调函数个数设为checkpoint
  rollback: function (checkpoint) {
    this.reactMountReady.rollback(checkpoint);
  },

  // 清空this.reactMountReady中的回调函数componentDidMount、componentDidUpdate,再销毁this.reactMountReady
  destructor: function () {
    CallbackQueue.release(this.reactMountReady);
    this.reactMountReady = null;
  }
};

// 通过原型方法赋值获得Transaction中的reinitializeTransaction、getTransactionWrappers、perform方法
// reinitializeTransaction方法,用于重置钩子函数
// getTransactionWrappers方法,用于添加钩子函数,[{initialize,close}]形式
// perform(method)执行前后钩子函数、及method函数
//    method函数为ReactMount模块中的mountComponentIntoNode函数
_assign(ReactReconcileTransaction.prototype, Transaction, Mixin);

// 通过PooledClass模块管理实例的创建ReactReconcileTransaction.getPooled
//    及实例数据的销毁ReactReconcileTransaction.release 
PooledClass.addPoolingTo(ReactReconcileTransaction);

// 通过ReactUpdates模块输出接口ReactUpdates.ReactReconcileTransaction
// 实现功能为在mountComponentIntoNode函数调用指定的钩子函数,包括用户配置的componentDidMount、componentDidUpdate回调
// 使用方式为getPooled方法创建实例,release方法销毁实例数据
// perform方法执行mountComponentIntoNode函数,及前后钩子函数
// getReactMountReady().enqueue(fn)添加用户配置的componentDidMount、componentDidUpdate回调
// getReactMountReady().checkpoint()方法获取回调个数
// getReactMountReady().rollback(checkpoint)将回调个数设为checkpoint
// 另一实现功能为向组件实例注入updater参数,将向setState、replaceState、forceUpdate方法提供函数功能
module.exports = ReactReconcileTransaction;

 

0
0
分享到:
评论

相关推荐

    微信小程序商城系统源码

    微信小程序 商城 (源码)微信小程序 商城 (源码)微信小程序 商城 (源码)微信小程序 商城 (源码)微信小程序 商城 (源码)微信小程序 商城 (源码)微信小程序 商城 (源码)微信小程序 商城 (源码)微信小程序 商城 (源码)...

    SSCOM源码 DELPHI 源码

    SSCOM源码 DELPHI 源码 绝对源码!欢迎下载

    微信小程序源码下载 微信小程序源码下载 2000套微信小程序源码

    本资源包含2000套微信小程序的源码,对于开发者来说是一份宝贵的参考资料,可以用来学习、研究或者作为开发新项目的起点。 源码下载是开发者获取程序原始代码的方式,对于学习和理解编程逻辑至关重要。这些微信小...

    电商微信小程序源码+后台

    电商微信小程序源码+后台分享,亲测可用,有需要的朋友拿去!!! 电商微信小程序源码+后台分享,亲测可用,有需要的朋友拿去!!! 电商微信小程序源码+后台分享,亲测可用,有需要的朋友拿去!!! 电商微信小程序...

    饿了么源码 百度外卖源码 美团外卖源码 外卖系统源码

    订餐网,外卖网源码,带积分商城,商家系统,外卖网站建设! 系统特点: 周密策划、项目为先 "项目指导技术,技术服从项目",这是我们一贯秉承的原则,也是我们与其他系统开发商、网站建设公司的本质区别所在!我们...

    变速齿轮 易语言源码 变速齿轮源码 变速器源码

    易语言源码就是用这种语言编写的程序代码,通过阅读和理解这些源码,开发者可以学习到如何利用易语言来实现特定功能,比如变速齿轮。 在易语言中实现变速齿轮功能,主要涉及到以下几个关键知识点: 1. **系统时间...

    移动医疗APP源码 android (安卓版)妙手医生源码

    移动医疗APP源码是开发医疗健康应用的核心组成部分,它包含了应用程序的所有逻辑和界面设计。在Android平台上,这种源码通常是用Java或Kotlin语言编写的,并使用Android Studio作为集成开发环境(IDE)。在这个案例...

    ssh框架项目源码ssh框架项目源码ssh框架项目源码

    ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh框架项目源码ssh...

    cocos creator完整麻将源码下载

    《cocos creator完整麻将源码解析与开发指南》 cocos Creator是一款强大的2D游戏开发引擎,被广泛应用于游戏开发,尤其是休闲娱乐类游戏,如麻将。本篇将深入探讨"麻将源码"这一主题,结合cocos Creator的特性,为...

    C#项目源码大集合系列一

    源码01 销售管理系统 源码02 彩票分析系统 源码03 餐饮管理系统 源码04 C#点名程序 源码05 象棋游戏 源码06 变色球游戏 源码07 多功能计算器 源码08 记事本 源码09 简易画图程序 源码10 成绩管理系统 源码11 BBS论坛...

    51套经典企业网站源码(一)

    0001-2科技发展有限公司升级版源码 0001科技发展有限公司修正版源码 0002机械配件制造销售公司修正版源码 0003家具地板公司修正版源码 0004-1机械有限公司修正版源码 0004机械有限公司修正版源码 0005机械产品公司...

    捕鱼游戏源码 下载 最新完整版

    捕鱼游戏源码是一种基于计算机编程技术,用于开发模拟海洋捕鱼场景的电子游戏的代码集合。这类源码通常包含了游戏逻辑、图形渲染、音频处理、用户交互等多个方面的详细实现,为开发者提供了一个深入理解游戏开发过程...

    仿58同城赶集网源码

    分类源码,信息发布网站源码,信息源码,信息港网站源码,asp信息港源码,信息类网站源码,多种分类源码,信息网源码下载,asp信息网源码,信息发布系统源码,物流信息源码,房产信息网源码.net源码,公安信息网源码,家教信息...

    非常漂亮的个人博客网站源码

    标题中的“非常漂亮的个人博客网站源码”表明这是一个关于个人博客网站的设计与开发资源,它包含了一套完整的源代码,可以用于创建一个美观且个性化的博客平台。这种源码通常包括HTML、CSS、JavaScript等前端代码,...

    Linux系统下dhcp源码

    Linux系统下的DHCP(Dynamic Host Configuration Protocol)源码解析 DHCP是一种网络协议,用于自动分配IP地址、子网掩码、默认网关等网络配置信息给网络中的设备。在Linux环境中,DHCP服务器通常使用isc-dhcp-...

    DIY个性T恤定制网站源码

    【DIY个性T恤定制网站源码】是一个用于创建在线个性化商品定制平台的软件系统,主要专注于T恤、杯子、台历和挂历等产品。这个源码允许用户通过简单的界面设计自己的产品,体现个人风格和创意。接下来,我们将深入...

    机顶盒聚合视频桌面源码

    本话题聚焦于一个特殊的软件组件——“机顶盒聚合视频桌面源码”,这是一种为机顶盒定制的用户界面(UI)和应用,它整合了多个视频来源,如直播频道和点播服务。 聚合视频桌面源码是开发机顶盒应用的核心部分,它的...

    多功能在线报价系统源码

    【标题】:“多功能在线报价系统源码” 在线报价系统是一种基于网络的应用程序,它使得企业或个人能够方便快捷地提供产品或服务的价格信息给潜在客户。这个“多功能在线报价系统源码”是专为此目的设计的,允许用户...

    net-tools arp源码 ifconfig源码 route源码

    net-tools arp源码 ifconfig源码 route源码

    2021新版神算子网络付费测算源码算命网站源码测算网站源码

    算命源码,神算子网络网高级版付费源码完整版,下载后请根据文档进行安装,数据库可在线恢复,本版本为学习使用,禁止商业用途,如需商用,请移步神算子网络购买正版.

Global site tag (gtag.js) - Google Analytics