我刚刚开始学习和使用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?我希望我能正确解释一切://请给我任何建议。谢谢。
答案 0 :(得分:1)
我认为通常来说,您只有一棵与整个应用程序相关的sagas树,而不是针对不同页面/路由的多个root sagas。您只需将rootSaga作为中间件附加一次。
是的,当您的应用程序启动时,整个主题树就会启动,众生会观察动作。 Sagas与您的商店在全球范围内进行交互,因此让他们从您的应用程序开始在全球范围内有意义。
仅启动监视动作的sagas(使用take
,takeEvery
等)。在应用启动时,不应调用其他产生副作用或调用api的sagas。
创建类似于减速器和combineReducer
的无谓树也是正确的方法。