Введение
Как говорится на официальном сайте React:
«React — это декларативная, эффективная и гибкая библиотека JavaScript для создания пользовательских интерфейсов. Он позволяет создавать сложные пользовательские интерфейсы из небольших и изолированных фрагментов кода, называемых «компонентами».
Мы разрабатываем эффективные классные одностраничные приложения с использованием React.
Любую веб-страницу можно разделить на компоненты. Пример:
Почему реагировать?
Состояние пользовательского интерфейса становится трудно обрабатывать с помощью Vanilla JS. Вам придется вручную выбирать элементы DOM, и есть вероятность, что вы в конечном итоге будете использовать слишком много селекторов запросов для своих манипуляций и операций.
Когда мы создаем веб-приложения, в которых мы динамически добавляем или удаляем компоненты, это может быть громоздкой операцией с Vanilla JS.
React спасает нас от этого кошмара, проблемы управления состоянием пользовательского интерфейса. Это позволяет разработчикам сосредоточиться на бизнес-логике, а не на предотвращении взрыва приложения.
React поддерживается большим сообществом, что является дополнительным преимуществом.
JSX
Это расширение синтаксиса для JS. Babel компилирует JSX в вызовы React.createElement().
Итак, приведенные выше два примера идентичны.
После компиляции выражения JSX становятся обычными вызовами функций JavaScript и оцениваются как объекты JavaScript.
ПРИМЕЧАНИЕ. JSX предотвращает атаки путем внедрения.
По умолчанию React DOM экранирует любые значения, встроенные в JSX, перед их рендерингом. Таким образом, это гарантирует, что вы никогда не сможете внедрить что-либо, что явно не написано в вашем приложении.
Вместо того, чтобы искусственно разделять технологии, помещая разметку и логику в отдельные файлы, React разделяет задачи слабо связанными единицами, называемыми «компонентами», которые содержат и то, и другое.
Рендеринг в React
Обычно SPA, встроенный в реакцию, будет иметь один корневой узел DOM. Как указано на официальном сайте,
«Элементы — это самые маленькие строительные блоки приложений React».
То, что мы видим на экране, является элементом. А для рендеринга элемента React на корневом узле DOM мы используем метод ReactDOM.render().
ReactDOM.render(‹App /›, document.getElementById(‘root’));
Элементы React неизменяемы. После создания его дочерние элементы или атрибуты не могут быть изменены.
React DOM сравнивает элемент и его дочерние элементы с предыдущим и применяет только те обновления DOM, которые необходимы для приведения DOM в желаемое состояние.
Реквизит и состояния
Реквизиты и состояния — это основные концепции React. Изменения в свойствах и/или состояниях вызывают React для повторного рендеринга компонента и потенциального обновления DOM в браузере.
Реквизит
«реквизит» позволяет нам передавать данные от родительского компонента к дочернему компоненту. Компонент никогда не должен изменять свои собственные реквизиты. Реквизиты доступны только для чтения.
Все компоненты React должны вести себя как чистые функции в отношении своих реквизитов.
Состояние
Состояние используется для изменения компонента или, скажем, состояния компонента изнутри. Изменения состояния также вызывают обновление пользовательского интерфейса.
В предлагаемой архитектуре проекта состояния поддерживаются в компонентах более высокого уровня (обычно компоненты на основе классов) и передаются в качестве реквизита компонентам более низкого уровня, которые обычно являются презентационными компонентами. Компоненты более низкого уровня не могут напрямую редактировать состояние.
Изменение состояния
Состояния в React не изменяются напрямую. Он изменяется с помощью метода под названием «setState()».
Состояния назначаются только в конструкторе. Обновления состояния могут стать асинхронными, поэтому форма вышеуказанного метода, которая принимает функцию, а не объект, является наиболее предпочтительной. Функция получает предыдущее состояние в качестве первого аргумента, а реквизиты во время применения обновления — в качестве второго аргумента.
ПРИМЕЧАНИЕ: метод setState() объединяет предоставленный объект с текущим состоянием. Однако слияние неглубокое.
Управление состояниями в функциональных компонентах
Исторически сложилось так, что состояния в реакции сохранялись в компонентах на основе классов. Однако, начиная с React 16.8, также есть способ управлять состояниями в функциональных компонентах с помощью хука useState() React.
useState() — это функция, которая принимает начальное состояние и возвращает массив ровно из двух элементов. Первый элемент, возвращаемый обратно, всегда будет иметь текущее состояние, а второй элемент всегда будет функцией, которая позволяет нам обновлять это состояние. Например:
Компоненты без состояния и компоненты с состоянием
Компонент с отслеживанием состояния — это компонент, который может быть либо компонентом на основе класса, либо функциональным компонентом, но управляет состоянием.
Вы можете использовать компоненты без состояния внутри компонентов с состоянием, и наоборот.
Классовые и функциональные компоненты
Основное различие между этими двумя компонентами после последнего обновления React заключается в том, что компоненты на основе классов расширяют компонент React, в то время как функциональные компоненты являются обычными функциями, которые принимают реквизиты в качестве аргументов. Они отличаются управлением состоянием и крючками жизненного цикла.
Крючки жизненного цикла компонентов
Это относится только к компонентам на основе классов. Важные зацепки жизненного цикла для компонента на основе классов в React перечислены ниже на диаграмме. Мы будем разделять эти крючки жизненного цикла на основе создания и обновления компонентов. React выполняет эти хуки для нас в разное время.
Жизненный цикл компонента — создание
«getDerivedStateFromProps» — это хук жизненного цикла, который был добавлен после React 16.3 и представляет собой статическую функцию JS для синхронизации состояний с изменениями свойств для компонента. Хотя он будет использоваться в очень редких сценариях.
Жизненный цикл компонента — обновление
‘getSnapshotBeforeUpdate’ принимает предыдущие реквизиты и предыдущее состояние и возвращает объект моментального снимка, который можно настроить. Он также используется минимально, обычно в сценариях, например, если мы хотим сохранить последнюю точку прокрутки пользователя в компоненте, чтобы после обновления пользовательского интерфейса мы могли восстановить представление до этой конкретной точки прокрутки.
Эквивалент крюка жизненного цикла для функциональных компонентов
С введением хуков React функциональные компоненты стали более мощными и теперь также могут управлять состояниями. Ранее мы исследовали хук React ‘useState’. Здесь мы собираемся исследовать хук React «useEffect», который в основном объединяет функциональные возможности или варианты использования, которые мы можем охватить, всех хуков жизненного цикла на основе классов в одном хуке React.
"useEffect" будет выполняться для каждого цикла рендеринга. Следовательно, это «componentDidMount» и «componentDidUpdate» в одном хуке. Тем не менее, это может быть сложнее в использовании. Что, если мы хотим поставить HTTP-запрос только при создании компонента в самый первый раз?
«useEffect» принимает второй аргумент в качестве аргумента для проверки, когда он должен выполнять свои операции. Итак, когда мы передаем пустой массив в качестве аргумента, он сообщает React, что у него нет зависимостей для проверки, следовательно, он будет запущен только во время создания.
Оптимизация: shouldComponentUpdate
Хук жизненного цикла shouldComponentUpdate принимает два аргумента nextProps и nextState. По сути, он сравнивает nextProps с текущими реквизитами, но это может быть сложнее.
Предположим, в реквизите есть массив «лица», и его нужно сравнить в этом хуке жизненного цикла. Массивы являются ссылочным типом в JS. Следовательно, мутация состояний в React становится важной. Мы всегда создаем новый объект, который, в свою очередь, ссылается на новый указатель и последовательно, сравнение становится успешным.
Поскольку этот хук жизненного цикла недоступен для функционального компонента, мы оптимизируем наши функциональные компоненты с помощью React.memo().
Если мы хотим выполнить полную проверку реквизита, лучше использовать чистый компонент в React, а не использовать этот хук жизненного цикла.
Обновления DOM в React
React не обновляет DOM сразу после вызова метода рендеринга. Он сравнивает старый виртуальный DOM с перерисованным DOM.
Он изменяется только в тех местах, где обнаружены различия. Например, если текст кнопки изменится, он будет обновлять только текст, а не повторно отображать кнопку, забудьте о DOM.
Компоненты высшего порядка
Все, что он делает, по сути, это обертка другого компонента. Он не содержит собственной логики или стилей и не добавляет какой-либо структуры в код JSX.
ссылки
Рефы предоставляют способ доступа к узлам DOM или элементам React, созданным в методе рендеринга.
Есть несколько хороших вариантов использования рефов:
· Управление фокусом, выделением текста или воспроизведением мультимедиа.
· Запуск императивной анимации.
· Интеграция со сторонними библиотеками DOM
ПРИМЕЧАНИЕ. Избегайте использования ссылок для всего, что можно сделать с помощью объявления.
Я также добавляю ссылки на мои связанные статьи о Redux и сравнении механизма обнаружения изменений в Angular и React.
Я также хотел бы упомянуть курс Udemy по React от Academind, который помог мне понять нюансы React.
Ссылки: