Вы можете реализовать логику shouldComponentUpdate
для предотвращения повторного рендеринга компонентов.Как правило, это плохая идея (подробнее об этом позже), но, похоже, она применима к вашему варианту использования.В общем, лучше просто использовать PureComponent
, чтобы предотвратить ненужные повторные отображения.Это реализует shouldComponentUpdate
логику, которая сравнивает state
и props
и, если ни то, ни другое не изменилось, обновление не происходит.
Не видя ваш код, я предпочитаю, как shouldComponentUpdate
может выглядеть вваш контекст:
shouldComponentUpdate(nextProps) {
if(this.state.isSelected && this.state.id !== nextProps.selectedId) {
return true;
} else if (!this.state.isSelected && this.state.id === nextProps.selectedId) {
return true;
}
return false;
}
Обратите внимание, что это означает, что повторное отображение не произойдет , если shouldComponentUpdate
не вернет true или вы не вызовете this.forceUpdate()
для этого компонента.Ваш компонент даже не будет отображаться, если вызывается this.setState()
, если вы не добавите более конкретную логику, чтобы shouldComponentUpdate
возвращало true при изменении состояния.Это может привести к трудностям в отладке, когда ваш пользовательский интерфейс не отображает изменения в состоянии приложения, но очевидной ошибки не возникает.Это поведение не относится к дочерним компонентам, поэтому, если у этих компонентов есть дочерние компоненты, они все равно будут перерисованы, как и ожидалось.Если вы решите внедрить shouldComponentUpdate
, вы также можете добавить логику для сравнения состояния, объявив параметр nextState
:
shouldComponentUpdate(nextProps, nextState) {
if(this.state.isSelected && this.state.id !== nextProps.selectedId) {
return true;
} else if (!this.state.isSelected && this.state.id === nextProps.selectedId) {
return true;
} else if (/*compare this.state to nextState */) { .... }
return false;
}
Реализация собственного shouldComponentUpdate
является сложной задачей и может потребовать от вас реструктуризацииваш код для достижения наилучших результатов (например, передача переменной isSelected
вашим компонентам вместо того, чтобы позволить этим компонентам решать, выбраны они или нет, может позволить вам легко реализовать PureComponent
).Желаем удачи!