V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX  ›  React

现在有没有比较好的,快速简单的替代 redux-saga 的使用方法?

  •  
  •   yazoox · 2021-07-03 07:05:41 +08:00 · 2686 次点击
    这是一个创建于 999 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们现在使用的框架是 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 后,这一套连续的操作,有没有更好的或者新的处理方法?

    特来请教大家。谢谢

    10 条回复    2021-07-05 11:12:03 +08:00
    Loserzhu
        1
    Loserzhu  
       2021-07-03 08:00:35 +08:00 via Android
    我们在用 react-query,逐步替换掉 saga 。你可以了解下。
    Hanggi
        2
    Hanggi  
       2021-07-03 08:36:45 +08:00
    recoil 了解下。

    redux 太罗嗦了,替代方案很多。
    duan602728596
        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 里边,导致组件不能被复用的。
    laogui
        4
    laogui  
       2021-07-03 08:58:13 +08:00 via Android
    mobx,简单实用。
    kangyan
        5
    kangyan  
       2021-07-03 10:14:09 +08:00
    dva
    ericgui
        6
    ericgui  
       2021-07-03 13:28:27 +08:00
    redux 是管理全局的 state,context 是一个小型的区域性的 state,可以混合起来,
    比如一个大项目,当然用 redux,但大项目里有一个比较独立的模块,可以用 context
    rioshikelong121
        7
    rioshikelong121  
       2021-07-03 17:11:16 +08:00
    要继续用 redux 的话可以引入 redux-toolkits 减少了大量的样板代码。

    然后 redux-toolkits 最近出了个 rtk-query 的东西 —— 定位和 swr.js 类似,也可以用用。
    AnnatarHe
        8
    AnnatarHe  
       2021-07-04 23:47:51 +08:00
    我个人的经验是:
    真的超大型项目,操作逻辑非常复杂的情况才会上 redux + redux-saga 规模略小确实是挺麻烦。
    比较中小的项目是纯 hooks,数据状态同步全依赖后端数据和缓存,像是上文中的 react-query 。
    中型项目最近在尝试 recoil 感觉还不错。

    顺便说一句,saga 写单元测试很方便呀,为什么会觉得很麻烦,只要测主逻辑就好了哎~
    h1104350235
        9
    h1104350235  
       2021-07-05 09:21:37 +08:00
    同问,感觉 React 的选择有点多
    yazoox
        10
    yazoox  
    OP
       2021-07-05 11:12:03 +08:00
    这个,为什么大家都在说 redux 的问题,可是我的问题是 saga 哎。
    redux 现在好办,用 useContext 取代 redux 的 store,但是可以继续用 @reduxjs/toolkit 辅助创建对应的 actions & reducer,还是挺方便的。
    就是 saga (redux-saga) 现在找不到比较好的方法......
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5493 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:20 · PVG 16:20 · LAX 01:20 · JFK 04:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.