2016-11-26 4 views
0

プロジェクト(todolistの)で、削除がimmutableライブラリ、source hereその店

ストア構造で作成された後にコンポーネントがアンマウントされていません:projectはReduxの店では、多くのtasksを持っている:State - 地図、projects, tasks - レコード

私はasynclyプロジェクトを削除すると...

export const removeProject = project => (dispatch) => { 
    if (!isProjectExist(project)) return Promise.resolve() 
    return projectService 
    .delete(project) 
    .then(
    () => { 
     dispatch(remove(project)) 
     console.log("post removeProject resolved") 
     }, 
     handleError, 
    ) 
} 

....それは、初期化後に作成された - それは削除され、適切にされますアンマウント、しかしときに、プロジェクトがinitialStateとして渡された - それは見え絵のようにenter image description here


It have tests


、古いデータで自身をレンダリングしようとすると、失敗ProjectItemProjectListが再レンダリングされず、私はimmutablejsを使用していましたが、以前はnormalizr-immutableを使用していましたが、このライブラリの問題の原因と考えて、normalizeInitialStatesource)と書いてありました。トンredux-immutable


に問題の多分ソースは私は、これは私たちが解決できるものではないと思います


creator of redux says

この問題の解決に一日苦戦しました。反応状態の変更は 非同期であり、Reactはそれらをバッチする(またはしない)ことがあります。したがって、「削除」を押すと の瞬間、Reduxストアの更新が行われ、Itemと Appの両方が新しい状態を受信します。 App状態が変更されても、アイテムのマウントが解除されても、mapStateToPropsよりも遅れて発生するアイテムは です。

私が間違っていない限り、私たちは何もできません。次の2つのオプションがあります。

すべての必要な状態をApp(またはItemListなどの下位レベル)レベル にリクエストし、「ダム」アイテムに渡します。 "現在アンマウント中"の状態のために、mapStateToProps にセーフガードを追加してください。たとえば、この場合レンダーからnull を返すことがあります。 MapStateToProps がヌルを返した場合、connect()によって生成されたコンポーネント がレンダリングからnullを返す可能性があります。これは意味をなさないでしょうか?これはあまりにも驚くべきことですか?

フム、私は他人のコードにmapStateToPropsでreturn (<div></div>)やセーフガードのようなスタブを見たことがない

答えて

0

markerikson

私は私はあなたの問題があるまさに従っ完全にわからないんだけど、 など推測すると、親要素が になる前に子コンポーネントが再レンダリングされているようです。これは、React-Redux v4以前の既知の問題です。 v5ベータ版では、この問題が修正されています。 react-redux @ nextをインストールして、あなたの問題を解決する があるかどうかを確認してください。