Я начал использовать React весной 2017 года и за полгода изучил много интересных вещей и наделал много ошибок. В этой статье я расскажу начинающим изучение React, как избежать некоторых ошибок.
1 setState вызывает перерисовку
По умолчанию React заново отрисовывает компонент после каждого изменения состояния (state), и обычно с этим не возникает никаких сложностей. Но иногда это приводит к холостым перерисовкам, что не очень хорошо сказывается на производительности.
У каждого компонента есть метод shouldComponentUpdate и он вызывается каждый раз, когда меняется состояние или передаются новые параметры (props) из родительского компонента. Отрисовывать заново компонент или нет — за это отвечает этот метод.
По умолчанию этот метод возвращает true, но если переопределить этот метод в компоненте, то можно возвращать false в тех случаях, когда не требуется перерисовка.
shouldComponentUpdate(nextProps, nextState) {
const vitalPropsChange = this.props.bar !== nextProps.bar;
const vitalStateChange = this.state.foo !== nextState.foo;
return vitalPropsChange || vitalStateChange;
}
- Если неправильно определять, что должен возвращать этот метод, то компонент будет отрисовываться не так, как ожидается.
- Запуск вычислений в методе shouldComponentUpdate может привести к проблемам производительности.
2 setState обновляет состояние асинхронно
Изменение состояния не происходит моментально. Самая распространённая ошибка: чтение состояния сразу после вызова setState.
Если нужно обновить состояние, основываясь на предыдущем состоянии, то лучше всего использовать функцию updater в качестве первого аргумента функции setState(updater, [callback]).
Пример использования updater:
this.setState((prevState) => {
return {value: prevState.value + 1};
});
Также у setState может быть второй аргумент — callback. Это функция, которая вызывается сразу после изменения состояния и перерисовки компонента. Но, согласно официальной документации, для этого рекомендуется использовать метод componentDidUpdate.
3 Жизненный цикл компонента
Очень важно понять и простить жизненный цикл компонента.
Его можно условно разделить на 3 части:
Монтирование: объект компонента создаётся и вставляется в DOM.
Обновление: перерисовка компонента из-за изменения состояния или параметров.
Отмонтирование: удаление компонента из DOM.
4 Используйте componentWillReceiveProps
Если нужно изменять состояние при изменении параметров, используйте метод componentWillReceiveProps. В этом методе следует сравнивать текущее и следующее значение параметров, и если есть существенные изменения, то обрабатывать их.
Пара замечаний:
- Иногда React может вызвать componentWillReceiveProps, даже если параметры не изменились, поэтому в целях оптимизации производительности стоит сравнивать текущие параметры и следующие.
- React не вызывает componentWillReceiveProps во время монтирования компонента.
5 Используйте React Developer Tools
React Developer Tools позволяет инспектировать компоненты, их параметры и состояние. Это дополнение очень похоже на стандартный инспектор DOM, встроенный в Chrome Dev Tools.
React Developer Tools распространяется как расширения для браузера (для Chrome и Firefox), а также как самостоятельное приложение.
6 Используйте Create React App
Create React App от Facebook позволяет создавать приложения без настройки сборки. Этот инструмент прост в использовании и имеет хорошую инструкцию на Github. Для использования необходимо иметь Node версии 6 и выше.