Лекция
Привет, Вы узнаете о том , что такое react, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое react, react lifecycle , настоятельно рекомендую прочитать все из категории Фреймворки. Famworks ( программная платформа).
Хотите узнать о том, что такое React, но вам все никак не выпадает шанс изучить его? Или, может быть, вы уже пробовали освоить React, но не смогли толком понять? А может, вы разобрались с основами, но хотите привести в порядок знания? Эта статья написана специально для тех, кто положительно ответил хотя бы на один из этих вопросов. Сегодня мы создадим простой музыкальный проигрыватель, раскрывая основные концепции React по мере продвижения к цели.
Менее привычный подход для back-end разработчиков, с ориентацией на верстку и событийный поток. React.js, по сути, является библиотекой/template-движком, на котором вполне можно разрабатывать без дополнительных средств, однако это не настолько удобно при росте проекта и его сложности.
Говоря «React», мы подразумеваем React + React DOM для веб-разработки. Если взять React и React Native, мы сможем в похожем синтаксисе разрабатывать кросс-платформенные мобильные приложения. Для упрощения такой подход называют React Native. Подробнее тут.
Таким образом, сформировалась целая экосистема React:
Самый популярный архитектурный паттерн в React.js — это Redux, эволюция идеи Flux. По сути, идея Flux — это тот самый знакомый CQRS для back-end-разработчиков.
Идея в том, чтобы централизовать логику изменения всего состояния приложения в одном месте — в редюсере. Таким образом мы избегаем неточностей и двузначностей, не зная какой стейт установится первым и почему. Компоненты же просто отрисовывают наш стейт.
Подход к разработке в React.js противоречит «классическому» — отделению кода от разметки. React имеет свой движок шаблонизации — JSX, который упрощает смешивание верстки и кода. Верстка вставляется прямо в код.
Из первых вопросов, которые стоит разобрать, я выделил такие:
В качестве учебника вполне подойдет официальная справка. https://ru.reactjs.org/docs/getting-started.html
Разобравшись с этим материалом, вы освоите следующее:
Это — практически все, что нужно знать для того, чтобы создавать и поддерживать React-приложения
React невероятен, потому что позволяет создавать пользовательский интерфейс с помощью декларативного API. Вы указываете React, как должен выглядеть интерфейс, а все остальное он делает.
Когда пользователи взаимодействуют с приложением, состояние изменяется, что вызывает обновления DOM. React предоставляет набор методов для беспрепятственного перехвата изменений в любой момент во время обновлений и получения контроля над пользовательским интерфейсом. Жизненный цикл компонента обычно является одним из заключительных этапов на пути к настоящему освоению React, и эта статья гарантирует, что у вас есть твердое понимание.
Жизненный цикл компонента можно определить как время с момента, когда компонент впервые вставляется в DOM, все время, когда компонент находится в DOM, и момент, когда компонент удаляется из DOM. У каждого компонента React в вашем коде уникальный жизненный цикл.
Обзор жизненного цикла
Методы жизненного цикла - это перехватчики, позволяющие читать изменения состояния и управлять обновлениями пользовательского интерфейса. Жизненный цикл можно разбить на 3 категории:
Mounting Монтирование: компонент добавляется в DOM.
Updates Обновления: компонент получает изменения свойств или состояния и вызывается при повторной визуализации компонента.
Unmounting Размонтирование: компонент удаляется из DOM.
Методы жизненного цикла предоставляют точки входа для выполнения любого из этих шагов. Любой метод, который начинается с componentWill, означает, что вы обращаетесь к нему до того, как произойдет событие, а любой метод с добавлением componentDid означает, что вы захватываете его после того, как событие происходит.
Рассмотрим такую ситуацию: к вам за помощью обращается маленький стартап. Они создали приятную страницу, пользуясь которой пользователи могут загружать в их сервис музыку и проигрывать ее. Им хочется, чтобы вы сделали самое сложное — вдохнули в эту страницу жизнь.
Для начала создайте новую директорию проекта и добавьте туда три файла.
(внизу их код)
Для успешного прохождения этого руководства вам понадобится свежая версия браузера Google Chrome, иначе не будут работать анимации. Выражаем благодарность Стивену Фабре за CSS для кнопки проигрывания и Джастину Виндлу за код визуализации (оригинал можно посмотреть здесь).
Откройте index.html в редакторе кода и в браузере. Пришло время познакомиться с React.
React — это инструмент для создания пользовательских интерфейсов. Его главная задача — обеспечение вывода на экран того, что можно видеть на веб-страницах. React значительно облегчает создание интерфейсов благодаря разбиению каждой страницы на небольшие фрагменты. Мы называем эти фрагменты компонентами.
Вот пример разбивки страницы на компоненты:
Каждый выделенный фрагмент страницы, показанной на рисунке, считается компонентом. Но что это значит для разработчика?
Компонент React — это, если по-простому, участок кода, который представляет часть веб-страницы. Каждый компонент — это JavaScript-функция, которая возвращает кусок кода, представляющего фрагмент страницы.
Для формирования страницы мы вызываем эти функции в определенном порядке, собираем вместе результаты вызовов и показываем их пользователю.
Напишем компонент внутри тега script файла index.html с type, установленным в "text/babel":
Когда мы вызываем функцию OurFirstComponent(), в ответ приходит фрагмент страницы.
Функции можно писать и так:
const OurFirstComponent = () => { return ( // То, что нужно для создания компонента, идет сюда ); }
React использует язык программирования, называемый JSX, который похож на HTML, но работает внутри JavaScript, что отличает его от HTML.
Вы можете добавить сюда обычный HTML для того, чтобы он попал в пользовательский интерфейс:
Когда мы вызываем функцию OurFirstComponent(), она возвращает фрагмент JSX-кода. Мы можем использовать так называемый ReactDOM для вывода того, что представляет этот код, на страницу:
Теперь тег H1 окажется внутри элемента с ID hook. Когда вы обновите страницу браузера, она должна выглядеть так:
Можно и написать собственный компонент на JSX. Делается это так:
ReactDOM.render(, placeWeWantToPutComponent);
Это — стандартный подход — вызывать компоненты так, будто вы работаете с HTML.
Компоненты React можно помещать в другие компоненты.
Вот что выведет вышеприведенный код:
Именно так страницы собирают из фрагментов, написанных на React — вкладывая компоненты друг в друга.
До сих пор мы писали компоненты в виде функций. Их называют функциональными компонентами. Однако, компоненты можно писать и иначе, в виде классов JavaScript. Их называют классами компонентов.
Классы компонентов должны содержать функцию, называемую render(). Эта функция возвращает JSX-код компонента. Их можно использовать так же, как функциональные компоненты, например, обращаясь к ним с помощью конструкции:
В том случае, если вас интересуют компоненты без состояния, предпочтение следует отдать функциональным компонентам, их, в частности, легче читать. О состоянии компонентов мы поговорим ниже.
В JSX-код можно помещать переменные JavaScript. Выглядит это так:
Теперь текст «I am a string» окажется внутри тега H1 Кроме того, тут можно делать и вещи посложнее, вроде вызовов функций:
Вот как будет выглядеть страница после обработки вышеприведенного фрагмента кода:
Переименуйте OurFirstComponent() в PlayButton. Нам надо, чтобы этот компонент возвращал следующее:
Однако, тут мы сталкиваемся с проблемой: class — это ключевое слово JavaScript, поэтому использовать его мы не можем. Как же назначить класс play элементу ?
Для того, чтобы этого добиться, нужно воспользоваться свойством className:
Компоненты, основанные на классах, могут хранить информацию о текущей ситуации. Эта информация называется состоянием (state), она хранится в JS-объекте. В нижеприведенном коде показан объект, представляющий состояние нашего компонента. Об этом говорит сайт https://intellect.icu . Его ключ — это isMusicPlaying, с ним связано значение false. Этот объект назначен this.state в методе constructor, который вызывается при первом использовании класса.
Метод constructor компонента React всегда должен вызвать super(props) прежде чем выполнять что угодно другое.
Итак, а что нам делать с этим «состоянием»? Зачем оно придумано?
Состояние — это инструмент, позволяющий обновлять пользовательский интерфейс, основываясь на событиях. Тут мы будем использовать состояние для изменения внешнего вида кнопки проигрывания музыки, основываясь на щелчке по ней. Кнопка может отображаться в одном из двух вариантов. Первый указывает на возможность запуска проигрывания, второй — на то, что музыка проигрывается, и этот процесс можно приостановить. Когда пользователь щелкает по кнопке, меняется состояние, а затем обновляется пользовательский интерфейс.
Вот с чего мы начнем. Узнаем состояние компонента с помощью конструкции this.state. В следующем коде мы проверяем состояние и используем его для принятия решения о том, какой текст показать пользователю.
В функции render ключевое слово this всегда ссылается на компонент, внутри которого она находится.
Все это не особенно полезно, если у нас нет способа изменять this.state.isMusicPlaying.
Пользователь может взаимодействовать с компонентом, щелкая по кнопке проигрывания музыки. Мы хотим реагировать на эти события. Делается это посредством функции, которая занимается обработкой событий. Эти функции так и называются — обработчики событий.
Когда пользователь щелкает по тексту, представленному тегом H1 , компонент вызывает функцию handleClick. Функция получает объект события в качестве аргумента, а это значит, что она может, при необходимости, им пользоваться.
Мы используем метод .bind функции handleClick для того, чтобы ключевое слово this ссылалось на весь компонент, а не только на H1
Когда меняется состояние компонента, он снова вызовет функцию render. Мы можем изменить состояние с помощью this.setState(), если передадим этой функции объект, представляющий новое состояние. Компонент на странице всегда будет представлять свое текущее состояние. React самостоятельно обеспечивать такое поведение компонентов.
Теперь, разобравшись с этим механизмом, займемся обработкой щелчка по кнопке.
Компоненты могут «общаться» друг с другом. Посмотрим, как это работает. Мы можем сообщить PlayButton, проигрывается музыка или нет, используя так называемые свойства (props). Свойства — это информация, коллективно используемая родительским компонентом и компонентами-потомками.
Свойств в JSX выглядят так же, как HTML-свойства. Мы назначаем PlayButton свойство, называемое isMusicPlaying, которое является тем же самым, что и isMusicPlaying в this.state.
Когда состояние Container меняется, свойство PlayButton также меняется, и функция PlayButton вызывается снова. Это означает, что вид компонента на экране обновится.
Внутри PlayButton мы можем реагировать на изменения, так как PlayButton принимает свойства как аргумент:
Если мы поменяем состояние на this.state = { isMusicPlaying: true }; и перезагрузим страницу, на ней должна появиться кнопка паузы:
Свойства необязательно должны представлять собой какие-то данные. Они могут быть и функциями.
Теперь, когда мы щелкаем по кнопке PlayButton, она меняет состояние Container, которое изменит props PlayButton, что приведет к обновлению кнопки на странице.
При вызове setState изменение состояния не производится мгновенно. React ждет немного для того, чтобы увидеть, не нужно ли внести еще какие-то изменения, и только потом производит изменение состояния. Это означает, что нельзя точно знать, каким будет состояние компонента после вызова setState.
Поэтому вот так поступать не следует:
Если вы изменяете состояние, основываясь на предыдущем состоянии, нужно делать это по-другому. А именно, следует передать setState функцию, а не объект. Эта функция принимает старое состояние как аргумент и возвращает объект, представляющий новое состояние.
Выглядит это так:
Эта конструкция сложнее, но она необходима только в том случае, если вы используете старое состояние для формирования нового состояния. Если нет — можно просто передавать setState объект.
Пришло время включить музыку. Для начала добавим тег audio
:
Нам нужен способ обратиться к тегу audio и вызвать либо его метод play(), либо pause(). Сделать это можно с помощью конструкции document.getElementById('audio').play(), но React предлагает кое-что получше.
Мы назначаем элементу атрибут, называемый ref, который принимает функцию. Эта функция, в качестве первого аргумента, принимает элемент, и присваивает его this.audio.
Эта функция будет вызываться каждый раз, когда выводится Container, то есть, this.audio всегда будет в актуальном состоянии и будет указывать на тег
.
Теперь мы можем запускать и приостанавливать воспроизведение музыки:
Выгрузим на страницу музыкальный файл (лучше — в формате .mp3) с использованием кнопки Choose files, нажмем на кнопку запуска воспроизведения и послушаем музыку.
Как вы, возможно, догадались, React-код не должен «жить» исключительно внутри тега script. React поддерживает множество конфигураций сборки. К счастью, с помощью инструментов вроде Create React App всю рутинную работу по формированию каркаса приложения можно автоматизировать. Установите create-react-app, создайте новый проект, посмотрите руководство и приступайте к работе с JS-файлами в папке проекта src, применяя все те знания по React, которые вы сегодня получили.
Эти вопросы показывают общее представление о том, что такое React и как он работает:.
Что такое компонент в реакции и каковы два основных способа их определения?
- Компонент: независимый многоразовый интерфейс
- Компонент класса: компонент, реализованный с использованием классов ES6, расширяющих React.Component
- Компонент функции: Компонент, реализованный функцией JS, которая принимает аргумент props и возвращает элемент React.
2. Как компоненты Class сравниваются с компонентами Function?
- С помощью React Hooks компоненты класса заменяются функциональными компонентами для большинства случаев использования¹
- В прошлом логика с учетом состояния и жизненного цикла могла быть включена только в компоненты класса
Недостатки функциональных компонентов
- Для необычных жизненных циклов еще нет эквивалентов Hook: getSnapshotBeforeUpdate и componentDidCatch
- Старые сторонние библиотеки могут быть несовместимы с хуками
Недостатки компонентов класса
- Классы добавляют ненужную путаницу ради синтаксического сахара.
- Классы приводят к громоздкому иерархическому дереву, особенно во время повторного использования кода, что приводит к снижению производительности и сложности тестирования.
- Методы жизненного цикла класса разделяют связанные фрагменты кода
- Дополнительная информация: Чем функциональные компоненты отличаются от классов?
3. Что такое props и state в React?
- props — это объект JavaScript, переданный в Компонент, который содержит свойства конфигурации
- props неизменен принимающим компонентом
- state — это объект JavaScript, управляемый внутри компонента, который содержит его внутреннее состояние.
- Обновления для запуска повторного рендеринга
4. Что вызывает обновление компонента?
- Повторный рендеринг родителя, который может повлечь за собой новые props
- SetState ()
- (B) forceUpdate () (и этого следует избегать!)
5. Что делает setsettate () и как это работает?
- setState () планирует обновление объекта состояния компонента. -Когда состояние изменяется, компонент отвечает повторным рендерингом.
- Вызовы setState () являются асинхронными и могут быть пакетными.
- Обновления this.state не отражают новое значение сразу после вызова setState ()
- Из-за своей асинхронной природы вызов метода setState () путем передачи объекта, содержащего значение текущего состояния, может привести к неожиданному поведению
- Передача setState () функции, а не объекта, позволяет получить доступ к значению текущего состояния, избегая потенциально непредвиденного поведения, вызванного асинхронностью
6. Проведите меня через основные этапы жизненного цикла React
- 3 фазы: Mounting, Updating, Unmounting
- Mounting: конструктор → рендер → Updating DOM → componentDidMount
- Updating: рендер → обновление DOM → componentDidUpdate
- Unmounting: componentWillUnmount
- (B) включение getDerivedStateFromProps и shouldComponentUpdate
7. Как я могу предотвратить ненужный повторный рендеринг?
- React.PureComponent: Компоненты, созданные из этого класса, проводят поверхностное сравнение с предстоящими параметрами и состоянием и повторно визуализируют при наличии изменений.
- React.Memo: Компонент высшего порядка, который работает как -React.PureComponent, но используется для компонентов функций
shouldComponentUpdate: метод жизненного цикла, который принимает следующие реквизиты и состояние и возвращает логическое значение, указывающее, должен ли компонент повторно отображаться
8. Мое приложение React работает медленно, как мне улучшить его производительность?
- Выявление узких мест: профилирование компонентов в Chrome с помощью вкладки производительности Chrome или DevTools Profiler
- Виртуализируйте длинные списки — визуализируйте только узлы списков по мере необходимости
- Как избежать ненужных повторных рендеров (см. Предыдущий вопрос)
- Использование производственной сборки
9. Что такое рефери и для чего они используются?
- Ссылки предоставляют доступ к узлам DOM или элементам React, созданным в методе render ().
- В прошлом ссылки были ограничены только компонентами класса, но теперь они доступны в компонентах функций через хук useRef.
Использование включает в себя:
- Управление фокусом, выделением текста или воспроизведением мультимедиа.
- Запуск императивных анимаций.
- Интеграция со сторонними библиотеками DOM.
10. Что такое ключи и зачем они нужны при рендеринге списков?
- Ключи являются константными значениями строк, которые однозначно идентифицируют элемент списка среди своих братьев и сестер.
- Клавиши помогают React определить, какие элементы были изменены, добавлены или удалены.
- Ключи необходимы, потому что согласование различий элементов списка без них крайне неэффективно
11. Что такое контролируемые и неуправляемые компоненты в React?
- Оба являются способами реализации элементов управления формы в React
- Контролируемый: данные формы обрабатываются компонентом React
- Неконтролируемый: данные формы обрабатываются самим DOM
- Контролируемые компоненты являются рекомендуемым способом реализации форм.
- Неконтролируемые компоненты являются опцией при преобразовании устаревших баз кода в React или интеграции с не-React библиотекой¹
12. Что такое props.children?
7. Как производительность использования хуков сравнивается с производительностью классов?
State Management
1. Что такое Redux?
- Redux — это библиотека для управления состоянием приложения
- Redux — это решение для глобального управления состоянием, позволяющее передавать данные без необходимости проходить реквизит через каждый уровень (так называемое бурение
продолжение следует...
Часть 1 Основы React, React Lifecycle , вопросы на собеседование
Часть 2 Итоги - Основы React, React Lifecycle , вопросы на собеседование
Ответы на вопросы для самопроверки пишите в комментариях, мы проверим, или же задавайте свой вопрос по данной теме.
Комментарии
Оставить комментарий
Фреймворки. Famworks ( программная платформа)
Термины: Фреймворки. Famworks ( программная платформа)