В этом посте мы погрузимся в чудесный мир RxJS.
Появление RxJS открыло много возможностей в мире JS. Его цель - достичь очень многих с помощью небольшого кода. В этом посте мы узнаем, как обмениваться данными между компонентами в приложении React, используя мощь RxJS.
Совет: используйте Bit для систематизации компонентов React и обмена ими. Делитесь компонентами, которые ваша команда может использовать и развивать во всех ваших приложениях, а также быстрее создавать вместе. Попробуйте сами.
Redux
Обмен данными между несвязанными компонентами React был основной целью библиотек управления состоянием. Существует множество реализаций управления состоянием, но самые популярные из них:
- Поток
- Redux
Redux получил широкое распространение из-за своей простоты и использования чистых функций. Благодаря его чистоте мы можем быть уверены, что все наши функции редуктора не вызывают побочных эффектов.
С Redux мы создаем центральное хранилище данных -
затем мы подключаем компоненты к хранилищу данных и обновляем и удаляем состояние по желанию. Любые изменения, внесенные в магазин, будут отражены во всех компонентах, подключенных к магазину; Таким образом, данные могут передаваться компонентам, независимо от того, насколько глубоко они вложены. Компонент n-го уровня в дереве может передавать данные самому верхнему компоненту, а самый верхний компонент может передавать данные компоненту 21 уровня.
RxJS
С RxJS все стрессы и путаница, связанные с использованием библиотек управления состоянием, заканчиваются. Нам нравится паттерн Observer, который предлагает нам RxJS.
Мы просто создаем поток Observable и позволяем всем компонентам прослушивать поток, если какой-либо компонент добавляет к потоку, что компоненты прослушивания или подписки отвечают на обновление их DOM.
Настройка
Создайте приложение React, используя create-react-app
. Если сначала у вас нет create-react-app
, установите его глобально:
npm i create-react-app -g
Затем создайте проект React:
create-react-app react-prj
Перейти в каталог:
cd react-prj
Устанавливаем библиотеку rxjs:
npm i rxjs
У нас будет файл, который инстанцирует новый объект BehaviorSubject.
Зачем использовать BehaviorSubject? BehaviorSubject - это тип Subject в RxJS, в качестве дочернего Subject он позволяет нескольким наблюдателям прослушивать поток и события, многоадресные для наблюдателей, BehaviorSubject сохраняет последнее значение и передает его любому новому подписчики.
- Разрешает многоадресную рассылку
- Сохраняет и передает последнее значение, отправленное подписчиками.
У нас есть файл messageService.js, расположенный в папке src. Он экспортирует подписчику экземпляр BehaviorSubject и объект messageService. Объект подписчика создается в начале файла, чтобы быть доступным для любого импортирующего компонента. Объект messageService имеет функцию отправки, которая принимает параметр msg, который содержит данные, которые нам нужны для широковещательной рассылки всех компонентов прослушивания, в теле функции мы вызываем метод emit в объекте подписчика, он выполняет многоадресную рассылку данных подписывающимся компонентам.
Допустим, у нас есть компоненты:
- ConsumerA
- ConsumerB
- Продюсер
- ПродюсерB
С древовидной иерархией:
Компонент приложения отображает ProducerA и ConsumerB, ProducerA отображает ConsumerA, а ConsumerB отображает ProducerB.
Компоненты ConsumerA и ConsumerB сохраняют индивидуальный счетчик состояний. В своем componentDidMount они подписываются на один и тот же поток subscriber
, каждый раз, когда публикуется событие, они оба обновляют счетчик. У ProducerA и ProducerB есть кнопки Increment Counter
и Decrement Counter
, при нажатии они излучают 1
или -1
. Подписывающиеся компоненты ConsumerA и ConsumerB принимают событие и запускают свои функции обратного вызова, тем самым обновляя значение своего счетчика состояния и DOM.
Снова посмотрим на дерево компонентов:
ProducerB мог передавать данные в ConsumerA, но они никак не связаны друг с другом, а ProducerA мог передавать данные в ConsumerB, несмотря на то, что он не был его родительским. В этом сила RxJS, мы просто создали центральный концентратор потока событий и позволили компонентам прослушивать его, где бы ни один компонент не испускал события, они улавливаются компонентами прослушивания.
Вы можете играть с приложением на stackblitz: https://react-lwzp6e.stackblitz.io
Заключение
В этом посте мы увидели, как мы можем обмениваться данными между компонентами React с помощью RxJS. Мы использовали наблюдаемый объект BehaviorSubject, чтобы создать центральный поток и позволить другим компонентам подписаться на него. Эти компоненты будут получать данные при передаче любым компонентом, независимо от уровня его иерархии в дереве компонентов.
Если у вас есть какие-либо вопросы относительно этого или чего-либо, что я должен добавить, исправить или удалить, не стесняйтесь комментировать, писать мне по электронной почте или в прямом сообщении.
Спасибо !!!