レデューサーは純粋である必要があるため、そこで新しいウィンドウを開こうとするべきではありません。代わりに、すべてのフェッチ要求に対してミドルウェアを作成する必要があります。その後、要求が成功すると、リダイレクトしたり、モーダルを開いたり、必要なものをすべて開いたりできます。次に例を示します。
import { push } from 'react-router-redux';
export default fetchMiddleware() {
return ({ dispatch, getState }) => next => action => {
if (!action.fetch) {
return next(action);
}
const promise = fetch(action.fetch, { someOptionsHere })
.then(response => response.json())
.then(data => {
if (whateverLogicYouNeedToRedirect) {
return next(push('/go/somewhere/else'));
}
next({type: action.type, response: data});
})
.catch( error => {
// check for errors in the response and
// maybe redirect to login here
next({type: 'FETCH_FAIL', error });
});
return promise;
};
}
これは、API からデータをフェッチし、JSON 応答を解析し、ロジックに基づいて別の URL にリダイレクトしたり、フェッチ応答でアクションを返したりする単純なミドルウェアです。アクション クリエーターからこのミドルウェアを次のように使用します。 :
export function loadData() {
return {
type: 'LOAD_SOMETHING',
fetch: '/api/something/here',
};
}
params を受け入れるようにミドルウェアを改善し、post
、put
、delete
requests 、および必要なものを定義する方法を改善する必要がありますが、これでアイデアが得られることを願っています。