例如,如果我有登录缩减器和用户图标缩减器。当我登录时,我想更新用户图标以及存储用户的信息。我被困在两个选择之间:
首先是导出USER_LOGIN操作并同时使用login reducer和user icon reducer处理USER_LOGIN操作。
第二种方法是在action和reducer之间进行1对1的映射(一种类型的action只属于一个reducer)。我们有登录缩减器句柄USER_LOGIN,然后使用Saga / Thunk我们向用户图标缩减器发送副作用UPDATE_USER_ICON。
哪一个是更好的做法?我个人赞成第二种方法。
答案 0 :(得分:4)
引用Redux FAQ entry on dispatching multiple actions:
对于如何构建行动没有具体规则。使用像Redux Thunk这样的异步中间件肯定会启用一些方案,例如连续调度多个不同但相关的操作,调度操作以表示AJAX请求的进展,根据状态有条件地调度操作,甚至调度操作并立即检查更新的状态之后。
一般来说,询问这些行为是否相关但是独立,或者实际上应该表示为一个行动。做适合自己情况的事情,但尝试平衡减速器的可读性和动作日志的可读性。例如,包含整个新状态树的操作会使您的reducer成为一个单行,但缺点是现在您没有发生更改的原因,因此调试变得非常困难。另一方面,如果您在循环中发出操作以保持细化,则表明您可能想要引入以不同方式处理的新操作类型。
尽量避免在您关注性能的地方连续多次同步调度。有许多插件和方法可以批量调度。
答案 1 :(得分:3)
我会说你的第一种方法更好,这是我常用的方法。是的,当多个Reducer采用相同的操作类型时,它可能会影响代码的可读性,但它有助于保持代码不那么冗长(这是我对React生态系统的主要抱怨)和一点性能。像登录这样的操作不会对性能产生巨大影响,但是当我对用户操作进行API调用时,我只是在多个reducers中处理相同的操作类型。为了便于阅读,我添加了注释和文档。
答案 2 :(得分:0)
您真的需要将用户图标存储在Redux中吗?在这种情况下,更好的方法是使用一个选择器,根据登录用户返回图标。这样你就可以在商店中保持最小的状态。
您可以使用Reselect库来缓存选择器。