UNPKG

react-hold

Version:

Hold the empty presentational components in react.js

64 lines (56 loc) 1.86 kB
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; }