Was Sie bereits verwenden, ist der zentralisierte Status, den Sie mit Redux implementiert haben.
Vielleicht wird die Umsetzung mit React Baobab klarer, so dass nur Komponenten neu gerendert werden, die rerender sollten.
Hinweis: Aus Gründen der Demonstration arbeite ich nur mit einer Eigenschaft "isOpened", die nicht mit vielen Komponenten arbeitet, die das Modal verwenden. Wenn dies der Fall ist, müssen Sie Ihrem Zustand etwas anderes hinzufügen, zum Beispiel eine ID des Modales, das Sie öffnen möchten, und prüfen, ob diese ID gesetzt ist (in SomeComponent).
Der Modal:
import React from "react";
export default class Modal extends React.Component {
render() {
return (
<div className="myModal"></div>
);
}
}
SomeComponent:
import React from "react";
import { branch as BaobabBranch } from "baobab-react/higher-order";
import PropTypes from "prop-types";
import { openModal } from "./actions/Modal";
@BaobabBranch({
modal: ["modal"]
})
export default class SomeComponent extends React.Component {
static propTypes = {
dispatch: PropTypes.func.isRequired,
modal: PropTypes.object.isRequired
}
onOpenModal() {
this.props.dispatch(openModal);
}
render() {
return (
<div className="someComponent">
{ this.props.modal.isOpened ?
<Modal />
:
<div class="content" onClick={::this.onOpenModal}></div>
}
</div>
);
}
}
Aktionen/Modal:
export const openModal = state => {
state.select("modal").set(Object.assign({}, state.get("modal"), {
isOpened: true
}));
};
Zustand:
import Baobab from "baobab";
const state = new Baobab({
modal: {
isOpened: false,
content: "someContent"
}
});
Jetzt kurze Erklärung:
Der Zustand enthält den globalen Zustand, der mit den obigen Werten initialisiert wird. Durch Klicken auf das Inhaltsdiv von SomeComponent wird die openModal-Aktion ausgeführt. Das erste Argument aller Aktionen ist immer der Zustand selbst. Sobald ein Wert des Status geändert wird, werden alle Listening-Komponenten (mit @BaobabBranch) über die neuen Requisiten und Re-Render informiert.
Wenn Sie also eine andere Komponente hinzufügen, können Sie auch den modalen Wert hören. Damit haben Sie alles, was Sie für die Zentralisierung der Modal-Verarbeitung benötigen, und nicht, um die Werte zwischen den Layern auf und ab zu blasen.
Warum muss die Komponente ein Problem aktualisieren? Könnten Sie ein wenig mehr ausarbeiten, vielleicht mit einem konkreten Beispiel? –
@DanielZuzevich Absolut. Eine der modalen Komponenten enthielt ein "Eingabe" -Feld, so dass jedes Mal, wenn ich ein Zeichen in dieses Feld eingab, ein Redux-Aufruf gemacht werden musste, um seinen "Komponenten" -Zustand zu aktualisieren. – topic
Also sagen Sie, dass wenn sich der Eingabewert ändert, die Komponente aktualisiert und das Modal schließt? –