启动应用程序时我应该 运行 所有 saga 吗?
Should I run all saga when launch app?
我刚开始学习和使用redux-saga,起初我以为它是这样工作的:首先你做一个连接到saga的动作,然后saga检测动作,调用api returns data and saga returns 这个数据到reducer。我构建了 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?我希望我正确解释了一切:/请给我任何建议。谢谢。
我认为通常您只有一棵与整个应用程序相关的 sagas,而不是针对不同 pages/routes 的多个根 sagas。你只需附加一次 rootSaga,作为中间件。
所以是的,当您的应用程序启动时,整个 sagas 树都会启动,并且会观察动作。 Sagas 在全球范围内与您的商店互动,因此他们在全球范围内开始使用您的应用程序是有意义的。
只启动监视动作的 sagas(使用 take
、takeEvery
等)。其他产生副作用或调用 api 的 sagas 不应在您的应用启动时调用。
创建类似于 reducer 的 sagas 树,combineReducer
也是正确的方法。
我刚开始学习和使用redux-saga,起初我以为它是这样工作的:首先你做一个连接到saga的动作,然后saga检测动作,调用api returns data and saga returns 这个数据到reducer。我构建了 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?我希望我正确解释了一切:/请给我任何建议。谢谢。
我认为通常您只有一棵与整个应用程序相关的 sagas,而不是针对不同 pages/routes 的多个根 sagas。你只需附加一次 rootSaga,作为中间件。
所以是的,当您的应用程序启动时,整个 sagas 树都会启动,并且会观察动作。 Sagas 在全球范围内与您的商店互动,因此他们在全球范围内开始使用您的应用程序是有意义的。
只启动监视动作的 sagas(使用 take
、takeEvery
等)。其他产生副作用或调用 api 的 sagas 不应在您的应用启动时调用。
创建类似于 reducer 的 sagas 树,combineReducer
也是正确的方法。