Ich habe React + Redux + Typescript Anwendung bestehend aus einer Karte, mehrere Diagramme und eine Reihe von modalen Dialogen (von denen eine ist ein Druckformular). Die presentational and container components sind wie folgt zusammengesetzt.Wie übertrage ich eine reaktive Komponente sauber an eine andere Komponente in der Komponentenhierarchie?
┌──────────────────────────────────────────┐
│ app.tsx │
│ ┌─────────────────────────────────────┐ │
│ │ modalsContainer.tsx │ │
│ │ ┌────────────────────────────────┐ │ │
│ │ │ printModal.tsx │ │ │
│ │ │ ┌───────────────────────────┐ │ │ │
│ │ │ │ printFormContainer.tsx │ │ │ │
│ │ │ │ const mergeProps(...); │ │ │ │
│ │ │ └───────────────────────────┘ │ │ │
│ │ └────────────────────────────────┘ │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ mapContainer.tsx │ │
│ │ ┌────────────────────────────────┐ │ │
│ │ │ map.tsx │ │ │
│ │ │ private map:EsriMap │ │ │
│ │ └────────────────────────────────┘ │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ dashboard.tsx │ │
│ │ ┌────────────────────────────────┐ │ │
│ │ │ charts.tsx │ │ │
│ │ └────────────────────────────────┘ │ │
│ └─────────────────────────────────────┘ │
└──────────────────────────────────────────┘
Die Druckform ermöglicht es dem Benutzer, die Charts zu drucken und zu einer PDF-Karte. Eine Webanforderung wird erstellt, damit der Bericht basierend auf den ausgewählten Diagrammen und der aktuellen Karte gedruckt wird.
const mergeProps = (stateProps: any, dispatchProps: any, ownProps: any): any => {
return {
fetchReport: (title: string, summary: string, includeMap: boolean) => {
if(includeMap) {
// fetch map image
// need access to mapcontainer /map/esrimap here
}
// ... fetch report ...
},
close: dispatchProps.close
};
};
Diese meist funktioniert, aber ich habe noch zählen das Kartenbild in dem Bericht: Die Logik für diese ist in const mergeProps(...);
unten aufgebaut. Um ein Bild der Karte zu erzeugen, muss ich eine PrintTask ausführen. Einer der Parameter für die Druckaufgabe ist das Esri-Map-Objekt. Von mergeProps habe ich jedoch keinen Zugriff auf die MapContainer- oder Map-Komponenten. Wenn ich das täte, könnte ich eine Print():Promise<any>
Funktion hinzufügen, um die Aufgabe durchzuführen und das Bild zurückzugeben.
Ich möchte wirklich Globals vermeiden. Andere Fähigkeiten in der Zukunft erfordern möglicherweise auch Zugriff auf die Karte. Ich möchte auch vermeiden, Komponenten als Requisiten so tief durch den Stapel zu führen. Ich lese ein wenig über context, aber das scheint nicht sehr zu empfehlen.
Wie übertrage ich eine Komponente tief in den Stapel hinein?
Sie können die Komponente auf Ihren Redux-Zustand setzen und mit 'connect' greifen. react-redux verwendet den Kontext übrigens – azium
Warum nicht einfach die Aktion PrintTask innerhalb Ihrer Map-Komponente auslösen, die Zugriff auf das EsirMap-Objekt hat. Übergeben Sie die Dispatch-Aktion in die Map-Komponente, damit Sie den Anwendungsstatus ändern können. – Gamak
@Gamak, ich hatte das in Erwägung gezogen, aber trotzdem müsste die 'MapComponent' noch durch die Layer nach' mergeProps' weitergeleitet werden, um diese Funktion auszuführen. –