diff --git a/packages/web/src/components/basic/ComponentWrapper.js b/packages/web/src/components/basic/ComponentWrapper.js index 4cab60e5c..64ebe18a6 100644 --- a/packages/web/src/components/basic/ComponentWrapper.js +++ b/packages/web/src/components/basic/ComponentWrapper.js @@ -120,7 +120,7 @@ class ComponentWrapper extends React.Component { ({ registeredComponentsTimestamps } = this.context.getState()); } // Unregister components - if (registeredComponentsTimestamps[componentId] === this.$timestamp) { + if (registeredComponentsTimestamps[componentId] === this._timestamp) { this.props.removeComponent(componentId); if (this.internalComponent) { this.props.removeComponent(this.internalComponent); @@ -130,8 +130,25 @@ class ComponentWrapper extends React.Component { } componentDidMount() { + let components = []; + if (this.context && this.context.getState) { + ({ components } = this.context.getState()); + } + + // Re-register if component was destroyed or not present (e.g. under StrictMode double-mounting) + if (this.props.destroyOnUnmount || components.indexOf(this.props.componentId) === -1) { + this.props.addComponent(this.props.componentId, this._timestamp); + this.props.setQueryListener(this.props.componentId, this.props.onQueryChange, this.props.onError); + this.props.setComponentProps(this.props.componentId, this.props); + } + // Register internal component if (this.internalComponent) { + if (this.props.destroyOnUnmount || components.indexOf(this.internalComponent) === -1) { + this.props.addComponent(this.internalComponent, this._timestamp); + this.props.setComponentProps(this.internalComponent, this.props); + } + if (this.props.mode !== 'test') { if (this.props.setReact) { // Watch component after rendering the component to avoid the un-necessary calls diff --git a/packages/web/src/components/range/DynamicRangeSlider.js b/packages/web/src/components/range/DynamicRangeSlider.js index d8472727d..4d6a12dbb 100644 --- a/packages/web/src/components/range/DynamicRangeSlider.js +++ b/packages/web/src/components/range/DynamicRangeSlider.js @@ -258,7 +258,27 @@ class DynamicRangeSlider extends Component { } componentDidMount() { - const { mode } = this.props; + const { components, addComponent, setQueryListener, setComponentProps, mode } = this.props; + const currentComponents = components || []; + if (currentComponents.indexOf(this.props.componentId) === -1) { + addComponent(this.props.componentId, this._timestamp); + addComponent(this.internalHistogramComponent, this._timestamp); + addComponent(this.internalRangeComponent, this._timestamp); + setQueryListener(this.props.componentId, this.props.onQueryChange, null); + + setComponentProps(this.props.componentId, this.props, componentTypes.dynamicRangeSlider); + setComponentProps( + this.internalHistogramComponent, + this.props, + componentTypes.dynamicRangeSlider, + ); + setComponentProps( + this.internalRangeComponent, + this.props, + componentTypes.dynamicRangeSlider, + ); + } + if (mode !== 'test') { this.setReact(this.props); } @@ -800,6 +820,7 @@ const mapStateToProps = (state, props) => { } } return { + components: state.components, options, isLoading: state.isLoading[props.componentId], range,