Ich habe einen einfachen Router (gestartet mit redux-router
und auf react-router
geschaltet, um Variablen zu eliminieren).react-redux connect() mapStateToProps wird mehrfach auf react-routersnavigation aufgerufen
<Router history={history}>
<Route component={Admin} path='/admin'>
<Route component={Pages} path='pages'/>
<Route component={Posts} path='posts'/>
</Route>
</Router>
Admin-Komponente ist im Grunde nur {this.props.children}
mit etwas nav; Es ist keine connect
Ed-Komponente.
Seiten-Komponente ist eine connect
ed Komponente mit mapStateToProps()
wie so:
function mapStateToProps (state) {
return {
pages: state.entities.pages
};
}
Beiträge ist noch interessanter:
function mapStateToProps (state) {
let posts = map(state.entities.posts, post => {
return {
...post,
author: findWhere(state.entities.users, {_id: post.author})
};
}
return {
posts
};
}
Und dann, wenn ich die Seite zu laden oder wechseln zwischen Beiträge/Seiten Routen Ich erhalte Folgendes in meiner console.log().
// react-router navigate to /posts
Admin render()
posts: map state to props
Posts render()
posts: map state to props
Posts render()
posts: map state to props
// react-router navigate to /pages
Admin render()
pages: map state to props
Pages render()
pages: map state to props
Also meine Frage ist: Warum ist mapStateToProps
mehrmals auf Routenänderungen aufgerufen wird?
Warum funktioniert auch eine einfache map
Funktion in mapStateToProps
verursachen es ein drittes Mal in der Posts Container aufgerufen werden?
Ich verwende die grundlegenden logger
und crashReporter
Middleware von den Redux-Dokumenten und es meldet keine Statusänderungen oder Abstürze. Wenn sich der Status nicht ändert, warum werden die Komponenten mehrfach gerendert?
Irgendwelche Updates dazu, zufällig? –
Ehrlich, nein. Ich fing an, verschiedene Dinge zu entfernen, um zu sehen, was sie auslösen könnte. Ich habe es nur noch einmal angeschaut und es scheint, als würde die Redux-Aktion "@@ INIT" eine zusätzliche Zeit auslösen, aber es ist schwer, diese Aktion zu protokollieren. Beim Rendern auf dem Server wird nur ein einzelner 'mapStateToProps' pro Container protokolliert.Hoffte auf eine Antwort von @DanAbramov – Mike
Ich schaute auch auf das Redux-Beispiel der realen Welt, um zu sehen, wie oft mapStateToProps dort aufgerufen wird und es viele Anrufe einrichtet. Ich denke, es ist nicht so wichtig, solange Sie ein Tool wie [Neu auswählen] (https://github.com/rackt/reselect) verwenden, um Ihre Selektoren zu erstellen. – Mike