我有一些简单的中间件,可以工作,但也不能工作
基本上我有一个用户列表,我正在尝试删除一个。然后与 firebase 同步。一切都很好。
我添加了一些中间件,以便当用户删除一个中间件时,它会询问您是否确定? (只需使用一个简单的alert
目前)。如果单击“取消”,则不会删除。如果你点击“确定”,它就会
到目前为止,这是有效的,但由于我的动作创建者,它仍然继续并删除用户。这是一些代码:
// 点击删除用户
<button
onClick={() =>
this.props.deleteUserFromStoreThenUpdateFirebase(user)
}
>
调用这个方法
我认为这里发生了一些奇怪的事情,基本上它不应该调用deletedUserFromFirebase
如果我点击取消的方法
export const deleteUserFromStoreThenUpdateFirebase = user => {
return (dispatch, getState) => {
return dispatch(deleteUser(user)).then(() => {
return deleteUserFromFirebase(user);
})
};
};
export const deleteUser = user => {
return async dispatch => {
dispatch({ type: DELETE_USER, user: user, reqConfirm: true });
};
};
中间件:
const confirmMiddleware = store => next => action => {
if(action.reqConfirm){
if(confirm('are you sure?')){
next(action)
}
}
else {
next(action)
}
}
我还认为确认操作应该是 UI 的[唯一]角色。
Redux 存储可以(应该?)像 API 一样对待 - 请求(操作)> 响应(更改的状态)。您是否正在向 API 发送请求并等待确认消息?至少会很奇怪。
但我认为这个想法不仅仅是某种意义。集中式确认元素可以具有与 toast/snackbar 消息类似的作用。
问题#1: 有一个strictUI 和存储逻辑之间的分离 -你不能使用中间件来显示对话框. But 您可以更改可在 UI 中使用的状态以显示确认对话框.
问题#2: 没有简单的if/then/return
一系列行动,你必须缓冲一个动作并在确认后运行它(收到“确认”操作)或在取消时将其删除。是的,它可以作为中间件来完成。
IDEA:
需要确认时调度的操作保存在缓冲区中。然后您可以将操作类型更改为CONFIRM_SHOW
- 状态将被改变,道具被传递,模式对话框可以被显示。
On CONFIRM_OK
运行缓冲操作,接下来的步骤将与CONFIRM_CANCEL
:清除缓冲区并隐藏模态。它甚至可以是一个值 - 缓冲区可以是一个模态标志(空 - 隐藏,定义 - 显示)mapStateToProps
.
为了完全可用,应该有一个选项来传递自定义确认消息以及reqConfirm
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)