我知道这个问题以不同的方式被问了更多次,但我还没有找到“正确”的答案(也许只是没有),所以我正在寻找“最流畅”的答案。
简单的例子:
- 两个组成部分 -
LoginForm和Information - 用户必须提供他/她的登录信息,提交表格,然后他/她才有权“询问”信息(这应该在登录后自动完成)
项目结构如下:
+ actions |-- LoginAction |-- InfoAction + api |-- API + components |-- LoginForm |-- Information + stores |-- LoginStore |-- InfoStore
选项:
1.
LoginForm._onSubmit()电话LoginAction.login()LoginAction.login()API.login()使用回调/Promise调用,然后在成功登录的情况下调用InfoAction.requestInfo()
2.
LoginForm._onSubmit()电话API.login()- 如果
API.login()成功,它会调用LoginAction.loginSuccess()并且:- 要么
InfoAction.requestInfo()调用API.requestInfo() - 或者
API.requestInfo()然后调用InfoAction.infoSuccess()
- 要么
3.
LoginForm._onSubmit()电话LoginAction.login()InfoStore倾听LOGIN_OK行动并调用API.requestInfo()API.requestInfo()调用InfoAction.infoSuccess()并INFO_OK使用将要存储的特定信息的有效负载分派事件InfoStore
(4.)
调用 API/ServiceProvider 或 ActionCreatorscomponentWillMount或componentDidMount看起来本质上很糟糕。不是一个真正的(好的)选择,但为了完整起见,我把它放在这里。
我的评价:
1. 擅长基于回调/Promise的 JS 的“旧风格”,但似乎不是 Flux 方式,因为我们应该避免改变动作。只是一劳永逸。
2. 稍微打破“通量图” - 组件与 API 或 ServiceProviders 对话,而不是直接与 ActionCreators 对话。我不确定这是好是坏。它似乎是“单向”(好)并避免循环要求(好)。我个人更喜欢这个选项(特别是 2.2. 一个)
3. 我个人避免使用这种方法,因为这意味着 Store 会与 API/ServiceProvider 交谈,这会破坏“Flux 图”,但同样,我不知道它是否真的很糟糕(也许只是我不习惯 Flux 方式)做事)。甚至@fisherwebdev 似乎也可以接受(例如https://stackoverflow.com/a/26637579/5053194),但这真的是最好的方法吗?
4.坏,坏,坏!
问题
哪一个是“最好的”和/或是否有其他“最流畅”的选项可以做到这一点?