2015-12-10 7 views
5

ディスパッチャemit.change()が必要です。店内で何かが変更されたことをすべてのコンポーネントに知らせるためです。しかし、私は、アクションの中から店舗を直接呼び出すのではなく、アクションをディスパッチする必要がある理由を理解していません。React/Flux - なぜアクションディスパッチャーが必要ですか?

.i.e。むしろこれより

var Dispatcher = require('dispatcher'); 
var MyActions = { 
    addItem: function(item){ 
     Dispatcher.dispatch({ 
       action: 'ADD_ITEM', 
       payload: item  
     }) 
    } 
} 

var MyStore = require('mystore'); 
var MyActions = { 
    addItem: function(item){ 
     MyStore.addItem(item); 
    } 
} 

は、複数の店舗が同じイベントに耳を傾けた場合のために、例えばStoreAStoreBが同様ADD_ITEMを聞くときということですか?私はこれを理由を行う必要がありますか

答えて

9

ディスパッチャは、アクションが呼び出されると、アクションを1つずつ実行します。

  1. アプリケーションの状態をアトミックに変更する必要があるためです。つまり、s1→s2(a1)、s2→s3(a2)を同期して表します。むしろs1→s3(a1とa2のため)。あなたがそれをしないと、あなたはこの特定のアクションに沿って発砲する他のアクションについて心配する必要があり、それらのすべての組み合わせに対してアプリケーション状態がどのように変化するかを推測する必要があります。これはすべての地獄が緩んでいるところであり、あなたのコードは維持管理が難しくなります。 他のアクションもアクティブであるかどうかを調べるために、起動されたアクションごとにストアにif-elseブロックを書き込むことを想像してください。ディスパッチャは、既にdispatchingの間ディスパッチしていないことを確認します。一度に一人が派遣されます。州の木をとても健康に保ちます。

  2. また、ディスパッチャは、各「アクション」に対して起動するコールバックの配列を保持します。これは、同じアクションの複数のストアでコールバックを呼び出す場合に便利です。ストアが(registerを使用して)アクションにサブスクライブすると、ディスパッチャはそれに関連付けられたregisterHandlerを追加し、配列に追加します。これにより、店舗を登録/登録解除することができます。アクションの種類によっては、登録されているすべての店舗に応じて変更することができます。 ディスパッチャを使用しない場合は、アクション部分を書くときに、通知する必要があるすべての店舗について心配する必要があります。悪い!

  3. このようなアプローチでは、重視する必要があるのは、ディスパッチャーにアクションを打つことだけです。残りは、アクションに基づいてchangeにする必要があるすべての店舗に通知するディスパッチャまでです。ストアにはビューをトリガーするコールバックがあるため、これらのコールバックは必要に応じて呼び出すことができます。これにより、コードがモジュール化された状態に保たれます。

+0

偉大な答えをありがとう!私はそれに関連するもう一つの質問を持っています。それが私がここでこの質問に最初に来た理由です。私はアクションから値(新しく作成されたアイテムのID)を返し、それを次のアクションに渡す必要があります。他のアクションの後に複数のアクションをディスパッチするのではなく、ストア内のIDを含む次のアクションをディスパッチする必要がありますか?もう1つの質問は[ここ]です(http://stackoverflow.com/questions/33987477/react-flux-return-value-from-flux-dispatcher-store) –

+0

最も良いことは、同じアクションを使用することです。両方のストアでそれを聞いて、それに応じて変更を加えます。実際、それを行う方法は常にあります。あなたはちょっとあなたのコードを微調整する必要があります。この{data_for_store1:{...}、data_for_store2:{...}、アクション: 'ADD_ITEM'}でディスパッチし、両方のストアで同じアクションを使用できるようになりました。これは役に立ちますか? –

+0

これは私が最初にやっていたことでしたが、action1はStoreAに新しいIDを作成し、新しく作成したIDを何とかStoreBに渡す必要があります。ディスパッチャーを変更することでこれを行うことができるので、ディスパッチ後に値を返すことができますか? –

関連する問題