ホームページ ウェブフロントエンド jsチュートリアル リアクティブ プログラミングによる再利用可能、拡張可能、テスト可能な状態ロジック。

リアクティブ プログラミングによる再利用可能、拡張可能、テスト可能な状態ロジック。

Nov 30, 2024 am 07:07 AM

Reusable, Extensible and Testable State Logic with Reactive Programming.

UIコンポーネントの状態

UI コンポーネントに状態を導入し始めると、次のようなことをしたくなることがよくあります:

Svelte での簡単なカウンターの例:

1

2

3

4

5

6

7

<script>

  let count = $state(0);

</script>

 

<button onclick={() => count++}>

  clicks: {count}

</button>

ログイン後にコピー
ログイン後にコピー

問題

ここでは Svelte を使用していますが、同じ問題はどの UI フレームワークにも当てはまります。

最初から、状態ロジックとコンポーネントが緊密に結合されています。インクリメント機能はテンプレート内で直接コード化されています。

この設定では、次のカウンタ ロジックを再利用できません。

  • その他の UI コンポーネント
  • カウンターを必要とするその他のビジネス ロジック
  • その他の UI フレームワーク

コンポーネントをレンダリングせずにカウンター ロジックをテストすることもできません。コンポーネントに他の機能が結合されている場合、カウンター ロジックを分離することはできません。

解決:

状態ロジックを UI コンポーネントから分離して、独立して実装およびテストできるようにします。これにより、ロジックがより再利用可能になり、UI コンポーネントは状態の変更をリッスンしてレンダリングするだけで済みます。次の点を考慮してください:

1

2

3

4

5

6

7

8

9

<script>

  import { RxCounter } from './RxCounter';

 

  const [count, { increment }] = RxCounter();

</script>

 

<button onclick={increment}>

  Count: {$count}

</button>

ログイン後にコピー
ログイン後にコピー

StackBlitz で完全な例を参照してください

上記を元の例と比較すると、カウンターのすべてのロジックが RxCounter にカプセル化されています (実装については後で示します)。

count は、新しいカウント状態を発行する RxJS Observable です。インクリメントは、状態変更を呼び出すために UI が呼び出すことができるアクション メソッドです。

Svelte には、$count テンプレート変数で見られるように、テンプレート内のオブザーバブルをサブスクライブする優れた方法が組み込まれています。どの UI フレームワークでもオブザーバブルをサブスクライブすることは、それほど難しいことではありません。多くのフレームワークには、これを実現するための API が用意されています。

RxCounterの実装

情報と免責事項: 著者が作成した Reactables API を使用します。これは、RxJS を活用してリアクティブ プログラミングを容易にする状態管理ソリューションです。

Reactables コア パッケージを取得し、RxCounter を作成します。

npm i @reactables/core

1

2

3

4

5

6

7

8

9

import { RxBuilder } from '@reactables/core';

 

export const RxCounter = () =>

  RxBuilder({

    initialState: 0,

    reducers: {

      increment: (count) => count + 1,

    },

  });

ログイン後にコピー

RxBuilder は Reactable を返します。

Reactable は、状態変更を発行する RxJS Observable が最初の項目であり、状態の更新をトリガーするためのアクション メソッドの辞書が 2 番目の項目であるタプルです。

状態は リアクティブ です。これは、状態がリデューサー関数を介して変更に応答することを意味します。 UI によってトリガーされたインクリメント アクションが受信されると、リアクション可能反応し、そのオブザーバブルは新しい状態を出力します。

RxCounter はビュー層から完全に分離されており、任意の UI フレームワークで使用できることに注意してください。

カウンターのテスト

Reactable をテストするには、その状態監視可能オブジェクトをサブスクライブし、そのアクション メソッドを呼び出してその動作をテストします。オブザーバブルの出力値が望ましい動作と一致していると断言できます。

これは、RxJS に組み込まれた Marble Testing を使用して実行できます。

1

2

3

4

5

6

7

<script>

  let count = $state(0);

</script>

 

<button onclick={() => count++}>

  clicks: {count}

</button>

ログイン後にコピー
ログイン後にコピー

カウンターの拡張

ビューから分離された状態ロジックを使用して、RxCounter の機能を拡張し、カウントを 2 倍にする機能を持つ RxDoubleCounter を作成することもできます。

1

2

3

4

5

6

7

8

9

<script>

  import { RxCounter } from './RxCounter';

 

  const [count, { increment }] = RxCounter();

</script>

 

<button onclick={increment}>

  Count: {$count}

</button>

ログイン後にコピー
ログイン後にコピー

StackBlitz で完全な例を参照してください

結論

状態ロジックを UI コンポーネントに直接実装すると、ロジックの再利用やテストが難しくなります。

Reactables を使用して状態ロジックをリアクティブにプログラムし、個別にテストできます。これにより、ビュー層とロジック層の両方で再利用性の高いリアクティブ状態ロジックのユニットが生成されます。

ここでは単純な反例を示しましたが、Reactable は拡張可能であり、より複雑な状態管理シナリオ (つまり、データのフェッチ、フォームなど) に合わせて構成できます。詳細については、ドキュメントをご覧ください。

以上がリアクティブ プログラミングによる再利用可能、拡張可能、テスト可能な状態ロジック。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

JavaScriptの文字列文字を交換します

カスタムGoogle検索APIセットアップチュートリアル カスタムGoogle検索APIセットアップチュートリアル Mar 04, 2025 am 01:06 AM

カスタムGoogle検索APIセットアップチュートリアル

例JSONファイルの例 例JSONファイルの例 Mar 03, 2025 am 12:35 AM

例JSONファイルの例

8見事なjQueryページレイアウトプラグイン 8見事なjQueryページレイアウトプラグイン Mar 06, 2025 am 12:48 AM

8見事なjQueryページレイアウトプラグイン

10 jQuery構文蛍光物 10 jQuery構文蛍光物 Mar 02, 2025 am 12:32 AM

10 jQuery構文蛍光物

独自のAjax Webアプリケーションを構築します 独自のAjax Webアプリケーションを構築します Mar 09, 2025 am 12:11 AM

独自のAjax Webアプリケーションを構築します

' this' JavaScriptで? ' this' JavaScriptで? Mar 04, 2025 am 01:15 AM

' this' JavaScriptで?

10 JavaScript&JQuery MVCチュートリアル 10 JavaScript&JQuery MVCチュートリアル Mar 02, 2025 am 01:16 AM

10 JavaScript&JQuery MVCチュートリアル

See all articles