Odpowiedź @jpdelatorre świetnie podkreśla ogólne powody, dla których składnik React może renderować się ponownie.
Chciałem tylko zagłębić się w jeden przykład: kiedy zmieniają się rekwizyty . Rozwiązywanie tego, co powoduje ponowne renderowanie komponentu React, jest częstym problemem, az mojego doświadczenia wynika, że często śledzenie tego problemu wymaga określenia, które właściwości ulegają zmianie .
Komponenty React renderują się ponownie, gdy otrzymają nowe rekwizyty. Mogą otrzymać nowe rekwizyty, takie jak:
<MyComponent prop1={currentPosition} prop2={myVariable} />
lub jeśli MyComponent
jest podłączony do sklepu Redux:
function mapStateToProps (state) {
return {
prop3: state.data.get('savedName'),
prop4: state.data.get('userCount')
}
}
Anytime wartość prop1
, prop2
, prop3
, czy prop4
zmiany MyComponent
będą ponownie render. Przy 4 rekwizytach nie jest zbyt trudno wyśledzić, które rekwizyty się zmieniają, umieszczając console.log(this.props)
na tym początku render
bloku. Jednak przy bardziej skomplikowanych komponentach i coraz większej liczbie rekwizytów ta metoda jest nie do utrzymania.
Oto przydatne podejście (przy użyciu lodash dla wygody) do określenia, które zmiany właściwości powodują ponowne renderowanie komponentu:
componentWillReceiveProps (nextProps) {
const changedProps = _.reduce(this.props, function (result, value, key) {
return _.isEqual(value, nextProps[key])
? result
: result.concat(key)
}, [])
console.log('changedProps: ', changedProps)
}
Dodanie tego fragmentu kodu do komponentu może pomóc w ujawnieniu sprawcy powodującego wątpliwe ponowne renderowanie, a często pomaga to rzucić światło na niepotrzebne dane przesyłane potokiem do komponentów.
shouldComponentUpdate
się wyłączenie automatycznej aktualizacji komponentów, a następnie rozpoczęcie śledzenia z tego miejsca. Więcej informacji można znaleźć tutaj: facebook.github.io/react/docs/optimizing-performance.html