React+Redux 分为两部分:html
- UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM
- 容器组件:即Redux逻辑,处理数据和业务逻辑,支持全部Redux API,参考以前的文章:Redux学习笔记:Redux简易开发步骤
而React+Redux是以上两部分结合起来,方便在React中使用Redux,专用库为React-Redux.js。
React-Redux.js新增了一些新方法:react
- Provider:容器跟组件,可直接把外部的state传递给全部子组件和UI组件;
- mapStateToProps:输入逻辑,把外部的state转化为props对象传递给用户自定义UI组件;
- mapDispatchToProps:输出逻辑,根据用户的操做,处理具体Action,并经过dispatch触发更新state;
- connect:根据UI组件、输入逻辑、输出逻辑生成容器组件;
本文实例源代码参考:React-Redux-Primary-Demo 中的webapp/redux/index2.js。git
演示地址:React-Redux实例演示web
ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') )
说明:<Provider>是包裹在全部容器外面的根组件,目的是能够直接传递state给全部子组件。(利用React组件的context,可参考:React组件实现越级传递属性)redux
const App = connect(
mapStateToProps,
mapDispatchToProps
)(Counter)
说明:connect将用户自定义的UI组件(即Counter)和React-Redux自动生成的容器组件(即App)连起来,目的是:前者负责UI展现,后者负责逻辑处理。app
class Counter extends Component { render() { const { value, onIncreaseClick } = this.props return ( <div> <span>{value}</span> <button onClick={onIncreaseClick}>累加一次</button> </div> ) } }
// 输入逻辑: // 将state映射成props传递给UI组件(即Counter组件) function mapStateToProps(state) { return { value: state.count } } // 输出逻辑: // 将用户对UI组件的操做映射成Action,经过dispatch,触发reducer(即conter),生成新的state function mapDispatchToProps(dispatch) { return { onIncreaseClick: () => dispatch({ type: 'increase' }) } }
const store = createStore(counter); // createStore的第一个参数必须是个函数,mapDispatchToProps中执行dispatch()时,该函数就叫reducer
function counter(state = { count: 0 }, action) { const count = state.count switch (action.type) { case 'increase': return { count: count + 1 } default: return state } }
说明:state生成以后,会自动触发mapStateToProps,并渲染View,不须要subscribe监听state变化。webapp