Подтвердить что ты не робот

Отправляйте действие Redux с последующим действием в качестве полезной нагрузки, чтобы показать закусочную или диалоговое окно Material UI

Я использую React с Redux и Material UI для создания webapp. Webapp состоит из нескольких страниц и компонентов. Я знаю, что закусочная или диалог должны быть напрямую связаны с тем, что делает пользователь. Однако, я хотел бы сделать snackbar и диалог независимым на страницах и компонентах. Поэтому в прецеденте отображается сообщение типа background synchronization of your data failed и действие retry now. Моя идея состояла в том, чтобы сделать snackbar на странице под названием 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 это нормально или есть лучшее решение?

4b9b3361

Ответ 1

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

  • действия:

    export const showMessageTop = createAction();
    export const closeMessageTop = createAction();
    
  • Разбавление:

    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'
                   : '',
      }
    )
    
  • И компонент (используйте декоратор вместо класса):

    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 в пустой строке.