A resposta do @ jpdelatorre é ótima para destacar razões gerais pelas quais um componente React pode ser renderizado novamente.
Eu só queria mergulhar um pouco mais fundo em uma instância: quando os objetos mudam . A solução de problemas do que está causando a re-renderização de um componente React é um problema comum e, na minha experiência, muitas vezes rastrear esse problema envolve determinar quais objetos estão sendo alterados .
Os componentes de reação são renderizados novamente quando recebem novos adereços. Eles podem receber novos adereços como:
<MyComponent prop1={currentPosition} prop2={myVariable} />
ou se MyComponent
estiver conectado a uma loja redux:
function mapStateToProps (state) {
return {
prop3: state.data.get('savedName'),
prop4: state.data.get('userCount')
}
}
Sempre que o valor de prop1
, prop2
, prop3
, ou prop4
mudanças MyComponent
vai voltar a render. Com 4 adereços, não é muito difícil rastrear quais adereços estão sendo alterados colocando um console.log(this.props)
no início do render
bloco. No entanto, com componentes mais complicados e mais e mais adereços, esse método é insustentável.
Aqui está uma abordagem útil (usando o lodash por conveniência) para determinar quais alterações de prop estão causando a re-renderização de um componente:
componentWillReceiveProps (nextProps) {
const changedProps = _.reduce(this.props, function (result, value, key) {
return _.isEqual(value, nextProps[key])
? result
: result.concat(key)
}, [])
console.log('changedProps: ', changedProps)
}
A adição desse snippet ao seu componente pode ajudar a revelar o culpado que está causando as renderizações duvidosas e, muitas vezes, isso ajuda a esclarecer os dados desnecessários sendo canalizados para os componentes.
shouldComponentUpdate
para desativar a atualização automática de componentes e iniciar o rastreamento a partir daí. Mais informações podem ser encontradas aqui: facebook.github.io/react/docs/optimizing-performance.html