Redux中间件可以正常工作,但不能完全取消操作

时间:2018-09-07 09:52:29

标签: javascript reactjs redux

我有一些简单的中间件,可以正常工作,但不能正常工作

基本上,我有一个用户列表,并且我试图删除一个。然后将其与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)
    }
}

1 个答案:

答案 0 :(得分:0)

我还认为,确认操作应仅是UI的角色。

可以(应该?)将Redux存储区视为API-请求(操作)>响应(状态已更改)。您是否正在向API发送请求并等待确认消息?至少会很奇怪。

但是,我对这种想法的理解不止于此。集中式确认元素可以与敬酒/快餐信息类似。

问题1 :UI和存储逻辑之间存在严格分隔-您不能使用中间件显示对话框。但是您可以更改可在用户界面中用于显示确认对话框的状态

问题2 :没有简单的if/then/return动作链,您必须缓冲一个动作,并在确认后运行(接收“确认”操作),或将其放到取消处。是的,它可以作为中间件来完成。

想法: 调度为需要确认的操作将保存在缓冲区中。然后,您可以将动作类型更改为CONFIRM_SHOW-状态将更改,道具通过,可以显示模式对话框。

CONFIRM_OK运行缓冲动作时,CONFIRM_CANCEL的后续步骤将很常见:清除缓冲区并隐藏模式。它甚至可以是一个值-缓冲区可以是mapStateToProps中派生的模式标志(空-隐藏,定义-显示)。

要完全使用,应该有一个选项可以将自定义确认消息与reqConfirm一起传递。