2016-09-18 2 views
0

ためReduxのミドルウェアを実装すると、パイプライン内に常駐され、そこにデータ依存性がここに依存データ

を検出したときにトリガを取得ジェネリックReduxのミドルウェアを実装するための最良の方法は、シナリオ何です。私はノートのリストを持っていて、個別のルート(notes /:id)の詳細ページをメモしています もしユーザーがnotespageで詳細ページをメモするときは、ノートが選択/ しかし、以前のブックマークのリンク にブラウザを直接接続するとどうなりますか? ミドルウェア内のすべてのアクションを参照できなければならないのですか? データが存在しない場合、トリガーサーバーコール

+0

なぜミドルウェア、redux-sagaやredux-thunkでノートが存在するかをチェックし、そうでない場合はロードアクションを呼び出すのはなぜですか? – elmeister

+0

@elmeisterはredux-thunkを使って実装しましたが、基本的に一連のディスパッチ(loadDependant())を行いました。しかし、コールクロスコンポーネントコールを作る少し見える。私はその減速機で別々のコンポーネントを持っています noteslist、それぞれ別のフォルダにある注釈 もう一つのポイントはジェネリックにすることですので、私のactioncreator {type:ENSURE_DEPENDANT_EXISTS}にディスパッチできますか? – shnoby

+0

私の意見では、最も簡単な方法は、ノートがnotes /:id 'componentWillMount'にロードされているかどうかをチェックし、スピナーをロードするかどうかを表示し、ノートが利用可能になったら' componentWillReceiveProps'をチェックすることです。 。 – elmeister

答えて

0

ここではasyncConnectを使用することをお勧めします。あなたはパラメータとして状態を取得し、データが存在するかどうかチェックすることができます。存在しない場合は、ロードする必要があります。

function checkIfNoteExists(state) { 
    return state.note && state.note.content; 
} 

データことが保証されます:あなたはこのような何かを行うことができ、たとえば、あなたはデータが現在の状態で存在しているかどうかを確認する必要がありcheckIfNoteExistsインサイド

@asyncConnect([{ 
    promise: ({ store: { dispatch, getState }, params }) => { 
    const currentState = getState(); 
    const promises = []; 

    if (!checkIfNoteExists(currentState)) { 
     promises.push(dispatch(loadNote(params.id))); 
    } 

    if (!checkIfCommentsLoaded(currentState)) { 
     promises.push(dispatch(loadComments())); 
    } 

    if (!checkIfAuthorLoaded(currentState)) { 
     promises.push(dispatch(loadAuthor())); 
    } 

    return Promise.all(promises); 
    } 
}]) 
@connect(...) 
class YouClass extends Component { 
    ... 
} 

:ここでは簡単な例ですもし存在しなければ、それを約束の配列に加える必要があるでしょう。

@asyncConnectは、サーバーとクライアントで機能することに注意することも重要です。同形アプリFTW!

幸運を祈る!