
这一系列课程将介绍如何将 Redux 与 React 结合使用。在 React Redux 应用程序中,您可以创建一个 Redux 应用商店来管理整个应用程序的状态。React 组件只订阅存储区中与其角色相关的数据片段。然后,您直接从 React 组件分派操作,然后触发存储更新对应组件状态。
将 Redux 连接到 Messages App
知道 connect 怎么实现 React 和 Redux 的连接后,我们可以在 React 组件中应用上面学到的内容。
在上一课,连接到 Redux 的组件命名为 Presentational,这个命名不是任意的,这样的术语通常是指未直接连接到 Redux 的 React 组件,他们只负责执行接收 props 的函数来实现 UI 的呈现。与上篇文章相比,本文章需要把容器组件连接到 Redux。这些组件通常负责把 actions 分派给 store,且经常给子组件传入 store state 属性。
到目前为止,下面代码中已包含了整个章节的代码,唯一不同的是,React 组件被重新命名为 Presentational,即展示层组件。创建一个新组件,保存在名为 Container 的常量中。这个常量用 connect 把 Presentational 组件和 Redux 连接起来。然后,在 AppWrapper 中渲染 React Redux 的 Provider 组件,给 Provider 传入 Reduxstore 属性并渲染 Container 为子组件。完成这些,消息 app 应用会再次渲染页面。
完整代码如下所示:
// 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:class Presentational extends React.Component {constructor(props) {super(props);this.state = {input: '',messages: []}this.handleChange = this.handleChange.bind(this);this.submitMessage = this.submitMessage.bind(this);}handleChange(event) {this.setState({input: event.target.value});}submitMessage() {const currentMessage = this.state.input;this.setState({input: '',messages: this.state.messages.concat(currentMessage)});}render() {return (<div><h2>Type in a new Message:</h2><inputvalue={this.state.input}onChange={this.handleChange}/><br/><button onClick={this.submitMessage}>Submit</button><ul>{this.state.messages.map( (message, idx) => {return (<li key={idx}>{message}</li>)})}</ul></div>);}};// React-Redux:const mapStateToProps = (state) => {return { messages: state }};const mapDispatchToProps = (dispatch) => {return {submitNewMessage: (newMessage) => {dispatch(addMessage(newMessage))}}};const Provider = ReactRedux.Provider;const connect = ReactRedux.connect;const Container = connect(mapStateToProps,mapDispatchToProps)(Presentational)class AppWrapper extends React.Component {constructor(props) {super(props);}render() {return (<Provider store={store}><Container /></Provider>);}};
今天就讲到这里,如果有问题需要咨询,大家可以直接留言或扫下方二维码关注公众号。也可以添加 happyzjp 微信受邀加入学习社群,我们会尽力为你解答。练习网站已经正式上线,大家可以登陆网站 http://www.icoderoad.com 进行文章中示例的练习。




