Reactjs 由于位置变化太早,Redux Saga停止
因此,当路由加载时,我将动态地注入SagasReactjs 由于位置变化太早,Redux Saga停止,reactjs,redux,react-router,react-router-redux,redux-saga,Reactjs,Redux,React Router,React Router Redux,Redux Saga,因此,当路由加载时,我将动态地注入Sagas path: '/home', name: 'home', getComponent(nextState, cb) { require.ensure([], require => { let HomePageReducer = require('./containers/HomePage/reducer').default; let HomePageSagas = require('
path: '/home',
name: 'home',
getComponent(nextState, cb) {
require.ensure([],
require => {
let HomePageReducer = require('./containers/HomePage/reducer').default;
let HomePageSagas = require('./containers/HomePage/sagas').default;
let HomePage = require('./containers/HomePage').default;
injectReducer('home', HomePageReducer);
injectSagas(HomePageSagas);
cb(null, HomePage);
})
},
sagas
是这样的:
export function injectAsyncSagas(store) {
return (sagas) => sagas.map(store.runSaga);
}
Start mySagaFunction
Stop mySagaFunction
其中,store.runSaga
是在商店创建期间创建的sagaMiddleware.run
当路线装载时,传奇成功开始。它在倾听行动
export function* mySagaFunction() {
console.log("Start mySagaFunction");
while (true) {
const watcher = yield race({
loadRepos: take(SOME_HOME_PAGE_ACTION),
stop: take(LOCATION_CHANGE), // stop watching if user leaves page
});
if (watcher.stop) {
console.log("Stop mySagaFunction", watcher.stop);
break;
}
//other statements here to handle SOME_HOME_PAGE_ACTION
}
当我加载路由时,“启动mySagaFunction”会得到控制。如果我发送一些\u主页\u操作,它会成功地执行它必须执行的任何操作。
当我离开页面时,react路由器调用LOCATION_CHANGE,Saga控制台“Stop mySagaFunction”表示它成功退出while循环
然后我去另一条路线,然后回到这条路线。
正如预期的那样,此时位置更改由路由器发送。但传奇故事开始了,然后马上就停止了。我的控制台是这样的:
export function injectAsyncSagas(store) {
return (sagas) => sagas.map(store.runSaga);
}
Start mySagaFunction
Stop mySagaFunction
在Redux开发工具中,我只看到一个位置改变。我该如何理解这一传奇故事为何开始并立即停止?只有当我回到路线上才会发生
我想可能是地点变更晚了。但不是。在我的减速器里,我安慰了动作型。减速器首先被调用,位置改变,传奇开始,然后传奇停止
我正在使用链接
在页面之间导航。我也尝试了browserHistory.push(url)
和dispatch(push(url))
。同样的结果
注:我从中获得了注入传奇的代码。我只使用了这段代码,并没有使用样板文件本身。我运行了样板文件,但这个错误没有发生在那里。区别在于:
- 它正在使用syncHistoryWithStore中的
。我的整个商店不是一成不变的,所以我不需要它selectLocationState
- 它使用自己的
而不是routeReducer
fromrouterReducer
。我不知道为什么,可能是因为完整的不可变存储react router redux
无论如何,在锅炉板代码中,我删除了上述两点,但场景仍然没有发生。路线有一个单一的重定向,因此位置更改将被发送两次,从而取消了传奇
{
path: 'home',
getComponent(nextState, cb) {
require.ensure([], require => {...})
},
indexRoute: {
onEnter: (nextState, replace) => replace('/home/A')
}
}
解决此问题的方法:
我在onLeave钩子中为每个注入传奇的页面发送一个LEAVE_页面操作
onLeave: ()=> {
store.dispatch({type: LEAVE_HOME_PAGE});
}
在这一特殊行动的传奇观察中:
const watcher = yield race({
loadRepos: take(SOME_HOME_PAGE_ACTION),
stop: take(LEAVE_HOME_PAGE), // stop watching if user leaves page
});
“你曾经解决过这个问题吗?”安德烈·伊齐佐夫(AndreyCizov)是的,发布了一个答案。这就是我想到的。任何其他更好的解决方案都是值得赞赏的。我对saga收到自己的位置变更事件(该saga是从Onener发送的结果)有一个问题。虽然我的解决方案是一样的。非常感谢你的快速回答。