react-hold
Version:
Hold the empty presentational components in react.js
64 lines (56 loc) • 1.86 kB
JavaScript
import { isNull, isFunction } from './utils';
export var symbol = Symbol ? Symbol('react-hold/refiter') : '$$react-hold/refiter';
/**
* Create APIs to refit the component lifecycle methods.
*
* @param {Component|String} component
* @returns {{refit, undo}}
*/
export default function (component) {
if (component[symbol]) return component[symbol];
var componentOriginalMethods = null;
var replaceLifecycleMethods = function replaceLifecycleMethods() {
var componentDidMount = void 0;
var componentWillUnmount = void 0;
var prototype = component.prototype;
if (isNull(componentOriginalMethods) && prototype) {
if (isFunction(prototype.componentDidMount)) {
componentDidMount = prototype.componentDidMount;
prototype.componentDidMount = null;
}
if (isFunction(prototype.componentWillUnmount)) {
componentWillUnmount = prototype.componentWillUnmount;
prototype.componentWillUnmount = function willUnmount() {
try {
componentWillUnmount.call(this);
} catch (e) {
// swallow exception
}
};
}
componentOriginalMethods = {
componentDidMount: componentDidMount,
componentWillUnmount: componentWillUnmount
};
}
};
var restoreLifecycleMethods = function restoreLifecycleMethods() {
var methods = componentOriginalMethods;
if (!isNull(methods) && component.prototype) {
Object.keys(methods).forEach(function (name) {
if (isFunction(methods[name])) {
component.prototype[name] = methods[name];
}
});
componentOriginalMethods = null;
}
};
var refiter = {
refit: replaceLifecycleMethods,
undo: restoreLifecycleMethods
};
if (typeof component !== 'string') {
component[symbol] = refiter;
}
return refiter;
}