RxJS — мощная библиотека, но, как известно, ее необходимо долго изучать.
Большая поверхность API библиотеки в сочетании со сдвигом парадигмы в сторону реактивного программирования может сбить с толку новичков.
Я создал Reactables API, чтобы упростить использование RxJS и облегчить разработчикам введение в реактивное программирование.
Мы создадим простой элемент управления, который будет переключать настройки уведомлений пользователя.
Он также отправит обновленную настройку переключателя на макетный сервер, а затем покажет пользователю сообщение об успехе.
npm i rxjs @reactables/core
import { RxBuilder, Reactable } from '@reactables/core'; export type ToggleState = { notificationsOn: boolean; }; export type ToggleActions = { toggle: (payload: boolean) => void; }; export const RxNotificationsToggle = ( initialState = { notificationsOn: false, } as ToggleState ): Reactable=> RxBuilder({ initialState, reducers: { toggle: (state) => ({ notificationsOn: !state.notificationsOn, }), }, }); const [state$, actions] = RxToggleNotifications(); state$.subscribe((state) => { console.log(state.notificationsOn); }); actions.toggle(); /* OUTPUT false true */
RxBuilder создает Reactable, который представляет собой кортеж с двумя элементами.
Наблюдаемый объект RxJS, на который пользовательский интерфейс может подписаться для изменения состояния.
Объект методов действий, которые пользовательский интерфейс может вызывать для вызова изменений состояния.
При использовании Reactables нет необходимости в субъектах.
Мы можем просто описать желаемое поведение с помощью чистых функций редуктора.
Reactables использует субъекты и различные операторы для управления состоянием разработчика.
Reactables обрабатывают асинхронные операции с эффектами, которые выражаются в виде операторных функций RxJS. Их можно объявить с помощью действия/редуктора, который запускает эффект(ы).
Это позволяет нам в полной мере использовать RxJS при обработке нашей асинхронной логики.
Давайте изменим приведенный выше пример переключения, чтобы включить в него асинхронное поведение. Чтобы сделать текст кратким, мы откажемся от обработки ошибок.
import { RxBuilder, Reactable } from '@reactables/core'; import { of, concat } from 'rxjs'; import { debounceTime, switchMap, mergeMap, delay } from 'rxjs/operators'; export type ToggleState = { notificationsOn: boolean; showSuccessMessage: boolean; }; export type ToggleActions = { toggle: (payload: boolean) => void; }; export const RxNotificationsToggle = ( initialState = { notificationsOn: false, showSuccessMessage: false, } ): Reactable=> RxBuilder({ initialState, reducers: { toggle: { reducer: (_, action) => ({ notificationsOn: action.payload as boolean, showSuccessMessage: false, }), effects: [ (toggleActions$) => toggleActions$.pipe( debounceTime(500), // switchMap to unsubscribe from previous API calls if a new toggle occurs switchMap(({ payload: notificationsOn }) => of(notificationsOn) .pipe(delay(500)) // Mock API call .pipe( mergeMap(() => concat( // Flashing the success message for 2 seconds of({ type: 'updateSuccess' }), of({ type: 'hideSuccessMessage' }).pipe(delay(2000)) ) ) ) ) ), ], }, updateSuccess: (state) => ({ ...state, showSuccessMessage: true, }), hideSuccessMessage: (state) => ({ ...state, showSuccessMessage: false, }), }, });
Полный пример см. на StackBlitz:
Реагировать | Угловой
Давайте свяжем наш Reactable с представлением. Ниже приведен пример привязки к компоненту React с помощью перехватчика useReactable из пакета @reactables/react.
import { RxNotificationsToggle } from './RxNotificationsToggle'; import { useReactable } from '@reactables/react'; function App() { const [state, actions] = useReactable(RxNotificationsToggle); if (!state) return; const { notificationsOn, showSuccessMessage } = state; const { toggle } = actions; return ({showSuccessMessage && (); } export default App;Success! Notifications are {notificationsOn ? 'on' : 'off'}.)}Notifications Setting:
Вот и все!
Reactables помогает упростить RxJS, позволяя нам создавать функциональность с помощью чистых функций редуктора, а не погружаться в мир предметов.
Затем RxJS резервируется для того, что он делает лучше всего — для составления нашей асинхронной логики.
Reactables могут расширяться и делать гораздо больше! Ознакомьтесь с документацией для получения дополнительных примеров, в том числе о том, как их можно использовать для управления формами!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3