Redux middleware работает наполовину, но не полностью отменяет действие - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть какое-то простое промежуточное ПО, которое вроде работает, но тоже не работает

В основном у меня есть список пользователей, и я пытаюсь удалить его. а затем синхронизировать его с 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 голосов
/ 07 сентября 2018

Я также считаю, что действия по подтверждению должны быть [единственной] ролью пользовательского интерфейса.

Хранилище Redux может (должно?) Рассматриваться как API - запрос (действие)> ответ (изменил состояние).Вы отправляете запрос в API и ждете подтверждения?Это было бы по меньшей мере странно.

Но я вижу в этой идее даже больше, чем какой-то смысл. Централизованный элемент подтверждения может играть ту же роль, что и сообщения тостов / закусочных.

Задача # 1 : существует строгое разделение между пользовательским интерфейсом и логикой хранилища - , вы не можете использовать промежуточное ПО для отображения диалога .Но вы можете изменить состояние, которое может использоваться в пользовательском интерфейсе для отображения диалогового окна подтверждения .

Задача № 2 : простой последовательности действий if/then/return не существует, вы должны буферизовать действие и запустить его после подтверждения (получив действие «подтвердить») или сбросить при отмене.Да, это можно сделать как промежуточное ПО.

IDEA : Действие, отправленное как требующее подтверждения, сохраняется в буфере.Затем вы можете изменить тип действия на CONFIRM_SHOW - состояние будет изменено, пропущен пропелс, может быть показано модальное диалоговое окно.

При CONFIRM_OK запустить буферизованное действие, следующие шаги будут общими с CONFIRM_CANCEL: очистить буфер и скрыть модальный режим.Это может быть даже одно значение - буфер может быть модальным флагом (пусто - скрыть, определено - показать), полученным в mapStateToProps.

Для полного использования должна быть возможность передать пользовательское подтверждающее сообщение вместе с reqConfirm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...