Ho un router semplice (avviato con redux-router
e passato a react-router
per eliminare le variabili).React-redux connect()'s mapStateToProps viene chiamato più volte nella navigazione react-router
<Router history={history}>
<Route component={Admin} path='/admin'>
<Route component={Pages} path='pages'/>
<Route component={Posts} path='posts'/>
</Route>
</Router>
Il componente di amministrazione è in pratica solo {this.props.children}
con un po 'di navigazione; non è un componente di connect
ed. componente
Pages è un componente connect
ED con mapStateToProps()
in questo modo:
function mapStateToProps (state) {
return {
pages: state.entities.pages
};
}
messaggi è ancora più interessante:
function mapStateToProps (state) {
let posts = map(state.entities.posts, post => {
return {
...post,
author: findWhere(state.entities.users, {_id: post.author})
};
}
return {
posts
};
}
e poi quando ho caricare la pagina o passare messaggi/percorsi Pages Ottengo il seguente nel mio 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
Quindi la mia domanda è: perché è mapStateToProps
viene chiamato più volte su cambiamenti di rotta?
Inoltre, perché una semplice funzione map
in mapStateToProps
causa che venga chiamata una terza volta nel contenitore Post?
Sto utilizzando i middleware di base logger
e crashReporter
dai documenti di Redux e non sta segnalando modifiche di stato o arresti anomali. Se lo stato non cambia, perché i componenti vengono visualizzati più volte?
Eventuali aggiornamenti su questo, per caso? –
Onestamente, no. Ho iniziato a rimuovere cose diverse per vedere cosa poteva scatenarlo. L'ho solo guardato di nuovo e sembra che l'azione '@ INIT IN di Redux lo licenzi un altro tempo, ma è difficile registrare quell'azione. Durante il rendering sul server registra solo un singolo 'mapStateToProps' per container.Speravo nella risposta di @DanAbramov – Mike
Ho anche guardato l'esempio del mondo reale di Redux per vedere quante volte mapStateToProps viene chiamato lì e crea molte chiamate. Sto pensando che non è così importante finché usi uno strumento come [Riseleziona] (https://github.com/rackt/reselect) per memorizzare i tuoi selettori. – Mike