【发布时间】:2016-03-22 17:49:49
【问题描述】:
为了学习 Redux,我正在创建一个简单的 Web 应用程序。
如果存在验证用户名和密码的“身份验证”操作。然后我想要调用“登录”或“失败”操作。我不知道怎么做。 我可以调用身份验证步骤,但嵌套/后续调用未执行。
如何从另一个函数中调用一个函数? (这就是我的问题令人沮丧的原因^^)
我的代码如下所示:
function authenticateClient(state, client){
if (client.password === 'perfectsec')
return dispatch(Actions.connectClient(client));
else
return dispatch(Actions.refuseClient(client));
}
在 reducer 中调用 dispatch 是不正确的。最简单的方法是直接调用函数connectClient(state, client) 或refuseClient(state, client)。但这一步并没有经过 redux 流程。
上下文代码:
/* actions.js */
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 };
}
/* main.js */
/* reducer */
const reducer = (state = loadState(), action) => {
console.log(chalk.red(`*${action.type}*`));
switch (action.type) {
case Actions.Types.authenticateClient:
return authenticateClient(state, action);
case Actions.Types.connectClient:
return connectClient(state, action);
case Actions.Types.refuseClient:
return refuseClient(state, action);
default:
return state;
}
};
/* store */
store = createStore(reducer);
/* app */
store.dispatch(Actions.authenticateClient({username, password}));
【问题讨论】:
-
我不是 100% 能够遵循你的代码,所以只是澄清一下 - 你不是试图从减速器内部调度动作,是吗?因为那是你 100%从不应该调度操作的地方。
-
谢谢。是的,这正是我想要做的。我注意到这是不正确的。但我不明白如何实现我的目标。我添加了一段,试图澄清。
-
如果你需要有条件地调度动作,这个逻辑很可能在另一个动作创建者中(例如
Actions.connectClientIfValid(client))——如果输入有效,则返回Actions.connectClient(client)的结果,如果不是,返回Actions.refuseClient(client)的结果。然后,您可以分派返回的任何内容。你的 reducer 应该做的就是state + action = newState- 它不应该对你的应用程序的其余部分产生副作用。 -
也就是说,如果由于调用了一个动作创建者而需要调度多个动作,它会变得更加复杂 - 我真的建议阅读 Redux 网站上的教程并遵循作者制作的截屏视频,因为它涵盖了所有这些东西,而且这个家伙解释得比我可能做得更好:)
-
那么小逻辑
IF valid THEN connect ELSE refuse应该在哪里?我在 3 个月前阅读并观看了所有这些内容,现在尝试一下,也许我应该重复一遍。感谢您的帮助!
标签: javascript redux reducers