2016-12-05 9 views
2

アラートを処理するアプリケーションのルートにコンポーネントがレンダリングされています。
私はどこでも私のアプリ内からそのコンポーネントに異なるメッセージを渡し、(受け入れるか、例えば拒否)、ユーザが選択したアクションを取得できるようにしたいです。
そのコンポーネントは他のコンポーネントの子ではないので、コールバックをプロップとして渡すことはできません。
は私が主な理由は、マークアップ組織のそれをレンダリングする必要があるすべてのコンポーネント上に「インスタンス」というコンポーネントを望んでいません。
これを達成するための良いパターンは何ですか?アボートコンポーネントからディスパッチする必要があるアクションを呼び出しアクション自体に渡す必要がありますか?Reduxを使用して、ルートのReactコンポーネントと他のアプリケーション間の通信方法を教えてください。

+0

あなたのプロジェクトではreduxを使用していますか? – FurkanO

+1

私はあなたの質問を理解していません。おそらくあなたのreduxストアには、あなたのアラートに渡す情報が含まれているし、あなたのアプリをどこにでもあなたのアラートをレンダリングするあなたの店にデータをディスパッチすることができます。これは何らかの形では不十分ですか? – azium

+0

@aziumコンポーネントからアラートコンポーネントへの通信は確かに可能です。しかし、ユーザーがそのアラートからオプションを選択した場合、次のアクションを実行する必要があるコンポーネントにその応答をどのように送り返すことができますか? – airnan

答えて

0

あなたがReduxを使用している場合。オブジェクトを返すファンクションmapStateToPropsと、コンポーネントを格納するためのヘルパーファンクションconnectを使用するだけです。 componentsは、Reduxストア内の状態が変更されたときに、自身の小道具として状態を受け取ります。すなわち、あなたがアクションを作用と減速は、されたコンポーネントは、それが(それ自体を考えて)のでが再度レンダリングされる接続(変更)ストア内の新しい値が返さ新しい小道具を受けました。

たとえば、あなた再来店(シングルトン)

{ 
    alerts: [{ 
      id: 1001, 
      message: "Hello", 
      userAct: "Accepted", 
      custType: "fromCompA", 
      }, 
      { 
      id: 1002, 
      message: "World", 
      userAct: "Declined" 
      custType: "fromCompB", 
      cb: function(){} 
      }], 
    others: {}, 
} 

mapStateToProps

const mapStateToProps = state => { 
    return { 
    alerts: state.alerts || [] 
    } 
} 

export default connect(mapStateToProps, { 
    addAlert, 
})(YourComponent) 
を接続しています

あなたはどのコンポーネントがそれを呼び出しに応じて異なるアクションを実行する場合

UPDATE、あなたはあなたの店のオブジェクトにcustom typeまたはコールバックを追加することができます。

は、その後、あなたは、このようなカスタムタイプのアクションの作成者を使用することができます

const addAlert = (paramIsObjContainsCustType, param2, custType) => (
    { 
    type: "YOUR_ACTION_TYPE", 
    payload: { 
     message: param2, 
     custType, 
    } 
) 

(あなたはのparamオブジェクトにcustTypeを置くことができ、すべての。あなたの設計に依存)そして、あなたのコンポーネントが警告オブジェクトを取得することができますし、 object.custType(この例では)。それで、あなたはその価値に応じて何かをすることができます。以下@aziumのコメント投稿者

、コールバックの方法は、タイムトラベルのような再来のいくつかの機能を逃すことがあります。したがって、店舗にcustTypeのようなメタデータを残して、それに応じて反応させることが、あなたが望むことを行うためのより良い方法になるはずです。私たちは店をシリアル化したいとき

や店舗での機能を維持するにもいくつかの問題が発生することがあります。シリアル化を行うと、関数はnullになる可能性があります。

+1

しかし、のような一般的なコンポーネントを作成するには、誰が呼び出すのかに応じて異なるアクションをディスパッチしますか?または、呼び出し側が渡したコールバックを実行しますか? コンポーネントは、それを呼び出すコンポーネントの子ではないことに注意してください。 – airnan

+0

@aiman **店舗の**アラート**にタイプまたはコールバック関数を追加できます。私のReduxストアの例をもう一度調べることができます。 –

+0

私は店舗にコールバック機能を置くことは疑わしいアプローチだと思います。私は、最初のコンポーネント(id、アクションタイプ)の呼び出し元に関するいくつかのメタデータを保存し、ジェネリックコールバックを持って次のアクションを実行することを賢明に思う/何か行動的なものを行う – azium

関連する問題