With connect() you don’t have to manually write the container component as a Component class.
const CounterComponentContainer = connect( // store.state => props of child component. Normally it's extracted as a function called mapStateToProps() state => { return {counter: state.counter} }, // store.dispatch => props of child component. Normally it's extracted as a function called mapStateToDispatch() dispatch => { return {onChange: (amount) => dispatch({type: 'counterChange', amount: amount})} } ) (CounterComponent); //connect() returns a function. Here you invoke the returned function with the original component as the parameter. //And the following is not needed any more. You can comment it out. // CounterComponentContainer.contextTypes = { // store: PropTypes.object // };
And you can go even futher. You don’t have to give the conainer component a name.
CounterComponent = connect( state => { return {counter: state.counter} }, dispatch => { return {onChange: (amount) => dispatch({type: 'counterChange', amount: amount})} } ) (CounterComponent); //CounterComponent will be changed from a reusable component to a container component class AppComponent extends Component { render() { return ( <div className="App"> ... <CounterComponent/> <!-- This is still a container component --> ... </div> ); } }
This is it! Nothing sucks any more!