如何在不改变状态的情况下对 redux 动作做出反应
How to react to redux action without changing state
如何在不实际更改状态的情况下使 redux 操作生效?
我正在将现有代码移植到 redux:单击注销按钮时,现有函数 logout()
发出 AJAX 请求以注销用户。如果该请求失败,它会调用 alert('Logout failed');
在移植的代码中,注销按钮会调用一个使用 redux-thunk
:
实现的动作创建器
export function logout(email, pass, callback) {
return function(dispatch) {
axios.get('/logout')
.then(function(response) {dispatch({type: 'LOGOUT_SUCCESS'})})
.catch(function(error) {dispatch({type: 'LOGOUT_FAILURE', message: error.response.data})});
};
}
reducer 处理 LOGOUT_SUCCESS
操作并从状态中删除用户对象,这很简单。但是我应该处理失败案例并触发 alert()
?
- action creator 可以调用
alert()
,但不知何故我觉得这里不对
- reducer 可以调用
alert()
和 return 相同的状态...但这似乎是个坏主意,因为 reducer 应该是没有副作用的纯函数。
- reducer 可以 return 一个像
{messages: ['Login failed']}
这样的状态,代码的其他部分可以对此做出反应,抛出警报并调用另一个操作从状态中删除消息。但这似乎不必要地复杂。
如果您希望通过事件触发动作但不更改状态,并且希望动作创建者无法接收到它,那么哪种模式才有意义?
如果登录失败时唯一发生的是警报,只需在该函数中调用它即可。
记住,React 很简单JavaScript,不要试图强迫自己接受一种意识形态;这些模式是指南而非规则。
您可能想查看 redux-saga
,它以比 thunk 更明确的方式处理 redux 的副作用。
如何在不实际更改状态的情况下使 redux 操作生效?
我正在将现有代码移植到 redux:单击注销按钮时,现有函数 logout()
发出 AJAX 请求以注销用户。如果该请求失败,它会调用 alert('Logout failed');
在移植的代码中,注销按钮会调用一个使用 redux-thunk
:
export function logout(email, pass, callback) {
return function(dispatch) {
axios.get('/logout')
.then(function(response) {dispatch({type: 'LOGOUT_SUCCESS'})})
.catch(function(error) {dispatch({type: 'LOGOUT_FAILURE', message: error.response.data})});
};
}
reducer 处理 LOGOUT_SUCCESS
操作并从状态中删除用户对象,这很简单。但是我应该处理失败案例并触发 alert()
?
- action creator 可以调用
alert()
,但不知何故我觉得这里不对 - reducer 可以调用
alert()
和 return 相同的状态...但这似乎是个坏主意,因为 reducer 应该是没有副作用的纯函数。 - reducer 可以 return 一个像
{messages: ['Login failed']}
这样的状态,代码的其他部分可以对此做出反应,抛出警报并调用另一个操作从状态中删除消息。但这似乎不必要地复杂。
如果您希望通过事件触发动作但不更改状态,并且希望动作创建者无法接收到它,那么哪种模式才有意义?
如果登录失败时唯一发生的是警报,只需在该函数中调用它即可。
记住,React 很简单JavaScript,不要试图强迫自己接受一种意识形态;这些模式是指南而非规则。
您可能想查看 redux-saga
,它以比 thunk 更明确的方式处理 redux 的副作用。