嵌套的缩减器

时间:2016-03-21 16:05:19

标签: javascript redux reducers

要学习Redux,我正在开始一个简单的Web应用程序。

如果有#34;身份验证"动作验证用户名和密码。然后我想要一个"登录"或"失败"要被召唤的行动。我无法弄清楚如何。 我可以调用身份验证步骤,但不执行嵌套/跟随调用。

如何从另一个函数中调用函数? (这就是我的问题令人沮丧的原因^^)

我的代码如下所示:

#tagline{float:right; z-index:1; display:inline-block; margin-top:-75px; margin-right:15%;}
@media(max-with:600px) {
#tagline{display:none; visibility:hidden; clear:both;}}

在reducer中调用dispatch是不正确的。最简单的方法是直接调用函数function authenticateClient(state, client){ if (client.password === 'perfectsec') return dispatch(Actions.connectClient(client)); else return dispatch(Actions.refuseClient(client)); } connectClient(state, client)。但是,此步骤不会通过redux流程。

上下文代码:

refuseClient(state, client)

1 个答案:

答案 0 :(得分:2)

减速者不应该派遣行动,或做任何有副作用的事情。所有的reducer都应该是状态和动作的纯函数(有效state + action = newState) - 整个Redux库是围绕这个假设构建的,我相信它是专门设计的,如果你尝试就会抛出一个错误在减速机内调用调度。

有条件地发送动作的最佳方式是创建一个新的动作创建者' - 你的应用程序中已经有一些这样的:

export function authenticateClient(client) {
  return { type: Types.authenticateClient, client };
}

export function connectClient(client, isNew) {
  return { type: Types.connectClient, client, isNew };
}

export function refuseClient(client) {
  return { type: Types.refuseClient, client };
}

请注意,标准动作创建者不会自行发送动作。它们只是返回动作的功能,您可以在某个时刻调度自己(如果您想要创建动作并在实际发送之前保持一段时间,这很方便它关了)。一旦你开始编写异步动作创建者,水就会变得混乱,但这并不是你问题的范围,所以我现在就跳过它(我建议阅读文档的Async部分,尽管一旦你了解它,你可以做一些非常酷的事情。)

您在此尝试表达的内容是,如果条件为真,请给我connectClient动作,如果没有,请给我一个refuseClient行动&#39 ;.我们已经知道,为您提供动作的功能是动作创建者,它将我们引向这个答案的要点:动作创建者可以拥有逻辑。虽然其中90%只会接收数据并立即返回一个对象,但这并不是他们可以采取的唯一形式。以下是如何表示此功能的示例:

export function connectClientIfValid(client) {
  if (client.valid === true) {
    return connectClient(client);
  }
  else {
    return refuseClient(client);
  }
}

同样,实际上没有任何东西从这个函数发送 - 它只是返回一个动作,你可以随意发送,如下:

dispatch(connectClientIfValid(client));

您的逻辑运行,并调度相应的操作,而不必牺牲您的reducer的纯/同步性质。你的减速机所要做的就是阅读它们进来时的动作,并适当地更新状态 - 它不必关心导致动作发生的逻辑。