从不同的减速器访问减速器?
Posted
技术标签:
【中文标题】从不同的减速器访问减速器?【英文标题】:Access a reducer from a different reducer? 【发布时间】:2017-08-21 12:23:15 【问题描述】:我有一个学生列表,我的应用程序始终显示一个学生,即 activePupil。到目前为止,我有两个减速器。一个包含并默认返回所有孩子的列表(以数组的形式):
[
id: 1
name: Barack
,
id: 2
name: Donald
]
...然后我有一个 activePupilReducer,其中包含正在查看的当前瞳孔。所以例如
id: 2
name: Donald
现在我不知道如何迭代到下一个学生。当调度“UPDATE_ACTIVE”操作时,我希望我的 activePupilReducer 将活动学生更新为下一个学生。所以我需要获取我学生的当前 id,对其进行迭代,然后从另一个 reducer 中获取具有正确 id 的学生(或者这就是我认为我必须做的事情)。现在我的 activePupilReducer 看起来像这样:
export default function (state=id: -1, name:"John", action)
switch (action.type)
case "UPDATE_ACTIVE":
// ??
default:
return state;
不知何故,我需要抓住另一个减速器并抓住下一个元素,但我不知道该怎么做。
【问题讨论】:
【参考方案1】:在我看来,活动瞳孔和瞳孔列表本质上应该存在于同一个减速器中。因此,例如,只有一个状态为对象的瞳孔缩小器。然后像现在一样采取行动。
话虽如此,reducer 是为了避免任何副作用,因此不是你想做的事情。你可以做的是在你的减速器/动作之外计算下一个学生,例如在某些组件中单击按钮,然后将其传递给你的 update_active 动作,然后将它传递给你的减速器以设置为活动瞳孔。
【讨论】:
所以如果我理解正确的话,我完全走错了路,试图在减速器中实现这个功能?这很有趣,因为我目前在我的行动中有它,但我认为我在那里实施了一个反模式。【参考方案2】:您的activePupilReducer
范围不够广。它应该能够看到activePupil
键和pupils
数组都可以工作。
如果您使用combineReducers
,您可能不会让他们访问彼此的状态。您应该将这两个 reducer 合并为一个,并使用以下状态结构:
pupils: [...]
activePupil: ...
当您调用UPDATE_ACTIVE
操作时,这个单一的reducer 可以访问两个键并能够执行状态突变。
【讨论】:
我正在使用联合减速器,所以,最后,我的商店看起来像你引用的那个。那么,如果我理解正确的话,我是否可以简单地在我的组合减速器中实现这个功能,因为我需要访问这两条数据? 你的 reducer 应该可以访问 both 条目。您需要将 both 放在 store 中的同一个键下,这样它们就可以被同一个 reducer 访问。所以,store = data: pupils, activePupil
以上是关于从不同的减速器访问减速器?的主要内容,如果未能解决你的问题,请参考以下文章