Ответ @ jpdelatorre хорош в освещении общих причин, по которым компонент React может перерисовываться.
Я просто хотел погрузиться немного глубже в один случай: когда реквизит меняется . Устранение неполадок, связанных с повторным рендерингом компонента React, является распространенной проблемой, и, по моему опыту, много раз отслеживание этой проблемы включает определение того, какие реквизиты меняются .
Реактивные компоненты пересчитывают каждый раз, когда получают новые реквизиты. Они могут получать новые реквизиты, такие как:
<MyComponent prop1={currentPosition} prop2={myVariable} />
или если MyComponent
подключен к хранилищу резервов:
function mapStateToProps (state) {
return {
prop3: state.data.get('savedName'),
prop4: state.data.get('userCount')
}
}
В любое время значение prop1
, prop2
, prop3
, или prop4
изменения MyComponent
будут повторной визуализации. С 4 реквизитами не так сложно отследить, какие реквизиты меняются, поместив console.log(this.props)
в этом начале render
блока. Однако с более сложными компонентами и все большим количеством реквизита этот метод несостоятельный.
Вот полезный подход ( для удобства использующий lodash ), чтобы определить, какие изменения реквизита вызывают повторный рендеринг компонента:
componentWillReceiveProps (nextProps) {
const changedProps = _.reduce(this.props, function (result, value, key) {
return _.isEqual(value, nextProps[key])
? result
: result.concat(key)
}, [])
console.log('changedProps: ', changedProps)
}
Добавление этого фрагмента к вашему компоненту может помочь выявить виновника сомнительного повторного рендеринга, и много раз это помогает пролить свет на ненужные данные, передаваемые по компонентам.
shouldComponentUpdate
чтобы отключить автоматическое обновление компонентов, а затем начать свою трассировку оттуда. Дополнительную информацию можно найти здесь: facebook.github.io/react/docs/optimizing-performance.html