ReactComponent源码
ReactComponent模块,作为父类,创建基本的组件,内部实现setState、forceUpdate方法,用于更新state属性,重绘组件。
'use strict';
var _prodInvariant = require('./reactProdInvariant');// 生产环境React形式带url报错
// 组件尚未获得参数updater,即"react-dom"包下的"ReactUpdateQueue",调用setState、replaceState、forceUpdate时警告
var ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');
// 判断Object.defineProperty方法是否存在
var canDefineProperty = require('./canDefineProperty');
var emptyObject = require('fbjs/lib/emptyObject');
// invariant(condition,format,a,b,c,d,e,f) condition为否值,替换format中的"%s",并throw error报错
var invariant = require('fbjs/lib/invariant');
// warning(condition,format) condition为否值,替换format中的"%s",并console.error警告
var warning = require('fbjs/lib/warning');
function ReactComponent(props, context, updater) {
this.props = props;
this.context = context;
this.refs = emptyObject;
// 组件实例化时将this.updater赋值为"react-dom"包下的"ReactUpdateQueue",用于实现setState、replaceState、forceUpdate方法
this.updater = updater || ReactNoopUpdateQueue;
}
ReactComponent.prototype.isReactComponent = {};
// 通过调用ReactUpdateQueue.enqueueSetState、ReactUpdates.enqueueUpdate方法更新组件的state,及重绘组件,执行回调
ReactComponent.prototype.setState = function (partialState, callback) {
!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : _prodInvariant('85') : void 0;
this.updater.enqueueSetState(this, partialState);
if (callback) {
this.updater.enqueueCallback(this, callback, 'setState');
}
};
// 通过调用ReactUpdateQueue.enqueueForceUpdate、ReactUpdates.enqueueUpdate方法重绘组件,执行回调
ReactComponent.prototype.forceUpdate = function (callback) {
this.updater.enqueueForceUpdate(this);
if (callback) {
this.updater.enqueueCallback(this, callback, 'forceUpdate');
}
};
// 移除的方法
if (process.env.NODE_ENV !== 'production') {
var deprecatedAPIs = {
isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in '
+ 'componentWillUnmount to prevent memory leaks.'],
replaceState: ['replaceState', 'Refactor your code to use setState instead (see '
+ 'https://github.com/facebook/react/issues/3236).']
};
var defineDeprecationWarning = function (methodName, info) {
if (canDefineProperty) {
Object.defineProperty(ReactComponent.prototype, methodName, {
get: function () {
process.env.NODE_ENV !== 'production' ?
warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1])
: void 0;
return undefined;
}
});
}
};
for (var fnName in deprecatedAPIs) {
if (deprecatedAPIs.hasOwnProperty(fnName)) {
defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
}
}
}
module.exports = ReactComponent;