--- title: Extract Local State into Redux --- ## Extract Local State into Redux ### Hint 1 You need to change the following sections: * default state declarations: remove `messages` * `submitMessage`: use `props` * `render`: the unordered list should use `props` instead of `this.state.messages` ### Hint 2 Replace `this.state.messages` with `this.props.messages`. ### Hint 3 The `submitMessage` function still needs to set the state of the `input`. ### Solution
Spoiler! ```jsx // Redux: const ADD = 'ADD'; const addMessage = (message) => { return { type: ADD, message: message } }; const messageReducer = (state = [], action) => { switch (action.type) { case ADD: return [ ...state, action.message ]; default: return state; } }; const store = Redux.createStore(messageReducer); // React: const Provider = ReactRedux.Provider; const connect = ReactRedux.connect; // Change code below this line class Presentational extends React.Component { constructor(props) { super(props); // Remove property 'messages' from Presentational's local state this.state = { input: '' } this.handleChange = this.handleChange.bind(this); this.submitMessage = this.submitMessage.bind(this); } handleChange(event) { this.setState({ input: event.target.value }); } submitMessage() { // Call 'submitNewMessage', which has been mapped to Presentational's props, with a new message; // meanwhile, remove the 'messages' property from the object returned by this.setState(). this.props.submitNewMessage(this.state.input); this.setState({ input: '' }); } render() { return (

Type in a new Message:


); } }; // Change code above this line const mapStateToProps = (state) => { return {messages: state} }; const mapDispatchToProps = (dispatch) => { return { submitNewMessage: (message) => { dispatch(addMessage(message)) } } }; const Container = connect(mapStateToProps, mapDispatchToProps)(Presentational); class AppWrapper extends React.Component { render() { return ( ); } }; ```