V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wly19960911
V2EX  ›  问与答

初学 redux ,想问问 redux 存在异步回调这个功能吗?

  •  
  •   wly19960911 · 2019-03-11 14:22:11 +08:00 · 3090 次点击
    这是一个创建于 2110 天前的主题,其中的信息可能已经有所发展或是发生改变。
    稍微对比了下 mobx 和 redux,redux 的 action 好像没法进行回调,难道是说所有的状态必须放到 reducer 里面?

    这样的话很多状态是没必要进入管理的,那么我该怎么处理。

    比如说一个场景,当你点击 上传 或者 表单请求 之后,按钮要修改为 disabled, 等请求完毕之后我再修改下状态,这种非全局的状态我怎么管理更好?监听生命周期?
    第 1 条附言  ·  2019-03-11 15:21:02 +08:00
    只需要用 redux-chunk + async/await 来处理即可,action 返回的是 promise 就能进行回调了。

    另外: https://github.com/redux-saga/redux-saga/issues/1188

    刚玩 redux-saga 就碰到类型系统的 bug,看来不支持 ts 玩,我还是乖乖用 chunk 吧,不想给自己添负担了
    21 条回复    2019-03-11 23:22:58 +08:00
    maichael
        1
    maichael  
       2019-03-11 14:33:04 +08:00
    redux-thunk
    013231
        2
    013231  
       2019-03-11 14:35:51 +08:00
    1. 如果你希望 Redux Action 觸發某些動作, 可以考慮 redux-sage: https://github.com/redux-saga/redux-saga
    2. 不是所有的狀態都要放到 Redux 里. 像"等待請求完成時修改按鈕為 disabled"這樣相當局部的狀態, 完全沒有必要使用 Redux. https://redux.js.org/faq/organizing-state#do-i-have-to-put-all-my-state-into-redux-should-i-ever-use-react-s-setstate
    Kilerd
        3
    Kilerd  
       2019-03-11 14:37:40 +08:00 via iPhone
    Redux saga
    wly19960911
        4
    wly19960911  
    OP
       2019-03-11 14:42:11 +08:00
    @maichael #1 redux-thunk 我看了下,调用 dispatch,返回的是 dispatch 里面的东西或者 action return 的东西,那么怎么控制一个 promise 的流程,难道自己写?或者 action 直接用 async/await 来写?
    alexsunxl
        5
    alexsunxl  
       2019-03-11 14:43:26 +08:00
    组件内部状态(或者父子这种近的) 用 this.setState 就可以了。

    跨得比较远的组件之间 才需要用到 专门的状态管理工具
    grewer
        6
    grewer  
       2019-03-11 14:46:07 +08:00   ❤️ 1
    我之前用 redux-promise 的时候
    中间层是个 promise ,这时候调用 action 时 ,返回的就是该 promise
    不过控制要具体,细分 还是推荐 saga
    wly19960911
        7
    wly19960911  
    OP
       2019-03-11 14:49:04 +08:00
    @alexsunxl #5 这个也不是组件内部状态,如果我是个人信息,我改了昵称,那么这个表单数据就变成了全局状态,肯定要调用 redux 了吧,难道是先自己调用 api 然后通过 action 进行全局更新?看了些 demo 都感觉写的太复杂了,包括 api 调用一套全部写进 action 了。
    alexsunxl
        8
    alexsunxl  
       2019-03-11 14:53:51 +08:00
    @wly19960911
    这种就属于跨得比较远的呗
    觉得 redux 复杂,就用 mobx 啊。
    大型项目我也是用 mobx 的,因为是在团队里,考虑到方便其他人快速上手
    wly19960911
        9
    wly19960911  
    OP
       2019-03-11 14:55:34 +08:00
    @grewer #6
    @Kilerd #3 好吧,我再细看看 redux-saga,如果能有一个回调的例子给我就更好了,粗略看了下官方文档,基本都只是简单介绍了 action 里面怎么用,但是组件怎么回调还没有看见......
    maichael
        10
    maichael  
       2019-03-11 15:00:06 +08:00   ❤️ 1
    @wly19960911 #4 thunk 本质上就是给一个异步函数传入了 dispatch,你可以在里面调用 dispatch 发送 action, 然后修改全局的状态。
    wly19960911
        11
    wly19960911  
    OP
       2019-03-11 15:01:01 +08:00
    @alexsunxl #8 嗯,我知道,其实整体流程我都能整理,mobx 的理念也是我在 angular 里面自己实现的状态管理理念一样,也和 vuex 类似。

    但是到了 redux 的概念就复杂了很多,文档的内容比我想象中少很多,我自己理解能力也弱。
    maichael
        12
    maichael  
       2019-03-11 15:01:38 +08:00
    @wly19960911 #9 redux-saga 没有管你自己组件怎么去响应状态变化的,它只帮你管理这些异步方法以及修改全局 store 的数据,然后你自己的组件需要去响应这些全局状态的改变。
    zzNucker
        13
    zzNucker  
       2019-03-11 15:01:52 +08:00   ❤️ 1
    redux-saga 然后你会发现蛋疼的很
    maichael
        14
    maichael  
       2019-03-11 15:02:51 +08:00
    @maichael #12 所有 saga 理论上来说跟 thunk 做的事情没什么区别。
    wly19960911
        15
    wly19960911  
    OP
       2019-03-11 15:03:18 +08:00
    @maichael #10 那就能理解了,感谢。
    alexsunxl
        16
    alexsunxl  
       2019-03-11 16:47:39 +08:00
    看过 elm 的 demo 和视频之后, 就觉得 redux 很找人烦。 没有语言结构和 api 层面的基础, 非要学人家绕来绕去, 太反人类。
    从此坚决用 mobx
    wly19960911
        17
    wly19960911  
    OP
       2019-03-11 16:58:30 +08:00
    @alexsunxl #16 我可以不用,但是我不能不学(跑

    简单的场景也很多,是没必要搞这么复杂就是,我学下来感觉,整个就很像 MVC 设计模式的味道,view 触发了 controller,controller 开始触发各种 action,整体下来做了个简单的事务。

    如果可以改成 controller + 注解 action 的模式我感觉负担会少很多,为了理解绕来绕去的例子,我算是花了不少功夫。
    alexsunxl
        18
    alexsunxl  
       2019-03-11 17:09:38 +08:00
    @wly19960911
    完全可以不学, 你去看看 elm 的视频就知道了, 没有对比没有伤害
    wengjin456123
        19
    wengjin456123  
       2019-03-11 19:45:32 +08:00 via Android
    redux redux saga 我认为太繁琐了…文档这种也没 vuex mobx 舒服
    wengjin456123
        20
    wengjin456123  
       2019-03-11 19:46:09 +08:00 via Android
    不过已经学会…下个项目不用了
    hirasawayui
        21
    hirasawayui  
       2019-03-11 23:22:58 +08:00
    mobx vuex 真香,我再也不会用 redux 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3468 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:24 · PVG 12:24 · LAX 20:24 · JFK 23:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.