我们现在使用的框架是 react, redux + saga
目前正在做一个组件,需要单独放在一个包内。前段时间,根据大家的建议,发现 useReducer + useContext 可以基本取代 redux + redux store,试下来,还是不错的。
但是,我们以前都是使用 redux-saga,统一处理异步调用和相关逻辑。虽然 saga 使用起来也是费劲( unit test 贼难写),但是,功能还是很强大的。比如,集中化处理,代码都在一下,以及 在 saga function 内,还能够灵活的 dispath action(s),触发其它的相关异步操作。
现在组件在一个单独的包内,没有使用 redux store,应该也没有办法添加 redux-saga 了吧(还是说,可以继续添加 saga 中间件)?那么,该怎么优雅的处理这些异步调用么?全用 hooks 么?
以某流程举个例子:
现在有一个用 redux 包装好的高阶组件,上面有一个 button, 点击 button,发送 action - 从某服务器取数据,然后 saga 监听到该 action,执行这个取数据的异步调用。调用成功取到数据后,再次发送 action,进行二次处理,等等。最后,发送一个 action,把最终结果更新到 store/state 。然后,前面的组件接受到更新,展示出来。
不知道没有了 saga 后,这一套连续的操作,有没有更好的或者新的处理方法?
特来请教大家。谢谢
1
Loserzhu 2021-07-03 08:00:35 +08:00 via Android
我们在用 react-query,逐步替换掉 saga 。你可以了解下。
|
2
Hanggi 2021-07-03 08:36:45 +08:00
recoil 了解下。
redux 太罗嗦了,替代方案很多。 |
3
duan602728596 2021-07-03 08:48:18 +08:00
redux 本来就不适合在组件里用。redux 适合用来保存全局状态,跨组件调用方法、获取变量。我的项目里用的是 redux-toolkit,感觉这个用起来比 redux-saga 舒服多了。
redux 就好比电线、组件就好比电器。电器电源线插到插座上就能用,但是不代表电器里面的所有线路都要接到电源线上。就像星际里的卡拉,虽然神圣的卡拉连接着每一个人,但是每个人的思想、状态还是有区别的。 你这种流程,完全可以用一个 hook 来代替,比如这样: ```javascript const { loading, // 加载状态 getData, // 获取数据的方法,可以用来重新获取数据 data, // 数据 ... // 其他状态,比如数据总数、分页之类的 } = useRequest({ /* 配置 */ }); ``` 状态全放在 redux 里这种用法,我以前在项目里碰到过,我接手后给我留下一堆问题。比如有定义了一堆的 action type,导致一个流程的代码跳来跳去,action type 看不出来是做什么的;还有就是组件的所有状态被扔到 redux 里边,导致组件不能被复用的。 |
4
laogui 2021-07-03 08:58:13 +08:00 via Android
mobx,简单实用。
|
5
kangyan 2021-07-03 10:14:09 +08:00
dva
|
6
ericgui 2021-07-03 13:28:27 +08:00
redux 是管理全局的 state,context 是一个小型的区域性的 state,可以混合起来,
比如一个大项目,当然用 redux,但大项目里有一个比较独立的模块,可以用 context |
7
rioshikelong121 2021-07-03 17:11:16 +08:00
要继续用 redux 的话可以引入 redux-toolkits 减少了大量的样板代码。
然后 redux-toolkits 最近出了个 rtk-query 的东西 —— 定位和 swr.js 类似,也可以用用。 |
8
AnnatarHe 2021-07-04 23:47:51 +08:00
我个人的经验是:
真的超大型项目,操作逻辑非常复杂的情况才会上 redux + redux-saga 规模略小确实是挺麻烦。 比较中小的项目是纯 hooks,数据状态同步全依赖后端数据和缓存,像是上文中的 react-query 。 中型项目最近在尝试 recoil 感觉还不错。 顺便说一句,saga 写单元测试很方便呀,为什么会觉得很麻烦,只要测主逻辑就好了哎~ |
9
h1104350235 2021-07-05 09:21:37 +08:00
同问,感觉 React 的选择有点多
|
10
yazoox OP 这个,为什么大家都在说 redux 的问题,可是我的问题是 saga 哎。
redux 现在好办,用 useContext 取代 redux 的 store,但是可以继续用 @reduxjs/toolkit 辅助创建对应的 actions & reducer,还是挺方便的。 就是 saga (redux-saga) 现在找不到比较好的方法...... |