Я использую react, redux, saga и router v4.
Я хочу сделать перенаправление внутри своей саги, но не знаю, как получить доступ к объекту history, поскольку я использую BrowserRouter.
То, что я хочу сделать, будет выглядеть примерно так:
export function * callWS (action) {
const result = yield call(data, ws)
if (result.status === 201) {
yield call(history.push, '/success')
}
}
Но поскольку я использую BrowserRouter, я никогда не создавал этот объект history.
Есть мысли о том, как это сделать?





Я столкнулся с подобной проблемой, и я придумал это решение ..
в вашем app.js создайте историю и экспортируйте ее:
import createHistory from 'history/createBrowserHistory';
const history = createHistory();
// ...
export { history };
Затем в своих сагах вы можете создать функцию forwardTo, которая обрабатывает навигацию:
import { call, fork, takeLatest, cancel, take } from 'redux-saga/effects';
import { history } from 'app';
function* myFunction() {
try {
// do something
yield call(forwardTo, '/');
} catch(e){
// Do something
}
}
export default function* defaultSaga() {
const submitWatcher = yield fork(takeLatest, SOMETHING, submitForm);
yield take(LOCATION_CHANGE);
yield cancel(submitWatcher);
}
function forwardTo(location) {
history.push(location);
}
Если вы используете
react-router-reduxв своем приложении, вы можете импортировать действиеputreplaceиз этого пакета.