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
取到數據。