Ich erstelle ein npm-Modul, das Redux für die Statusverwaltung verwendet. Mein Modul wird eine Bibliothek sein, die für einige Anwendungen verschiedener Kunden wiederverwendet wird. Ich hoffe, dass die Client-Anwendungen einen einzigen Speicher verwalten, den meine Bibliothek ebenfalls verwendet.Wie verbinde ich Redux-Container in meiner Bibliothek mit dem Speicher, der der Anwendung gehört, die meine Bibliothek verwendet?
Das Problem betrifft die mapStateToProps
Funktion, die ich in meiner Bibliothek an connect()
übergeben muss. Ich weiß nicht, welcher Schlüssel der Benutzer meiner Bibliothek meine Reduzierungen und den Statusbaum platziert hat.
Ich könnte eine vernünftige Vermutung machen, wie der CamelCase-Name meiner Bibliothek. Dies scheint jedoch kein robuster Ansatz zu sein, weil 1/der Benutzer meinen Schlüssel für etwas anderes verwendet und 2/nur 1 Instanz meiner Bibliothek im Zustandsbaum sein könnte (ich kann mir einige Szenarien vorstellen, in denen ich es tun würde) will mehr als 1 Instanz).
Hier ist ein einfaches Beispiel für das Problem. Ich könnte ein Logon npm-Modul erstellen, das ich in meinen Store einhängen und Hierarchien anzeigen möchte. Ich kenne den Pfad innerhalb des Anwendungsspeichers nicht, daher der ???? in mapStateToProps. Gibt es einen schönen Weg, um mit dieser Situation umzugehen?
// node_modules/my-company-logon/
const LoginScreen = ({ username, failureReason }) => (
// my presentation logic
);
export default connect(
username: state.????.lastSessionUsername,
failureReason: state.????.failureReason
)(LoginScreen);
export const logonReducer(state, action) => { /* reducer logic */ }
// my-customer/app.js
import LogonScreen, { logonReducer } from 'my-company-logon';
let store = createStore(combineReducers({
someUnexpectedPath: logonReducer
}))
EDIT:
Ich habe Art gelöst durch die Verbindungsfunktion reagieren-redux wickeln. Die Root-Komponente des Moduls hat den Kontext von Selektoren, die Daten von dem Ort lesen können, an dem die Lib angehängt wurde.
export default connect(
(state, selectors, actionCreators) => ({
username: selectors.getUsername(state),
loginFailureReason: selectors.getLogonFailureReason(state)
})
)(LoginScreen)
Vielen Dank für die Antwort. Ich versuche, den Workflow für Module zu importieren, zu konfigurieren und zu verwenden. Dank Ihres Kommentars bin ich zu einer Lösung gekommen, die Selektoren nach dem Import und der Konfiguration erstellt. Das einzige Problem ist das Boilerplate, da angeschlossene Bauteile beim Export doppelt dekoriert sind. –
Ich wickelte die connect-Funktion von react-redux ein, so dass ich einen Kontext in meine lib übergeben konnte. Ich habe meine Frage bearbeitet –