Самый лучший способ повысить производительность приложения — уменьшить количество вызовов метода рендеринга.
Я рассматриваю несколько сценариев и решений, как показано ниже.
Сценарий 1. Пользовательские компоненты, в которых они в основном зависят от свойств
SelectComponent — это настраиваемый компонент, в котором он отображается на основе массива получаемых элементов. Компонент Home использует SelectComponent для создания раскрывающегося списка для стран, штатов и типов пользователей.
класс SelectComponent расширяет React.Component {
render() { ‹div› визуализирует выпадающие элементы, используя {this.props.items} ‹/div›}
}
класс Home расширяет React.Component{
состояние = {страны: […], состояния: […], selectedCountry: 1, userTypes: […] }
CountryChange(событие){
var filterStates = [… фильтровать состояния в зависимости от страны]
this.setState({ selectedCountry: event.target.value, States: filterStates})
}
оказывать() {
возвращение (
‹див›
‹SelectComponent items={this.state.countries} onChange={this.countryChange.bind(this)}/›
‹SelectComponent items={this.state.states} /›
‹SelectComponent items={this.state.userTypes} /›
‹/дел
);
}
}
Здесь, когда страна меняется, мы вызываем метод setState, где он также запускает метод рендеринга SelectComponent для пользовательских типов.
Мы можем переопределить это, внедрив shouldComponentUpdate.
После улучшения:
класс SelectComponent расширяет React.Component {
shouldComponentUpdate(newProps, newState){
if(this.props.items != newProps.items){
возвратить true;
}
вернуть ложь;
}
оказывать() {
‹div› отображает выпадающие элементы, используя {this.props.items} ‹/div›
}
}
Сценарий 2. Обновление определенного компонента вместо вызова всего рендеринга.
Домашний компонент имеет много строк в методе рендеринга. Предположим, что заголовок на экране должен обновляться на основе какого-либо действия, такого как buttonClick или любого другого действия. Обычно мы вызываем метод setState. Это вызывает весь метод рендеринга, который влияет на производительность.
класс Home расширяет React.Component{
состояние = {
title: «Добро пожаловать в демоверсию»
}
updateTitle (событие) {
this.setState({ title: 'Демонстрация запущена'})
}
оказывать() {
возвращение (
‹див›
‹div› {this.state.title}‹/div›
‹input type='button' value='Update' onClick={this.updateTitle.bind(this)}/›
‹Компонент2 /›
‹Компонент3 /›
‹Компонент4 /›
Какой-то другой код пользовательского интерфейса
….
…
‹/дел
);
}
}
Мы можем улучшить приведенную выше логику, создав отдельный компонент и используя ссылки для обновления только этого компонента.
После улучшения:
Заголовок класса расширяет компонент {
конструктор (реквизит) {
супер (реквизит);
this.state = {название: this.props.title}
}
setTitle (название) {
this.setState({название: название})
}
оказывать() {
возвращение (
‹див›
{это.государство.название}
‹/дел›
);
}
}
класс Home расширяет React.Component {
…
…
…
updateTitle (событие) {
//this.setState({ title: 'Демонстрация запущена'});
this.refs.header.setTitle('Демонстрация запущена');
}
оказывать() {
возвращение (
‹див›
‹Заголовок ref="header" title={this.state.title}›‹/ Заголовок ›
…
…
}
У меня есть несколько других подходов для добавления (кратко добавлено ниже). Я также добавлю их с некоторым псевдокодом, основываясь на отзывах об этом.
1.СоздайтеHigherOrderComponents для перемещения общей логики
2.Уменьшите вычисления в методе рендеринга.
3. не передавайте методы в качестве реквизита дочерним компонентам. Используйте ChildContext.. Это похоже на доступ к дочерним методам в родительском с помощью refs и доступ к родительским методам в дочернем с помощью childContext.