10 фишек из JavaScript, которые помогут писать более качественный код на React
React — это почти чистый JS. Чем лучше вы понимаете JS, тем лучше вы в React. Разбираем концепции, которые помогут кодить круче и на том, и на другом.
39К открытий41К показов
React построен на основе чистого JavaScript, если не считать некоторых особенностей. В этой статье собраны 10 основных концепций JavaScript, с которыми вы столкнётесь практически в любом серьёзном приложении на React. Их понимание позволит увереннее работать с библиотекой пользовательских интерфейсов.
Переменные let и const
В JavaScript
Ключевые слова let и const дают более предсказуемые переменные, чем те, что объявлены через var.
У них блочная область видимости: такие переменные существуют только в пределах участка кода, ограниченного фигурными скобками. Такой подход позволяет избежать конфликта переменных, делая код более предсказуемым.
let используется для переменных, которые нужно переназначить после создания. Переменные, объявленные с помощью const, невозможно переназначить или изменить.
В React
let и const — предпочтительные ключевые слова для объявления переменных в React, поскольку их поведение предсказуемо. Как и в JS, переменные, которые планируется переназначить, объявляют с помощью let, а те, которые не нужно переназначать, — const.
const также используют при объявлении компонентов в комбинации со стрелочными функциями, поскольку компоненты остаются неизменными.
Шаблонные строки
В JavaScript
Шаблонные строки намного динамичнее базового типа String в JS, получаемого с помощью одинарных или двойных кавычек. С их помощью гораздо проще интерполировать и вставлять значения в строки.
Достаточно использовать синтаксис ${}, чтобы вставить допустимое в JS выражение. Для конкатенации и комбинирования строк не нужен оператор «+», проще писать многострочные объекты типа String, поскольку не нужно создавать новые строки с помощью символа новой строки (\n) или возврата каретки (\r).
Кроме того, в шаблонных строках можно использовать вложенные кавычки (одинарные и двойные), не опасаясь ошибок.
В React
Шаблонные строки используют, чтобы создавать сложные объекты класса String, а также динамически вычислять стили элементов в зависимости от условий. Можно вставлять значения переменных, операторы, вызовы функций и т. д.
Стрелочные функции
В JavaScript
Со стрелочными функциями можно использовать сокращённый синтаксис. Это делает весь код короче. Можно заменить ключевое слово return (возврат происходит по умолчанию, если нет фигурных скобок) и тело функции (фигурные скобки) большой стрелкой (=>).
Проще работать с объектами и классами через ключевое слово this. Кроме того, можно удалить скобки вокруг одиночного параметра.
В React
Если в JavaScript можно создать стандартную функцию, можно создать и стрелочную. Как правило, второй вариант предпочтительнее, потому что синтаксис проще.
Чаще всего стрелочные функции используют для создания компонентов, а также для методов массивов высшего порядка, таких как .map() или .filter().
Методы массивов .map(), .filter(), .reduce(), и т. д.
В JavaScript
Так же, как и цикл for, методы массивов map, filter и reduce позволяют перебирать элементы массива:
- .map() — позволяет преобразовать каждый элемент массива;
- .filter() — создаёт новый массив со всеми элементами, которые прошли проверку, заданную в функции;
- .reduce() — позволяет преобразовать весь массив в соответствии с нашими нуждами (даже в другой тип данных).
Указанные методы короче и читаются легче, чем цикл for. Комбинируя эти методы и стрелочные функции, можно ещё больше сократить код.
В React
Методы .map(), .filter(), .reduce() можно использовать для преобразования данных. Обычно их применяют для динамического отображения элементов и компонентов с помощью .JSX, поскольку эти методы можно связывать в цепочки для последовательных трансформаций.
Деструктурирующее присваивание
В JavaScript
Деструктурирующее присваивание позволяет распаковать массивы или объекты в переменные. Это удобная концепция, поскольку не нужно ссылаться на весь объект, когда мы хотим его использовать.
Деструктуризация позволяет извлечь нужное нам значение из объекта, создав для этого значения независимую переменную. Мы можем сделать код чище, не ссылаясь на объект, когда нам нужно только одно его значение.
В React
Чаще всего деструктурирующее присваивание используют, чтобы получить значение одиночного свойства объекта. Если мы передаём в заданный компонент только одно свойство объекта, все остальные нам не нужны. Вместо того чтобы давать ссылку на свойства, мы можем деструктурировать их и передать в компонент одну переменную.
Параметры по умолчанию
В JavaScript
Параметру по умолчанию пригодятся, чтобы обрабатывать событие, переданное функцией без аргументов. Также они помогут избежать ошибок и сделать код более предсказуемым.
В React
Параметры по умолчанию часто применяют при определении свойств. В примере ниже мы используем деструктурирующее присваивание для получения параметра ‘username’ из свойств объекта. И хотя свойство не передано, дефолтное значение установлено на ‘guest’ и компонент всё равно работает.
Синтаксис spread (три точки — …)
В JavaScript
Синтаксис spread позволяет расширять объекты (их пары ключ-значение) и массивы, получая новые объекты. Этот синтаксис работает только при создании нового объекта или массива.
Синтаксис spread хорош для объединения свойств старого объекта в новом. Когда объект или массив расширяется, создавая новый объект или массив, появляется временная копия.
В React
Синтаксис spread отлично подходит для динамического создания новых объектов и массивов, зачастую его применяют в React-библиотеках (например Redux) для более предсказуемого изменения данных.
Кроме того, в React такой приём можно использовать, для того чтобы передать данные объекта в виде набора свойств, не обращаясь к ним по очереди: для этого мы можем расширить объект в компонент, поскольку при этом мы получим объект набора свойств.
Короткие условные операторы
В JavaScript
В JavaScript есть сокращённая форма записи условных операторов if-else — тернарная операция (ternary). В отличие от if-else тернарные операции являются выражениями. Это даёт большую гибкость, позволяя использовать их так же, как и любые другие выражения (такие как ${} в случае с шаблонными строками).
Тернарные операции не всегда лучше оператора if-else. Например при обработке множественных условий первые окажутся неудобочитаемыми.
В React
Можно вывести через JSX один результат, если условие истинно, и другой, если оно ложно, при этом записав код намного короче, чем через if-else.
Если результат нужно выводить только при истинности условия, можно использовать оператор &&.
Модули ES
В JavaScript
С помощью модулей ES удобно распределять код по файлам приложения. Мы экспортируем то, что хотим передать в другие файлы нашего приложения (в основном переменные и функции), а затем импортируем их там, где нужно.
Можно осуществлять множественный экспорт/импорт с помощью фигурных скобок (и ключевых слов export/import) или одиночный без скобок (с ключевыми словами export default и import).
Такой подход позволяет сделать код модульным. Мы можем писать код там, где он нужен, не собирая всё в один большой файл. В примере ниже показано, как вызвать функцию getLocalTime из отдельного файла в app.js.
В React
Экспортировать и импортировать можно практически всё что угодно, не только JS, но и CSS, файлы изображений и т. д.
В React часто не нужно добавлять расширение файла при импорте JavaScript. Расширения нужны только при импорте в JS других типов файлов.
Промисы + async/await
В JavaScript
Можно отложить на неопределённое время выполнение некоторых участков кода в JavaScript (например setTimeout(), событие listener или сетевой запрос с fetch API).
Промисы — способ сделать предсказуемым асинхронный код на JS. Они помогают разрешать код, созданный с помощью async. Успешно выполненный код обрабатывается с помощью функций обратного вызова .then(), ошибки — с помощью функции .catch();
async/await — улучшенный синтаксис для работы с промисами, который заставляет асинхронный код выглядеть синхронным.
В React
Промисы и async/await используют для создания сетевых запросов, таких как обращение к API.
Библиотеки вроде fetch API или axios применяют промисы для запросов, выполнение которых может занять неопределённое время. Ещё промисы и async/await в подобных библиотеках используют для формирования сетевых запросов:
39К открытий41К показов