首頁 web前端 js教程 使用 Reactables 簡化 RxJS

使用 Reactables 簡化 RxJS

Oct 10, 2024 am 06:19 AM

介紹

RxJS 是一個功能強大的函式庫,但眾所周知,它的學習曲線很陡峭。

這個函式庫龐大的 API 介面,再加上向反應式程式設計的典範轉移,可能會讓新手不知所措。

我創建了 Reactables API 來簡化 RxJS 的使用並簡化開發人員對反應式程式設計的介紹。

例子

我們將建立一個簡單的控制項來切換使用者的通知設定。

它也會將更新的切換設定傳送到模擬後端,然後向使用者顯示成功訊息。
RxJS simplified with Reactables

安裝 RxJS 和 Reactables

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<ToggleState, ToggleActions> =>
  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,它是一個包含兩個項目的元組。

  1. UI 可以訂閱狀態變更的 RxJS Observable。

  2. UI 可以呼叫以呼叫狀態變更的操作方法的物件。

使用 Reactable 時不需要主題

我們可以用純reducer函數來描述我們想要的行為。

Reactables 在幕後使用主題和各種運算符來管理開發人員狀態。

新增API呼叫並閃爍成功訊息

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<ToggleState, ToggleActions> =>
  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 綁定到視圖。以下是使用 @reactables/react 套件中的 useReactable 鉤子綁定到 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 (
    <div className="notification-settings">
      {showSuccessMessage && (
        <div className="success-message">
          Success! Notifications are {notificationsOn ? 'on' : 'off'}.
        </div>
      )}
      <p>Notifications Setting:</p>
      <button onClick={() => toggle(!notificationsOn)}>
        {notificationsOn ? 'On' : 'Off'}
      </button>
    </div>
  );
}

export default App;


就是這樣!

結論

Reactables 讓我們可以使用純減速器函數建立功能,而不是深入主題世界,從而幫助簡化 RxJS。

然後,RxJS 被保留用於它最擅長的地方 - 組成我們的非同步邏輯。

Reactables 可以擴充並做更多事情!查看文件以了解更多範例,包括如何使用它們管理表單

以上是使用 Reactables 簡化 RxJS的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP教程
1592
276
在打字稿中的高級條件類型 在打字稿中的高級條件類型 Aug 04, 2025 am 06:32 AM

TypeScript的高級條件類型通過TextendsU?X:Y語法實現類型間的邏輯判斷,其核心能力體現在分佈式條件類型、infer類型推斷和復雜類型工具的構建。 1.條件類型在裸類型參數上具有分佈性,能自動對聯合類型拆分處理,如ToArray得到string[]|number[]。 2.利用分佈性可構建過濾與提取工具:Exclude通過TextendsU?never:T排除類型,Extract通過TextendsU?T:never提取共性,NonNullable過濾null/undefined。 3

微觀前端體系結構:實施指南 微觀前端體系結構:實施指南 Aug 02, 2025 am 08:01 AM

Microfrontendssolvescalingchallengesinlargeteamsbyenablingindependentdevelopmentanddeployment.1)Chooseanintegrationstrategy:useModuleFederationinWebpack5forruntimeloadingandtrueindependence,build-timeintegrationforsimplesetups,oriframes/webcomponents

Jul 26, 2025 am 07:52 AM

要獲取JavaScript數組的長度,可以使用內置的length屬性。 1.使用.length屬性可返回數組中元素的數量,例如constfruits=['apple','banana','orange'];console.log(fruits.length);//輸出:3;2.該屬性適用於包含字符串、數字、對像或數組等任何類型數據的數組;3.length屬性會自動更新,當添加或刪除元素時其值隨之變化;4.它返回基於零的計數,空數組的length為0;5.可手動修改length屬性來截斷或擴展數組,

JavaScript中的VAR,LET和CONST之間有什麼區別? JavaScript中的VAR,LET和CONST之間有什麼區別? Aug 02, 2025 pm 01:30 PM

varisfunction-scoped,canbereassigned,hoistedwithundefined,andattachedtotheglobalwindowobject;2.letandconstareblock-scoped,withletallowingreassignmentandconstnotallowingit,thoughconstobjectscanhavemutableproperties;3.letandconstarehoistedbutnotinitial

了解JavaScript的代理並反映API 了解JavaScript的代理並反映API Jul 26, 2025 am 07:55 AM

Proxy和ReflectAPI是JavaScript中用於攔截和自定義對像操作的強大工具;1.Proxy通過包裝目標對象並定義“陷阱”來攔截如get、set等操作,實現如日誌、驗證、只讀控制等功能;2.Reflect提供與Proxy陷阱對應的方法,確保默認行為的一致性和正確性,提升代碼可維護性;3.實際應用包括Vue3響應式系統、數據驗證、調試日誌、不可變對象和API模擬;4.使用時需注意性能開銷、內置對象的複雜行為、this綁定問題及嵌套對象需遞歸代理;5.合理使用可構建高效、可調試、反應式

生成可解的雙巧克力謎題:數據結構與算法指南 生成可解的雙巧克力謎題:數據結構與算法指南 Aug 05, 2025 am 08:30 AM

本文深入探討瞭如何為“雙巧克力”(Double-Choco)謎題遊戲自動生成可解謎題。我們將介紹一種高效的數據結構——基於2D網格的單元格對象,該對象包含邊界信息、顏色和狀態。在此基礎上,我們將詳細闡述一種遞歸的塊識別算法(類似於深度優先搜索),以及如何將其整合到迭代式謎題生成流程中,以確保生成的謎題滿足遊戲規則,並具備可解性。文章將提供示例代碼,並討論生成過程中的關鍵考量與優化策略。

什麼是JS中的可選鏈接(?)? 什麼是JS中的可選鏈接(?)? Aug 01, 2025 am 06:18 AM

可選的(?。)InjavascriptsafelyAcccessesnestedPropertiesByRoturningUndUndEfendEfinefinefinefineFanifThainisNullOrundEffined,deskingruntimeErrors.1.itallowssafealowssafeccesstodeeplynestedobjectedobjectproperties

如何使用JavaScript從DOM元素中刪除CSS類? 如何使用JavaScript從DOM元素中刪除CSS類? Aug 05, 2025 pm 12:51 PM

使用JavaScript從DOM元素中刪除CSS類最常用且推薦的方法是通過classList屬性的remove()方法。 1.使用element.classList.remove('className')可安全刪除單個或多個類,即使類不存在也不會報錯;2.替代方法是直接操作className屬性並通過字符串替換移除類,但易因正則匹配不准確或空格處理不當引發問題,因此不推薦;3.可通過element.classList.contains()先判斷類是否存在再刪除,但通常非必需;4.classList

See all articles