【发布时间】:2016-10-16 11:42:40
【问题描述】:
我有一个使用 Oauth2“重定向流”来验证用户身份的应用程序,即用户被重定向到另一个网站进行登录,然后被重定向回我的网站。
文档和其他来源似乎都声称业务逻辑应该放在动作创建者或减速器中。但是我有一个login() 函数,它不会以任何方式更改状态,它所做的是将应用程序的当前状态保存为localStorage 中的普通对象,然后将用户重定向到授权服务器。当用户登录并被重定向回来时,状态被恢复(通过另一段代码)并作为初始状态提供给我的商店创建函数。
我的问题:login 函数的逻辑只是检索状态,但不会以任何方式更改它,因此它不属于减速器。它也不返回作为动作创建者定义的动作。我应该把它放在我的应用程序结构的什么位置?
拥有一个实际上不创建动作的动作创建者是否“可以”?我现在正在使用 redux-thunk 执行此操作(因为我需要 getState())并且它可以正常工作,但感觉不对,因为它实际上不是“动作创建者”,另一方面我也有一个 @ 987654325@ 函数确实返回一个动作,所以感觉他们应该住在同一个地方。我想这是一种极端情况,但不是真的,因为我可以想到很多理由以这种方式保存状态并将访问者重定向到其他站点(或者甚至只是保存状态而不重定向)。
PS。我知道有一些库可以自动将我的 redux 存储与 localStorage 同步,但这并不是问题的重点。
编辑:一些澄清:
来自Redux docs 关于业务逻辑的放置位置: 对于 reducer 或 action creator 中应该包含哪些逻辑,没有一个明确的答案。
继续阅读,很明显,我应该在两个地方放置业务逻辑,一个是 reducer,一个是 action creator。现在,由于我想做的事情不会影响状态,并且根据定义,reducer 会影响状态,所以我倾向于将此逻辑放入动作创建器中。
关于动作创建者的文档:动作创建者就是这样——创建动作的函数。将术语“动作”和“动作创建者”混为一谈很容易,因此请尽量使用正确的术语。 [...] 在 Redux 中,动作创建者只需返回一个动作
动作文档:动作是纯 JavaScript 对象。
我的登录示例的伪代码:
function login() {
// retrieving and serializing the state, then:
localStorage.set('my_app_id_state', my_serialized_state);
window.location = url_to_authorization_service;
}
这段代码显然在动作创建者中没有位置,因为我没有返回动作,这是动作创建者的目的。但是我仍然需要检索状态,所以我也不能让它完全独立。
同样,问题是我应该将这段代码放在我的应用程序结构中的什么位置?
再一次,代码工作正常,一切都很好,所以我想这更像是一个学术问题,但它让我很烦恼,因为我在这里显然违反了 Redux 的基本规则。也许只是个例外?
【问题讨论】:
标签: javascript redux redux-thunk