为啥 redux action 需要能够 serializable? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jchnxu
V2EX    React

为啥 redux action 需要能够 serializable?

  •  
  •   jchnxu 2022-0-27 21:43:29 +08:00 2156 次点击
    这是一个创建于 1111 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants

    While it is certainly possible to manually create action objects everywhere, and write each type value by hand, defining reusable constants makes maintaining code easier.

    我是真的不觉得 easy ,95% 的 action 都是用那么一两次。有没有同学遇到过 action 这个抽象真的有用的?

    ---- 背景 ----

    写 redux action 写的很烦。zustand 这种更简单的,也需要 action 。所以干脆传了一个统一的匿名函数,利用 closure 直接拿了很多变量。但就报了这个 warning

    reducer: (state, action) => { if (!state) { throw new Error("root state should not be empty"); } let newState = { ...state }; if (action.type === "func") { newState = produce(state, action.func); // import produce from 'immer' } return newState; }, 
    10 条回复    2024-04-17 10:31:45 +08:00
    sweetcola
        1
    sweetcola  
       2022-09-27 22:09:53 +08:00
    As with state, serializable actions enable several of Redux's defining features, such as time travel debugging, and recording and replaying actions.
    标题下面第一句就回答了

    https://react-redux.js.org/tutorials/quick-start#how-to-read-this-tutorial
    > For this tutorial, we assume that you're using Redux Toolkit and React Redux together, as that is the standard Redux usage pattern.

    RTK(Redux Toolkit) 已经是目前的 Redux 的标准写法了,该抛弃以前的这种旧写法了。
    jchnxu
        2
    jchnxu  
    OP
       2022-09-27 22:30:22 +08:00
    RTK 也要创建 action 啊,只是没有字符串而已。或者我应该这么问,time travel 其实 直接用 state diff 就能做了,抽象一层 action 的好处是?

    主要是我 95% 的 action 就是 SET_LOADING, SET_XXX 。 很想直接写 state.isLoading = ...

    即便是复杂一点的,一个 normalized 后的 state ,也能直接写。

    ```
    getUsers => state.topUserIds.map(u => state.userStore[u.id]);

    ```

    找到一篇作者的回答,但这并不能太说服我。https://github.com/reduxjs/redux/issues/628#issuecomment-137547668
    4BVL25L90W260T9U
        3
    4BVL25L90W260T9U  
       2022-09-27 23:15:55 +08:00
    精力还是别放在 redux 这种过时的东西上了……
    Dotennin
        4
    Dotennin  
       2022-09-28 00:11:43 +08:00
    确实烦, 一般会通用的 action, 作为 state 接口互动
    yyfearth
        5
    yyfearth  
       2022-09-28 04:40:53 +08:00
    @jchnxu 这个 state 不是 observable 或者 proxy 啥的
    所以你不能直接 state.isLoading = 因为没代码能够知道你做了这个修改 然后去触发
    必须通过一个方法来处理并且去触发

    如果你喜欢 state.isLoading=这样 你要换别的 state manager
    不少新的 lib 都是用 observable 或者 proxy 或者生产代码的方法支持 你喜欢的这种方法
    Jzdoxc
        6
    Jzdoxc  
       2022-09-28 09:20:07 +08:00 via iPhone
    @ospider 现在最常用的是什么呢,可否给个关键词
    ericgui
        7
    ericgui  
       2022-09-28 09:26:34 +08:00
    @ospider .....

    你确定吗?
    mxT52CRuqR6o5
        8
    mxT52CRuqR6o5  
       2022-09-28 09:52:59 +08:00 via Android
    我这么说吧,redux 的那些都是针对 redux devtools 设计的,虽然写起来很麻烦,但是 devtools 真的很好用
    像 mobx 写起来很爽,但 devtools 用起来真的一言难尽
    jchnxu
        9
    jchnxu  
    OP
       2022-09-28 13:45:20 +08:00
    @yyfearth #5 state.isLoading 只是打一个比方,意思是能不能不用抽象 action ,直接改 state 。或者说等到必要的时候再抽象 action
    jchnxu
        10
    jchnxu  
    OP
       2024-04-17 10:31:45 +08:00
    兄弟们 zustand 挺好的。我的问题就是 98% 的时候用不上一个 sub pub ,只是简单的 get set

    另外满足我的一个需求是,在 react 之外调用也挺方便的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     904 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 84ms UTC 22:35 PVG 06:5 LAX 15:35 JFK 18:35
    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