Отправьте действие Redux с последующим действием в качестве полезной нагрузки для отображения закусочной или диалогового окна пользовательского интерфейса материала.

Я использую React с Redux и Material UI для создания веб-приложения. Веб-приложение состоит из нескольких страниц и компонентов. Я знаю, что закусочная или диалог должны быть напрямую связаны с тем, что делает пользователь. Однако я бы хотел, чтобы закусочная и диалог были независимыми от страниц и компонентов. Таким образом, вариант использования отображает сообщение типа background synchronization of your data failed и действие retry now. Моя идея заключалась в том, чтобы отобразить панель закусок на странице с именем RootFrame, которая используется для обертывания всех других страниц и отправки текста панели закусок в качестве полезной нагрузки действия.

Мое действие Redux для отображения закусочной:

export function showSnackbar(message: string) {
  return {
    type: SHOW_SNACKBAR,
    payload: message
  };
}

Конечно, было бы неплохо указать сообщение в действии вместо того, чтобы принимать сообщение в качестве аргумента, но сейчас это не моя проблема. Проблема в следующем: как я могу использовать эту систему и отображать снэк-бар с действием? Могу ли я изменить свое действие на

export function showSnackbar(message, action) {
  return {
    type: SHOW_SNACKBAR,
    payload: {
      message, 
      action
    }
  };
}

и отобразить мою закусочную в RootFrame лайке

<Snackbar
  message={this.props.message}
  ref='snackbar'
  onDismiss={() => this.props.dispatch(dismissSnackbar())}
  action='retry now'
  onActionTouchTap={() => this.props.dispatch(this.props.action)}
/>;

Когда закусочная закрывается, действие изменяет переменную в состоянии: snackbar.visible = false. Используется для активации закусочной (отображается при snackbar.visible === true). Когда пользователь щелкает retry now, должно быть отправлено действие для запуска синхронизации (которое передается компоненту как реквизиты). Проблема очень похожа при использовании диалогов. Таким образом, компоненту необходимо передать не только отображаемый текст, но и следующие возможные действия.

Как вы думаете, можно ли использовать Redux таким образом или есть лучшее решение?


person nightlyop    schedule 30.10.2015    source источник


Ответы (1)


Собственно, сейчас usign redux немного изменился. Используем createAction из redux-act, дальше должным образом используем createReducer. В компоненте мы используем декоратор подключения или класс из react-redux. Коннектор обеспечивает состояние редукции, отправленные действия, родительские свойства. Итак, для нашей закусочной у нас есть:

  1. действия:

    export const showMessageTop = createAction();
    export const closeMessageTop = createAction();
    
  2. Редуктор:

    import {createReducer} from 'redux-act';
    import * as ac from '../actionCreators/messageTop';
    export default createReducer(
      {
        [ac.showMessageTop]: (state, messageText) => ({messageText}),
        [ac.closeMessageTop]: () => ({messageText: ''}),
      },
      {
        messageText: window.location.search === '?login=1'
                   ? 'Welcome'
                   : '',
      }
    )
    
  3. И компонент (используйте декоратор вместо класса):

    import {closeMessageTop} from '../../actionCreators/messageTop'; 
    import MessageTop from './MessageTop';
    @connect(state => ({
      // gettext: gettext(state.locale.messages),
      messageText: state.messageTop.messageText,
    }))
    export default class MessageTopContainer extends React.Component {
    ...
    <button onClick={...bindActionCreators({onClose: closeMessageTop}, dispatch)}/>
    

Итак, в текущем реквизите у нас есть this.props.messageText. И мы можем показать эту панель, если у нас есть сообщение, или мы можем вызвать closeAction, который устанавливает messageText в пустой строке.

person Errorpro    schedule 04.11.2015
comment
Думаю, именно так я и использую Redux. Но мой вопрос: если я хочу отобразить закусочную с сообщением и действием (например, undo в примерах на material-ui.com / # / components / snackbar), как передать undo-действие через redux. Это будет своего рода цепочка действий. - person nightlyop; 05.11.2015
comment
Чтобы передать какое-либо действие через redux, вы должны привязать отправку к этому действию. Итак, в этом примере есть обработчик, который обрабатывает касание. onActionTouchTap={this._handleAction}. нижняя строка: onActionTouchTap={...bindActionCreators({undo: this.undo}, dispatch)}. Я правильно понял? - person Errorpro; 05.11.2015
comment
Да, звучит интересно. Я попробую. Спасибо. - person nightlyop; 09.11.2015
comment
@Errorpro Или просто onActionTouchTap={bindActionCreators(this.undo, dispatch)} - он принимает одну функцию. - person Dan Abramov; 17.11.2015