首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Redux Saga热重装

Redux Saga热重装
EN

Stack Overflow用户
提问于 2016-05-10 20:41:55
回答 2查看 7.5K关注 0票数 24

我在做一个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减速器在热重装过程中更换自己一样。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-24 10:08:37

我正在用redux和redux-saga做一个项目(但没有反应)。我使用sagaMiddleware.run()实现了sagas的热重加载,但是您必须处理模块重新加载和替换减速器和sagas,如您提供的链接(https://github.com/reactjs/react-redux/releases/tag/v2.0.0)中所示。

代码语言:javascript
运行
复制
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数组。例如,它可以是这样的函数:

代码语言:javascript
运行
复制
export default () => [
  takeEvery(SOME_ACTION, someActionSaga),
  takeEvery(OTHER_ACTION, otherActionSaga),
]

显然,所有sagas都是从一开始就重新启动的,如果您有一个具有内部状态的复杂sagas,则会丢失当前状态。

一种非常类似的方法是使用动态saga代替调用sagaMidleware.run(),这是一个非常相似的解决方案,但是您可以重新加载saga的子集并以不同的方式处理它们。有关更多信息,请参见https://gist.github.com/mpolci/f44635dc761955730f8479b271151cf2

票数 42
EN

Stack Overflow用户

发布于 2019-03-05 11:15:24

更新redux-saga包的1.0.0版本和更新版本:

使用@mpolci解决方案,只需更改

sagaTask.done.then(() => {

sagaTask.toPromise().then(() => {

一切开始都一样。

任务文档

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37148592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档