出典:HTTP://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.html
インポートショップ=>のonclick =>ディスパッチイベント=> =減速機> store.subscribe実行
リアクト- Reduxのコンポーネント:UIコンポーネント(の責任を)データとロジックを管理する責任UIのレンダリング)とコンテナコンポーネント(。
接続のソース・再来の反応:
VaRは= createConnect()=>接続 機能createConnect(){ connectHOC = connectAdvanced 復帰機能接続(mapStateToProps、mapDispatchToProps、mergeProps){ 戻りconnectHOC()=>戻りconnectAdvanced()=>関数connectAdvanced(selectorFactory){ 戻り関数wrapWithConnectを(WrappedComponent ){ 戻りhoistNonReactStatics(接続、WrappedComponent)=> VAR hoistNonReactStatics = createCommonjsModule(機能(モジュール、輸出){ }) }) } } }
、UIコンポーネント
1、UIコンポーネントは、次のような特徴を有しています。
(1)ビジネス・ロジックなしで、UIをレンダリングするための唯一の原因である
(即ち、変数this.stateを使用せずに)(2)の状態ではない
(3)パラメータ(this.props)によってすべてのデータが提供される
(4)のいずれかを使用していませんAPIの再来の
例(6)は、UIコンポーネントを下回っています。
CONSTタイトル=値=> <H1> {値} </ H1>。
2、彼らは状態が含まれていないため、UIコンポーネント、また「純粋成分」、つまり、それは純粋なように機能として知られている、純粋なパラメータによってその値を決定します。
第二に、容器アセンブリ
1は、容器アセンブリは、次のような特徴があります。
(1)UI提示する責任、データおよびビジネスロジックを管理する責任がありません
(2)内部状態を用いて
(3)API Reduxの使用
3つ、UIコンポーネント、および容器アセンブリと関連して
図1に示すように、UIコンポーネントは、ビジネス・ロジックを持っている場合、二層に分割される:容器アセンブリは、UIコンポーネントのパッケージ内、外です。前者の責任は、外部との通信のために、後者のデータは、後者のビューをレンダリングします。
図2は、ユーザによって提供されるUIコンポーネントの全てが、容器アセンブリを反応させ、Reduxのにより自動的に生成され、指定された、Reduxのが反応します。
四、接続()が
容器アセンブリからUIコンポーネントを生成するために設けられReduxのコネクト方法を反応させます。
'反応-Reduxの'からインポート{接続} CONST myContainerComponent =接続( mapStateToProps、 mapDispatchToProps )(myUIComponent)
上記のコード、UIコンポーネントをmyUIComponent、myContainerComponentは、容器アセンブリによって反応させ、Reduxの接続方法によって自動的に生成されます。mapStateToPropsとmapDispatchToProps、ビジネスロジックUIコンポーネントを定義:接続方法は、2つのパラメータを取ります。前者は、外部データ状態にUIコンポーネント(小道具)属性マッピングされた入力ロジック、すなわちする責任があり、ロジックを出力する責任があり、ユーザは、アクション・オブジェクトにマッピングされたUIコンポーネントを操作しようとしている、UIコンポーネントから広がります。
五、mapStateToProps()
。1は、機能mapStateToPropsです。その役割は、UIオブジェクトのアセンブリの小道具外状態へのオブジェクトのマッピングを作成することであるオブジェクト{PROP1:state.state1、PROP2:state.state2を実行した後返します }。
2、それは後者のプロパティ配列に前者であり、mapStateToPropsストアを購読せ接続、リスナーは、アレイを介して状態更新、「発行機能」の実施、次いでループを見つけて、実行、パラメータUIコンポーネントを再計算し、それによってトリガー再レンダリングUIコンポーネント。注:実行するためにサブスクライブトリガー、「結合」と購読実行を接続します。
図3は、最初のパラメータが2番目のパラメータはownProps、小道具の代表は、容器アセンブリのオブジェクトを使用することができる、常に状態オブジェクトをmapStateToProps。使用後は、容器アセンブリパラメータが変更された場合、再レンダリングUIコンポーネントにつながります。
mapStateToProps =一定(状態、ownProps)=> { リターン{ アクティブ:ownProps.filter === state.showFilter //アクティブ:state.active、この場合ない第2のパラメータownProps } }
省略mapStateToPropsは、メソッドのパラメータを接続した場合4、その後、UIコンポーネントは、ストアの更新は、それがUIコンポーネントを更新させない、ストアに加入しません。
六、mapDispatchToProps()
。1、mapDispatchToPropsは、UIコンポーネントstore.dispatchマッピング方法を構築するために使用されるパラメータ、関数が第二パラメータで接続します。換言すれば、アクションはアクションストアとして渡されるべきかを定義します。すなわち、ユーザは、アクションにマッピングされたコンポーネントを動作させます。それは、ターゲットすることができ、関数とすることができます。
図2に示すように、関数がmapDispatchToProps、ディスパッチとownProps(小道具が容器アセンブリオブジェクト)は、2つのパラメータになる場合。コードは、関数としてmapDispatchToProps、以下見ることができるオブジェクトを返す必要があり、「各」キーは、オブジェクトのマップであり、UIコンポーネントのパラメータがアクションを送信する方法を定義します。
mapDispatchToProps =一定(ディスパッチ、ownProps)=> { リターン{ 例えばのonClickなどのイベント//トリガUIコンポーネントは、状態(フィルタ)の割り当て、ページの更新に応じて、純粋な関数で、action.typeを機能myClickを実行します。 MyClick:()=> { ディスパッチ({ タイプ: 'myFilterを'、 フィルター:ownProps.filterは//属性からオブジェクトを取得 }); } }; }
図3に示すように、mapDispatchToPropsがオブジェクトである場合、それはUIコンポーネントが機能キーであるべきである各キーのパラメータの名前と同じ名前に対応され、アクションが自動的にReduxのによって返さ発行され、クリエータアクションとして扱われます。
{mapDispatchToProps = CONST MyClick:(フィルタ)=> {//パラメータとして属性 タイプ: 'myFilterを'、 フィルタ:フィルタ }; }
セブン、<プロバイダ>コンポーネントが
発生容器コンポーネントの後にメソッドを接続する、コンテナコンポーネントは、パラメータUIコンポーネントを生成する状態オブジェクトを取得する必要があります。一つの解決策は、容器アセンブリに渡されるパラメータとしてオブジェクトを述べることです。深いコンテナコンポーネントにレベルかもしれないが、州レベルは非常に面倒に渡します。反応-Reduxのは、容器アセンブリは、状態を取得することができますProviderコンポーネントを提供します。次のコードは、プロバイダのルートパッケージの外側の層では、すべてのサブコンポーネントは、App状態を得ることができます。
'反応-Reduxのを'からインポート{プロバイダ} 'Reduxの'からインポート{CREATESTORE} './reducers'からインポートMyAppを ' ./components/App」からインポートアプリケーション ストア= CREATESTORE(MyApp]を)させ、 レンダリング( <プロバイダストア= {店}> <APP /> </プロバイダ>、 のdocument.getElementById( 'rootElement') )
その原理は、コンテキストプロパティは、上記のコンテキストオブジェクトコンテキストでは、アセンブリ店舗を反応させるのです。ソースは以下のとおりです。
クラスプロバイダは、拡張するコンポーネント{ getChildContext(){ リターン{ 店舗:this.props.store }。 } レンダリング(){ this.props.childrenを返します。 } } Provider.childContextTypes = { 店舗:React.PropTypes.object }
コードが反応-Reduxの容器アセンブリを自動的に次のようになるように、生成され、その後サブアセンブリを格納されている次のようにコードは、文脈から得ることができます。
クラスmyContainerComponentが延びコンポーネント{ componentDidMount(){ CONST {店} = this.context。 this.unsubscribe = store.subscribe(()=> this.forceUpdate() )。 } {)(レンダリング CONSTは=のthis.props小道具。 CONST {店} = this.context。 CONST状態= store.getState()。 // ... } } myContainerComponent.contextTypes = { 店舗:React.PropTypes.object }
VII例:カウンタ
1は、次の例では、カウンタコンポーネントは、純粋なUIコンポーネントです。値とonIncreaseClick:このUIコンポーネントは、2つのパラメータがあります。かつてのニーズは状態、外側にアクションを発行する後者の必要性から計算されます。
クラスカウンタコンポーネント{延び レンダリング(){ CONST {値、onIncreaseClick} = this.props リターン( <DIV> <スパン> {値} </スパン> <ボタンのonClickは= {onIncreaseClickは}>増加</ボタン> </ DIV > ) } }
図2に示すように、以下の定義状態へのマッピング値、およびマッピングをonIncreaseClickディスパッチします。
mapStateToProps機能(状態){ 戻り{ 値:関数の結果* /ここstate.count / *を行ってもよい } } 関数mapDispatchToProps(ディスパッチ){ リターン{ 例えばonclickのようなイベントトリガ// UIコンポーネントは、機能onIncreaseClickを実行において、純粋な関数で、異なる割り当てaction.type関連状態に応じて、ページリフレッシュ onIncreaseClick:()=>ディスパッチ(アクション)/ * {「増加」} * /引数は、オブジェクト・タイプであることができます } }
3、行動ジェネレータ(アクションクリエイター)
CONSTアクション= {タイプ: '増加'}
図4は、容器アセンブリを生成する方法を接続します。
constのアプリケーション=接続( mapStateToProps、 mapDispatchToProps )(カウンター)
5、コンポーネントで定義された減速(純粋関数)。
機能カウンタ(状態= {カウント:0}、アクション){ CONSTカウントが= state.count スイッチ(action.type){ ケース'増加': リターン{カウント:カウント+ 1} デフォルト: 復帰状態を } }
図6に示すように、ルート層パッケージプロバイダ外、オブジェクトストアを生成します。
'./localStorage'からインポート{にloadState、ステートセーブ}。 CONST persistedState =にloadState()。 CONST店舗= CREATESTORE( て、myApp、 persistedState )。 store.subscribe(スロットル(()=> { ステートセーブ({ ドス:store.getState()ドス、。 }) }、1000)) ReactDOM.render( <プロバイダストア= {店}> <APP /> </プロバイダ>、 のdocument.getElementById( 'rootElement') );
九、リアクト・ルータのルーティングライブラリを。また、プロバイダのルータと外側の層に包まれたプロジェクト、-ルータリアクト使用し、結局、唯一の機能は、プロバイダストアオブジェクトを渡すことです。
CONSTルート=({店})=>( <プロバイダストア= {店}> <ルータ> <ルートパス= "/"コンポーネント= {アプリ} /> </ルータ> </プロバイダ> )。
テンは、HTMLやイベントのイベントが反応の違い
HTMLイベントにイベントをREACTは、REACTに入射後の最初の文字が大文字に!例えば、<ボタンのonClick = {myClick}> </ボタンを>クリックされたイベントをクリックして反応し、クリックイベントは、HTML <ボタンのonclick = "myClick()である "> クリック</ボタン>。
注:フィード-リリースモード:
1、DOMオブジェクトのカスタムイベントに増加属性:obj.selfEvent = [];
2は、サブスクリプション(結合)関数、カスタム関数は、複数の放出関数定義
3、複数回(1)アレイに、より多くのカスタム関数を(バインド)機能を実行するために購読
4、実行パブリッシング機能、カスタム機能を実行するために、アレイを横断する、カスタムイベントのプロパティを見つける
すべての場所で、要するにエグゼクティブ「サブスクリプション機能を(結合)」、DOMオブジェクトのプロパティの配列に、(カスタム)機能「をリリース機能」トラバース実行して適切な時期を待っています。
もう一つ:フラックスが一方向のみのデータフロー考えられ、それは特定のフレームではありません。