现在有没有比较好的,快速简单的替代 redux-saga 的使用方法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX    React

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

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

    我们现在使用的框架是 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     Solana     5787 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 06:32 PVG 14:32 LAX 23:32 JFK 02:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86