2017-01-11 4 views
0

ボタンをクリックするとAPI呼び出しが行われ(setTimeoutによってシミュレートされます)、完了するとその項目は状態から削除されます。私はコンポーネントがレンダリングしようとしないことを期待しますが、必要な状態はもはや存在しないため、失敗して失敗します。Redux非同期ディスパッチによって接続コンポーネントのエラーが発生する

setTimeout(() => { 
    dispatch({ 
    type: 'REMOVE', 
    id 
    }); 
}, 0); 

Iは、親コンポーネントを想定:ディスパッチへの呼び出しを非同期的に行われるため

dispatch({ 
    type: 'REMOVE', 
    id 
}); 

The second fiddleはエラーを示します。ディスパッチの呼び出しが同期であるため、所望の挙動の動作を示す

The first fiddleその項目が配列から除外されているため、子コンポーネントをレンダリングしようとしなくなりました。状態からアイテムを削除し、コンポーネントが再レンダリングしようとするのを防ぐにはどうすればいいですか?

+0

(http://stackoverflow.com/questions/40823843/component-is-not-unmount-after-its-delete-in-store)。 react-redux @にアップグレードすると問題が解決しました – NickL

答えて

0

はい、これはあなたがそれを探しているもののような非同期呼び出しをサポートしていませんので、デフォルトの再来で問題であるモチベーションまで

https://github.com/gaearon/redux-thunk

スクロールReduxのを、サンク、それは基本的に正確な必要がありますあなたがここに投稿したのと同じコード。

::: EDIT :::私はあなたのコードを更新し、以下のコメントのオフに基づいて

私はこの問題の主な発生源の一つは小道具にマップ状態でアイテムのコンポーネントを接続したと思います。私はあなたがおそらくそれを必要とする/またはそれをしたいが、私はそれをもう少し明確にするために、コードを少しリファクタリングが、私は運び去ら得て、遠元からにそれを取ったかもしれませんしませんでした知っている

const mapStateToProps = (state, { id }) => { 
    var {text} = state.items.filter((x) => x.id === id)[0]; 
    return { 
    id: id, 
    text: text 
    }; 
}; 

const mapDispatchToProps = (dispatch) => { 
    return { 
    onRemove(id) { 
     setTimeout(() => { 
     dispatch({ 
      type: 'REMOVE', 
      id 
     }); 
    }, 0); 
    } 
    }; 
}; 

あなたが見てみたいと思っている場合は、ここに投稿してください。 【この問題に似]

https://jsfiddle.net/kriscoulson/ogkyspsp/

+0

ミドルウェアはアクションクリエイターを非同期で使用できるようにしていたと思っていましたが、ミドルウェアは舞台裏で何か魔法をしていますか?私は[こちらの例を更新しました](https://jsfiddle.net/nickkell/macmahne/5/)redux-thunkを使用するにはまだ動作していません... – NickL

+0

@NickL少し上の私の答えを更新ビット。私が最初に不明だった場合は申し訳ありません。私はあなたの元の質問から遠くに行ったかもしれません。しかし、それはreduxthunk – Enjayy

+0

なしsettimeoutで動作させるようにそれは店にそのコンポーネントを接続することの結果としてですか?私がそのようにした理由は、再描画を最小限に抑えるためにアプリケーションのパフォーマンスを向上させるためです(行とセルがストアに接続されたテーブル)。私は[このツリーの例](https://github.com/reactjs/redux/tree/master/examples/tree-view)に従っていました。 コンポーネントを店舗に接続したいのですが、これは可能ですか?最初にすべての子アイテムを削除するアクションをディスパッチする必要がありますか? – NickL

関連する問題