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

Лучший способ реализации модалов и уведомлений в React Flux

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

  • Нет магазинов

В этом подходе я создаю класс NotificationHelper, который имеет метод create. Внутри этого я создаю новый контейнер node, присоединяем его к телу, а затем вызываем React.render(, container);

Таким образом, любой компонент может вызвать NotificationHelper.create(), и он создаст уведомление. Компонент уведомлений, чем управляет жизненным циклом и закрывается, когда истекает таймер, или кто-то нажимает кнопку закрытия.

Проблема часто возникает, мне нужно показать уведомление на странице в ответ на XHR-ответ (успех или неудачу), поэтому в моем actionCreator у меня будет код вроде этого

APIManager.post(url, postData).then(function(response) {
    NotificationHelper.create(<SuccessNotification />)
});

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

  1. С магазинами

Другой подход заключается в создании NotificationStore, а на emitChange - рендеринг компонента уведомления. Код будет выглядеть примерно так.

В моем приложении App.js код будет

<body> 
    <Header />
    <Fooder />
   <NotificationContainer />
</body>

И затем в NotificationContainer я сделаю что-то вроде

onChange: function() {
    this.setState({customNotification: NotificationStore.get()});
},
render: function() {
    <Notification>
        {this.state.customNotification}
    </Notification>
}

И, наконец, создатель действия будет выглядеть примерно как

Dispatcher.dispatch({
   actionType: 'notification',
   component:  <MyComponent/>
});

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

Кроме того, теперь мне нужно инициализировать NotificationContainer в начале моего приложения, хотя на данный момент у меня нет никаких уведомлений.

4b9b3361

Ответ 1

Я действительно не вижу, как проблемы возникают. Он делает именно то, что он должен был делать, и если вам нужно будет потом построить его, вы можете легко это сделать. Уведомления и другие функции не-истинного компонента-владельца являются одной из лучших причин использования потока, на мой взгляд (90% случаев, когда я не рекомендую поток).

С флюсом создатель действия уведомления будет отвечать за создание действия уведомления об удалении по истечении заданного периода времени. Вы также можете иметь кнопку x в уведомлении, которая при нажатии создает это действие, и они переходят в хранилище, которое удаляет элемент, если он существует, и любые/все виды, зависящие от этого обновления магазина. Когда я говорю "все/все", я имею в виду, что компонент уведомлений может быть скрытым, или может быть альтернативный способ просмотра уведомлений на одной странице приложения, или может быть простой счетчик с количеством уведомлений в любом месте приложения.

Боковое примечание: не пропускайте элементы таким образом, чтобы их можно было визуализировать более одного раза. Pass {component: SuccessNotification, props: props} вместо этого, если вам нужно заранее указать компонент.

Ответ 2

Я следую за ответом FakeRainBrigand.

Извините за саморекламу, но я создал компонент Notification, который вы можете использовать с Flux. Здесь вы можете увидеть, что показывает пример использования с Alt, но принципы одинаковы. Вы добавляете компонент к элементу верхнего уровня в свой HTML и подписываете этот компонент в хранилище уведомлений. В вашем создателе действия уведомлений вы можете добавить уведомление с некоторыми свойствами, такими как: уровень, положение, автоматическое отключение, действие и т.д.

Ниже приведена демонстрация компонента.