Declaratively code-split your redux store and make containers own entire redux flow using redux-store-manager
Declaratively code-split your redux store and make containers own entire redux flow using redux-store-manager
yarn add redux-store-manager
storeManager is a singleton that has the following methods
Root.js
import {Provider} from 'react-redux';
import storeManager from 'redux-store-manager';
import App from './containers/AppContainer';
export default function Root() {
return (
// creates store with all the reducers registered by container components
<Provider store={storeManager.createStore(initialState, storeEnhancer)}>
<App>
</Provider>
)
}
/* ReactDOM.render(<Root/>, document.getElementById('root')); */
App.js
import React, {Component} from 'react';
import {withRefreshedStore} from 'redux-store-manager';
import SimpleWidgetContainer from './containers/SimpleWidgetContainer';
export default class App extends React {
state = {
OnDemandWidgetContainer: null
};
componentWillMount() {
// when loading a widget on-demand along with the component codebase the reducers are also
withRefreshedStore(import('./containers/SimpleWidgetContainer')).then((module) => {
this.setState({OnDemandWidgetContainer: module.default});
});
}
render() {
const {OnDemandWidgetContainer} = this.state;
return (
<>
<SimpleWidgetContainer />
{OnDemandWidgetContainer ? <OnDemandWidgetContainer/> : null}
</>
);
}
}
SimpleWidgetContainer.js
import storeManager from 'react-store-manager';
import {connect} from 'react-redux';
import SimpleDemandWidget from '../components/SimpleWidget';
import simpleDemandWidgetReducer from '../reducers/simopleWidgetReducer';
import {getSimpleWidgetData} from '../actions';
// reducer and its initialStatw will be added to the store.
storeManager.registerReducers({
simpleWidgetData: simpleWidgetDataReducer
});
const mapStateToProps = (state) => ({ simpleWidgetData: state.simpleWidgetData });
const mapDispatchToProps = { getSimpleWidgetData };
export default connect(
mapStateToProps,
mapDispatchToProps
)(OnDemandWidget);
OnDemandWidgetContainer.js
import storeManager from 'react-store-manager';
import {connect} from 'react-redux';
import OnDemandWidget from '../components/OnDemandWidget';
import onDemandWidgetReducer from '../reducers/onDemandWidgetReducer';
import {getOnDemandWidgetData} from '../actions';
/*
* reducers registered in on-demand chunks will be added to redux store
* only when the on-demand chunk is loaded
*/
storeManager.registerReducers({
onDemandWidgetData: onDemandWidgetDataReducer
});
const mapStateToProps = (state) => ({ onDemandWidgetData: state.onDemandWidgetData });
const mapDispatchToProps = { getOnDemandWidgetData };
export default connect(
mapStateToProps,
mapDispatchToProps
)(OnDemandWidget);