Jeśli używasz architektury typu Flux, można to osiągnąć ładnie dzięki Store.
Wyobraź sobie, że masz sklep o nazwie MyModalStore
(lub ShareModalStore
lub dowolny inny modał). Magazyn zawiera wszystkie dane potrzebne do zawartości modalnej, a także to, czy ma być wyświetlany, czy nie.
Oto uproszczony sklep, który śledzi czy modalna jest widoczny, a co tytuł brzmi:
MyModalStore.js
var _visible = false;
var _modalTitle;
var MyModalStore = {
isModalVisible: function() {
return _visible;
},
getModalTitle: function() {
return _modalTitle;
}
};
MyModalStore.dispatchToken = Dispatcher.register(function(payload) {
var action = payload.action;
switch (action.type) {
case 'SHOW_MODAL':
_visible = true;
_modalTitle = action.modalTitle;
MyModalStore.emitChange();
break;
case 'HIDE_MODAL':
_visible = false;
MyModalStore.emitChange();
break;
}
});
module.exports = MyModalStore;
wówczas elementy, które chcą pokazać modalne uruchamiać akcję 'SHOW_MODAL'
za pomocą modalTitle
, a sam komponent modalny nasłuchuje zmian w sklepie, aby wiedzieć, kiedy się pokazać.
Ten wzór strumienia można zobaczyć w przykładowych projektach na facebook/flux on github.
Bez korzystania z strumienia, wydaje mi się, że zapewniasz wywołanie zwrotne w dół hierarchii modułów, aby każdy mógł uruchomić wywołanie zwrotne, aby pokazać modalny, a to jest delegowane do rzeczywistego komponentu modalnego na najwyższym poziomie. To nie jest świetne podejście do większych aplikacji, więc polecam podejście flux.
Opublikowaliśmy niektóre store helper code here, ale istnieje wiele innych libraries and examples out there as well.
Zapoznaj się z Pete Huntem ['ReactLayeredComponentMixin'] (http://jsfiddle.net/LBAr8/), który pozwala dowolnemu komponentowi na posiadanie wielu warstw, takich jak modały. Również powiązane: https://github.com/facebook/react/issues/379 –
[OverlayMixin] (https://github.com/stevoland/react-bootstrap/blob/master/src/OverlayMixin.js) wygląda podobnie , myślę, że opiera się na tym mixin też. – Douglas
Jest to całkiem łatwe do zrobienia również samemu. Chciałbym użyć własności komponentu 'statyka', aby owinąć' renderComponent' tak, aby zawsze był montowany na określonej pozycji: fixed div in my dom (tworzy i dołącza do ciała, jeśli już nie istnieje). Zobacz mój post tutaj, aby uzyskać prosty przykładowy komponent: http://stackoverflow.com/questions/24239157/how-to-make-react-js-play-nice-together-z-zbytem-reveal-modal-form/24396559# 24396559 –