reactjs - 在大型项目中使用 Redux Saga
问题描述
我是 reactjs 新手,正在尝试学习 saga。
我已经建立了一个根传奇文件,如下所示。
import { all } from 'redux-saga/effects';
import { watchBookFetchRequest } from './bookSaga'
import { watchAuthRequest, watchIsLoggedInRequest, watchLogoutRequest } from './authSaga'
export default function* rootSaga() {
yield all([
watchAuthRequest(),
watchBookFetchRequest(),
watchIsLoggedInRequest(),
watchLogoutRequest()
]);
}
对于每个模块,我创建了一个单独的 saga 文件,并将所有这些相关操作放在该文件中。
最后,我采取了所有这些行动,并将它们组合成 root saga。
我假设,当项目变得更大、更复杂并且有很多模块时,所有的观察者都将以与上面代码相同的方式添加
export default function* rootSaga() {
yield all([
watchRequest1(),
watchRequest2()
.
.
.
watchRequestn()
]);
}
也就是说,根 saga 将包含相当多的观察者 - 用于登录、仪表板、书籍、帐户等的观察者。
这是这样做的正确方法吗?
解决方案
组织 sagas 很像组织 reducer。你也可能会开始在根减速器中使用 combineReducers 并使用所有减速器的平面列表,它甚至可以很好地扩展。一长串reducers/sagas 通常不会导致很多问题。
然而,最终在这两种情况下,您可能想要引入树结构。例如,如果您的应用程序如下所示:
+-- services/
| +-- live-updates/
| | +-- live-updates-saga.js
| +-- local-storage/
| | +-- local-storage-saga.js
| +-- services-saga.js
+-- sections/
| +-- home/
| | +-- home-saga.js
| +-- contacts/
| | +-- contacts-saga.js
| +-- sections-saga.js
+-- root-saga.js
你可以这样运行你的 sagas:
// root-saga.js
function* rootSaga () {
yield all([
fork(servicesSaga),
fork(sectionsSaga),
])
}
// services-saga.js
function* servicesSaga () {
yield all([
fork(liveUpdatesSaga),
fork(localStorageSaga),
])
}
// sections-saga.js
function* sectionsSaga () {
yield all([
fork(homeSaga),
fork(conactsSaga),
])
}
// live-updates/local-storage/local-storage-saga.js
function* liveUpdatesSaga () {
yield takeEvery(XYZ, xyzSaga)
}
我不会将任何一种解决方案称为“正确”解决方案。只需尝试什么更适合您。
推荐阅读
- javascript - 如何使用 POST 请求实现 http-equiv/refresh?
- javascript - 使用 Node JS 从 MySQL 数据库中删除一行
- node.js - Nodejs从函数返回结果是空的承诺
- php - 如何为某些 WordPress 用户角色隐藏 Adsense Java 脚本?
- python - 如何删除 NDB 模型中包含特定属性的实体?
- laravel - Nginx 多位置 laravel 项目
- javascript - 气体计算——找不到错误
- android - 为什么在最小化应用程序并返回后会显示导航栏?
- python - Django 错误:类型对象“Invoice_Line”没有属性“对象”
- javascript - 来自表单输入的Javascript多维数组循环