Redux的做者友情赞助,封装了一个 React 专用的库 React-Redux
,为 React + Redux 提供了一种更科学的代码组织方式。react
本人认为React-Redux
的中心思想就是实现Model
与View
的分离。它将全部组件分红两大类:redux
UI组件(View层)ide
容器组件(Model层)函数
这样以来也实现了Redux和React分离,UI组件只要书写react的代码,容器组件只负责书写redux相关操做,易于书写与维护。this
react-redux主要提供了倆个关键API:Provider组件 和 connect函数。spa
connect函数的主要功能是链接 UI组件 与 容器组件。它会自动为您的UI组件生成一个容器组件,而且创立起它们之间的通讯。code
const ContainerComponent = connect( mapStateToProps, mapDispatchToProps )(UIComponent);
上面代码中,UIComponent是 UI组件,containerComponent就是由 React-Redux 经过connect方法自动生成的容器组件。而 mapStateToProps
和 mapDispatchToProps
则创建起了倆种组件之间的通讯机制。对象
mapStateToProps(state,[ownProps])
get
这个函数的主要功能是将state
经过props
属性传递给UI组件,它会订阅 Store,每当state更新的时候,就会自动执行,从新计算 UI 组件的参数,从而触发 UI 组件的从新渲染。源码
mapStateToProps函数返回一个对象,这个对象中的每个键值对都会映射到UI组件的props
上。
const mapStateToProps = (state) => { return { data: state } }
上面的 mapStateToProps 函数将state
传递给了UI组件的props
属性,您能够在UI组件内经过this.props.data来访问state
。这样就实现了容器组件向UI组件方向上的数据传递。
mapDispatchToProps能够是一个函数,也能够是一个对象。
做为函数,mapDispatchToProps 会获得 dispatch
和 ownProps
俩个参数,而且返回一个对象。
const mapDispatchToProps = ( dispatch, ownProps ) => { return { click: () => { // 能够进行dispatch操做,发出action } }; }
上面的mapDispatchToProps
函数会返回一个对象,这个对象的键值依旧会传递给UI组件的props
,在UI组件内部,您能够经过this.props.click
来调用这个函数。
Provider 组件主要做为整个应用的容器,用来传递store给connct所生成的容器组件。
<Provider store={store}> <ContainerComponent /> </Provider>
上面代码中,Provider在根组件外面包了一层,这样一来,App的全部子组件就默认均可以拿到state了。
源码:
class Provider extends Component { getChildContext() { return { store: this.props.store }; } render() { return this.props.children; } } Provider.childContextTypes = { store: React.PropTypes.object }
解释上面的代码以前先解释下 context 和 contextTypes,
也就是说:指定数据并要将数据传递下去的父组件要定义 childContextTypes
和 getChildContext() ;想要接收到数据的子组件 必须定义 contextTypes
来使用传递过来的 context 。
因此,上面代码的意思就是:Provider
组件经过getChildContext
方法指定向下传递的数据为store,并经过childContextType
属性使该属性得以传递。Provider
的子组件能够经过this.context
取到数据。