启动应用程序时我应该运行所有传奇吗?

时间:2018-08-15 08:57:48

标签: reactjs redux redux-saga

我刚刚开始学习和使用redux-saga,起初我认为它是这样工作的:首先您执行与saga连接的操作,然后saga检测到操作,调用返回数据的api并由saga返回此数据减速器。我构建了2个测试saga文件和一个root saga(我想制作rootSaga,例如CombineReducer),所以这是我的rootSaga:

import * as SpreadsheetSagas         from "../pages/spreadsheet/containers/spreadsheet/spreadsheet.saga";
import * as SpreadsheetFilterSagas   from "../pages/spreadsheet/containers/spreadsheet_filter/spreadsheet_filter.saga";

export default function* rootSaga() {
  yield all([
    ...Object.values(SpreadsheetSagas),
    ...Object.values(SpreadsheetFilterSagas)
  ].map(fork))
}

这是我的传奇功能之一:

export function* getData() {
   const response = yield call(ApiService.get);
   const payload = response ? response.data : {};
   //send returned object back to reducer as payload:
   yield put({ type: 'GET_MOCK_DATA', payload});
}

和我的商店文件夹如下:

const middleWare = [];

// Setup Redux-Saga.
const sagaMiddleware = createSagaMiddleware();
middleWare.push(sagaMiddleware);

const store = createStore(rootReducer, {}, 
compose(applyMiddleware(...middleWare)));

// Initiate the root saga.
sagaMiddleware.run(rootSaga);

因此,当我运行我的应用程序时,它将调用每个saga函数-这是实现sagas的正确方法:?还是我应该有几个rootSaga文件,这些文件将取决于当前页面,然后在我打开页面时运行适当的rootSaga?我希望我能正确解释一切://请给我任何建议。谢谢。

1 个答案:

答案 0 :(得分:1)

我认为通常来说,您只有一棵与整个应用程序相关的sagas树,而不是针对不同页面/路由的多个root sagas。您只需将rootSaga作为中间件附加一次。

是的,当您的应用程序启动时,整个主题树就会启动,众生会观察动作。 Sagas与您的商店在全球范围内进行交互,因此让他们从您的应用程序开始在全球范围内有意义。

仅启动监视动作的sagas(使用taketakeEvery等)。在应用启动时,不应调用其他产生副作用或调用api的sagas。

创建类似于减速器和combineReducer的无谓树也是正确的方法。