React源码解析 - ReactClass.js
ReactClass.js源文件: https://github.com/facebook/react/blob/master/src/isomorphic/classic/class/ReactClass.js 2017.4.9 更新 自 我们最常用的React.createClass方法就是在这个文件中定义的(JSX代码最终都要转换成createClass这种形式的)。这也是我阅读react源码过程中,打算详细解读的第一个文件。下面,我将从上到下挑选出能给自己一些启发的源码做注解。有些代码,已有注释,就不在这里粘贴了。包含 'use strict';
var ReactBaseClasses = require('ReactBaseClasses'); var ReactElement = require('ReactElement'); var ReactNoopUpdateQueue = require('ReactNoopUpdateQueue');
var emptyObject = require('fbjs/lib/emptyObject'); var invariant = require('fbjs/lib/invariant'); var warning = require('fbjs/lib/warning'); fbjs是一个工具集,是独立于react的另一个项目,被facebook不同项目所共享,如relay。
var args = [a,b,c,d,e,f]; var argIndex = 0; error = new Error( format.replace(/%s/g,function() { return args[argIndex++]; }) ); get新技能,原来string的replace方法,是可以递归调用的。
type SpecPolicy = | 'DEFINE_ONCE' | 'DEFINE_MANY' | 'OVERRIDE_BASE' | 'DEFINE_MANY_MERGED'; // ... /** * @interface ReactClassInterface * @internal */ var ReactClassInterface: {[key: string]: SpecPolicy} = { mixins: 'DEFINE_MANY',// ... } 要理解上面一段代码,就必须要了解react所用的类型系统Flow了。
注释中的 // ... 省略了很多代码 var ReactClassComponent = function() {}; Object.assign( ReactClassComponent.prototype,ReactComponent.prototype,ReactClassMixin,); var ReactClass = { createClass: function(spec) { var Constructor = identity(function(props,context,updater) { this.props = props; this.context = context; this.refs = emptyObject; // ... }; Constructor.prototype = new ReactClassComponent(); Constructor.prototype.constructor = Constructor; // ... mixSpecIntoComponent(Constructor,spec); // ... return Constructor; } } 通过这段精简的 const Contacts = React.createClass({ propTypes: { },getDefaultProps() { return { }; },render() { return ( <div></div> ); } }); 基中, 至此,这个800多行的 原文:http://react.apptravel.cn/article/59 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |