我有一些简单的中间件,可以正常工作,但不能正常工作
基本上,我有一个用户列表,并且我试图删除一个。然后将其与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)
}
}
答案 0 :(得分:0)
我还认为,确认操作应仅是UI的角色。
可以(应该?)将Redux存储区视为API-请求(操作)>响应(状态已更改)。您是否正在向API发送请求并等待确认消息?至少会很奇怪。
但是,我对这种想法的理解不止于此。集中式确认元素可以与敬酒/快餐信息类似。
问题1 :UI和存储逻辑之间存在严格分隔-您不能使用中间件显示对话框。但是您可以更改可在用户界面中用于显示确认对话框的状态。
问题2 :没有简单的if/then/return
动作链,您必须缓冲一个动作,并在确认后运行(接收“确认”操作),或将其放到取消处。是的,它可以作为中间件来完成。
想法:
调度为需要确认的操作将保存在缓冲区中。然后,您可以将动作类型更改为CONFIRM_SHOW
-状态将更改,道具通过,可以显示模式对话框。
在CONFIRM_OK
运行缓冲动作时,CONFIRM_CANCEL
的后续步骤将很常见:清除缓冲区并隐藏模式。它甚至可以是一个值-缓冲区可以是mapStateToProps
中派生的模式标志(空-隐藏,定义-显示)。
要完全使用,应该有一个选项可以将自定义确认消息与reqConfirm
一起传递。