我在做一个React & Redux项目。本项目采用webpack开发中间件和热中间件进行热重装.
在我将Redux添加到该项目并将Saga中间件添加到redux商店之后。似乎每当我更改saga代码时,热重加载都会中断并显示一条错误消息:
Provider>不支持动态更改
store
。您很可能会看到此错误,因为您更新到Redux2.x并响应Redux2.x,不再自动重新加载热减速器。有关迁移说明,请参见https://github.com/reactjs/react-redux/releases/tag/v2.0.0。
据我所知,Saga使用的是发电机,它依赖于时间。是否可以用Sagas热重新加载页面?就像Redux减速器在热重装过程中更换自己一样。
谢谢!
发布于 2016-11-24 10:08:37
我正在用redux和redux-saga做一个项目(但没有反应)。我使用sagaMiddleware.run()实现了sagas的热重加载,但是您必须处理模块重新加载和替换减速器和sagas,如您提供的链接(https://github.com/reactjs/react-redux/releases/tag/v2.0.0)中所示。
import { createStore } from 'redux';
import rootReducer from '../reducers/index';
import getSagas from '../sagas';
export default function configureStore(initialState) {
const sagaMiddleware = createSagaMiddleware()
const store = createStore(rootReducer, initialState, applyMiddleware(sagaMiddleware));
let sagaTask = sagaMiddleware.run(function* () {
yield getSagas()
})
if (module.hot) {
// Enable Webpack hot module replacement for reducers
module.hot.accept('../reducers', () => {
const nextRootReducer = require('../reducers/index');
store.replaceReducer(nextRootReducer);
});
module.hot.accept('../sagas', () => {
const getNewSagas = require('../sagas');
sagaTask.cancel()
sagaTask.done.then(() => {
sagaTask = sagaMiddleware.run(function* replacedSaga (action) {
yield getNewSagas()
})
})
})
}
return store;
}
需要注意的一件重要事情是getSagas()
函数。它返回一个新创建的sagas生成器对象数组,您不能从一些已经在运行的sagas数组中得到一些预创建对象。如果您只在一个模块中创建此数组,则可以直接使用常量数组,但如果您从不同模块构建该数组,则必须确保从所有模块重新创建saga,因此更好的方法是所有模块导出创建函数,而不是导出固定的saga或saga数组。例如,它可以是这样的函数:
export default () => [
takeEvery(SOME_ACTION, someActionSaga),
takeEvery(OTHER_ACTION, otherActionSaga),
]
显然,所有sagas都是从一开始就重新启动的,如果您有一个具有内部状态的复杂sagas,则会丢失当前状态。
一种非常类似的方法是使用动态saga代替调用sagaMidleware.run()
,这是一个非常相似的解决方案,但是您可以重新加载saga的子集并以不同的方式处理它们。有关更多信息,请参见https://gist.github.com/mpolci/f44635dc761955730f8479b271151cf2
发布于 2019-03-05 11:15:24
更新redux-saga
包的1.0.0
版本和更新版本:
使用@mpolci解决方案,只需更改
sagaTask.done.then(() => {
至
sagaTask.toPromise().then(() => {
一切开始都一样。
见任务文档
https://stackoverflow.com/questions/37148592
复制相似问题