Es gibt keine Möglichkeit, einen Teil der Speicher zu unterzeichnen, wenn subscribe
direkt verwenden, sondern als der Schöpfer von Redux selbst sagt - don't use subscribe
directly! Für den Datenfluss eines Redux App wirklich zu arbeiten, werden Sie eine Komponente mögen, dass hüllt Ihre gesamte App Diese Komponente wird Ihr Geschäft abonnieren. Der Rest Ihrer Komponenten ist für diese Wrapper-Komponente untergeordnet und erhält nur die Teile des Zustands, die sie benötigen.
Wenn Sie Redux mit React verwenden, dann gibt es gute Nachrichten - das offizielle react-redux Paket kümmert sich darum! Es stellt diese Wrapper-Komponente bereit, die <Provider />
genannt wird. Sie haben dann mindestens eine "Smart-Komponente", die Statusänderungen abgehört, die von Provider
aus dem Laden weitergegeben werden. Sie können angeben, auf welche Teile des Zustands er hören soll, und diese Teile des Staates werden als Requisiten an diese Komponente weitergegeben (und dann kann er diese natürlich an seine eigenen Kinder weitergeben). Sie können dies festlegen, indem Sie die Funktion connect() für Ihre "intelligente" Komponente verwenden und die mapStateToProps
-Funktion als ersten Parameter verwenden. Zur Erinnerung:
Wrap Wurzelkomponente mit Provider
Komponente, die speichern abonniert ändert
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
Jetzt jedes Kind von <App />
, die mit connect()
wird eine „intelligente“ Komponente gewickelt ist. Sie können mapStateToProps
weitergeben, um bestimmte Teile des Staates auszuwählen und diese als Requisiten zu geben.
const mapStateToProps = (state) => {
return {
somethingFromStore: state.somethingFromStore
}
}
class ChildOfApp extends Component {
render() {
return <div>{this.props.somethingFromStore}</div>
}
}
//wrap App in connect and pass in mapStateToProps
export default connect(mapStateToProps)(ChildOfApp)
Offensichtlich <App />
können viele Kinder haben, und Sie können, welche Teile des Staates wählen, und wählen die mapStateToProps
zu für jedes seiner Kinder hören sollte. Ich würde empfehlen, die Dokumente unter usage with React zu lesen, um diesen Fluss besser zu verstehen.
Vielen Dank für so detaillierte Antwort –
Das ist großartig. Ich hätte gerne eine Komponente, um auf eine Aktion zu reagieren. Nehmen wir an, es gibt eine Komponente 'NavBar', die eine Aktion' toggleDrawer' absetzt. Diese Aktion speichert einen Wert im Speicher, der den Status der Schublade 'isDrawerOpen' darstellt. Dann, wie mache ich die Schublade geöffnet, wenn die Aktion gesendet wird? Auch hier gibt es einen möglichen Konflikt: die Schublade selbst kann geöffnet werden und sie steuert ihre 'offene' Eigenschaft, so dass' isDrawerOpen' aus der Schublade ändert, würde eine Endlosschleife verursachen ... – Miquel
noch gibt es Code in 'connect', um darauf zu antworten Alle Änderungen und Ausführen von mindestens etwas Code vor dem Vergleich der vorherigen und nächsten Rückgabe von 'mapStateToProps', wodurch die Leistung unnötig beeinträchtigt wird. Ich frage mich nur, ob wir die Namen der gewünschten Schlüssel erkennen können, zB: 'function mapStateToProps (({someKey, anotherReducerKey}) => ...' und nur diese abonniert.In Javascript können Sie die Namen von Argumenten bekommen - also Die Frage ist, können Sie die Namen der destrukturierten Schlüssel dieser Argumente. –