getContainerRenderMixin.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  2. import ReactDOM from 'react-dom';
  3. function defaultGetContainer() {
  4. var container = document.createElement('div');
  5. document.body.appendChild(container);
  6. return container;
  7. }
  8. export default function getContainerRenderMixin(config) {
  9. var _config$autoMount = config.autoMount,
  10. autoMount = _config$autoMount === void 0 ? true : _config$autoMount,
  11. _config$autoDestroy = config.autoDestroy,
  12. autoDestroy = _config$autoDestroy === void 0 ? true : _config$autoDestroy,
  13. isVisible = config.isVisible,
  14. isForceRender = config.isForceRender,
  15. getComponent = config.getComponent,
  16. _config$getContainer = config.getContainer,
  17. getContainer = _config$getContainer === void 0 ? defaultGetContainer : _config$getContainer;
  18. var mixin;
  19. function _renderComponent(instance, componentArg, ready) {
  20. if (!isVisible || instance._component || isVisible(instance) || isForceRender && isForceRender(instance)) {
  21. if (!instance._container) {
  22. instance._container = getContainer(instance);
  23. }
  24. var component;
  25. if (instance.getComponent) {
  26. component = instance.getComponent(componentArg);
  27. } else {
  28. component = getComponent(instance, componentArg);
  29. }
  30. ReactDOM.unstable_renderSubtreeIntoContainer(instance, component, instance._container, function callback() {
  31. instance._component = this;
  32. if (ready) {
  33. ready.call(this);
  34. }
  35. });
  36. }
  37. }
  38. if (autoMount) {
  39. mixin = _objectSpread(_objectSpread({}, mixin), {}, {
  40. componentDidMount: function componentDidMount() {
  41. _renderComponent(this);
  42. },
  43. componentDidUpdate: function componentDidUpdate() {
  44. _renderComponent(this);
  45. }
  46. });
  47. }
  48. if (!autoMount || !autoDestroy) {
  49. mixin = _objectSpread(_objectSpread({}, mixin), {}, {
  50. renderComponent: function renderComponent(componentArg, ready) {
  51. _renderComponent(this, componentArg, ready);
  52. }
  53. });
  54. }
  55. function _removeContainer(instance) {
  56. if (instance._container) {
  57. var container = instance._container;
  58. ReactDOM.unmountComponentAtNode(container);
  59. container.parentNode.removeChild(container);
  60. instance._container = null;
  61. }
  62. }
  63. if (autoDestroy) {
  64. mixin = _objectSpread(_objectSpread({}, mixin), {}, {
  65. componentWillUnmount: function componentWillUnmount() {
  66. _removeContainer(this);
  67. }
  68. });
  69. } else {
  70. mixin = _objectSpread(_objectSpread({}, mixin), {}, {
  71. removeContainer: function removeContainer() {
  72. _removeContainer(this);
  73. }
  74. });
  75. }
  76. return mixin;
  77. }