diff --git a/docs/README.md b/docs/README.md index 740f603238af13..80990b1fa1802b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -178,6 +178,10 @@ The Block Editor Handbook is designed for those looking to create and develop fo ### 主な変更 +2024/10/18 + +- [リアクティブと宣言型の考え方](https://ja.wordpress.org/team/handbook/block-editor/reference-guides/interactivity-api/core-concepts/the-reactive-and-declarative-mindset/) - 翻訳 + 2024/10/11 - [Interactivity API について](https://ja.wordpress.org/team/handbook/block-editor/reference-guides/interactivity-api/iapi-about/) - 翻訳 diff --git a/docs/japanese-changelog.md b/docs/japanese-changelog.md index db23393661d528..ed3794426af179 100644 --- a/docs/japanese-changelog.md +++ b/docs/japanese-changelog.md @@ -2,6 +2,10 @@ 翻訳の進捗や、最新の英語版で同期した際に気づいた箇所をメモしています。 +2024/10/18 + +- [リアクティブと宣言型の考え方](https://ja.wordpress.org/team/handbook/block-editor/reference-guides/interactivity-api/core-concepts/the-reactive-and-declarative-mindset/) - 翻訳 + 2024/10/11 - [Interactivity API について](https://ja.wordpress.org/team/handbook/block-editor/reference-guides/interactivity-api/iapi-about/) - 翻訳 diff --git a/docs/reference-guides/interactivity-api/core-concepts/the-reactive-and-declarative-mindset.md b/docs/reference-guides/interactivity-api/core-concepts/the-reactive-and-declarative-mindset.md index 3760fdf3867802..dc4d7c0d433e10 100644 --- a/docs/reference-guides/interactivity-api/core-concepts/the-reactive-and-declarative-mindset.md +++ b/docs/reference-guides/interactivity-api/core-concepts/the-reactive-and-declarative-mindset.md @@ -1,19 +1,44 @@ + +# リアクティブと宣言型の考え方 + +Interactivity API は React、Vue、Svelte、Alpine のような他のモダンなフレームワークと同様の、リアクティブで宣言的なフレームワークです。Interactivity API の操作において、その可能性を最大限に引き出すには、正しい考え方を採用することが非常に重要です。このガイドではリアクティブと宣言型のコアコンセプトを説明し、Interactivity API を効果的に使用するための基礎を提供します。 + +## 宣言型 vs. 実装型 + +**宣言型プログラミング**では、プログラムが _何を_ 達成すべきかを記述します。そこでは希望する結果にフォーカスし、結果を達成するためのコマンドやステップを明示的に列挙しません。対照的に**命令型プログラミング**では、_どのように_ タスクを達成するかを指定します。そこでは明示的にプログラムの状態 (ステート) を操作する個々のステップを記述します。 + +### 命令型アプローチ + +ウェブ開発の初期は命令型アプローチが主流でした。この方法では変更を反映するために、JavaScript を使用して手動で DOMを更新しました。 + +たとえば、以下は2つのボタンと段落からなるインタラクティブブロックです。 + +- **show / hide (表示 / 非表示) ボタン**: 段落の表示 / 非表示を切り替え、「activate (有効化)」ボタンの有効 / 無効を切り替えます。 +- **activate / deactivate (有効化 / 無効化) ボタン**: 段落のテキストと色を「有効」(緑) と「無効」 (赤) の間で切り替えます。 ```html
@@ -68,11 +93,19 @@ Take, for example, this interactive block with two buttons and a paragraph: ``` + +見て分かるように、それぞれの条件に対する DOM 内のすべての変化を、以前の状態に応じて JavaScript で修正しなければなりません。 + +### 宣言型アプローチ + +宣言型アプローチは、_何が_ 起こるべきかに焦点を当てることでプロセスを単純化します。UI は状態の変化に応じて自動的に更新されます。以下は、Interactivity APIの宣言的アプローチを使用した同様の例です。 ```html
@@ -132,48 +165,104 @@ const { state } = store( 'myInteractivePlugin', { } ); ``` + +この宣言型の例では、UI は現在の状態 (ステート) に基づいて自動的に更新されます。開発者が行うことは、必要なステート、派生ステート、ステートを変更するアクション、DOM のどの部分がステートのどの部分に依存するかを宣言するだけです。フレームワークがすべての必要な DOM の更新を行うため、DOM は常に現在のステートと同期します。フレームワークによって制御される要素の数に関係なく、ロジックはシンプルで保守性が維持されます。 + +### ところでバグに気がつきましたか ? + +上の命令型アプローチの例には、教訓のため意図的にバグが仕込まれています。見つけられますか ? 簡単ではありませんよ ! +(答えは末尾に) + + +この種のバグは命令型コードでは頻繁に発生します。これはすべての条件を手動で制御しなければならないためです。一方、宣言的なコードではこのようなバグは存在しません。フレームワークが DOM の更新を引き受け、かつ、何も見落とさないからです。 + +### 宣言型アプローチの利点 + +上の例で見たように命令型アプローチでは、詳細なステップと DOM の直接操作が必要で、インタラクティブ性が複雑になるとすぐに複雑になり、メンテナンスが難しくなります。取り得る状態 (ステート) や要素が増えれば増えるほど条件のロジックを追加する必要があり、コードは指数関数的に複雑になります。一方、宣言型アプローチではステートを管理し、DOM の更新をフレームワークに任せることでプロセスを単純化します。コードは読みやすく、保守しやすく、スケーラブルになります。 + +## リアクティブ + +Interactivity API はリアクティブを活用した宣言的なフレームワークです。リアクティブなシステムでは、データの変更は自動的にユーザーインターフェースの更新をトリガーし、ビューが常にアプリケーションの現在のステートを反映することが保証されます。 + +### リアクティブが動作する仕組み + +Interactivity API は、きめ細かなリアクティブシステムを使用します。その仕組みを以下に説明します + +1. **リアクティブステート**: Interactivity API では、グローバルステートとローカルコンテキストの両方がリアクティブです。すなわち、これらのデータ元のいずれかが変更されると、依存する UI の任意の部分が自動的に更新されます。 + +- **グローバルステート**: インタラクティブブロック全体でアクセスできるグローバルデータ +- **ローカルコンテキスト**: 特定の要素とその子に固有のローカルデータ +- **派生ステート**: 基本的なステートプロパティに加えて、依存関係が変更された際に自動で更新される計算型プロパティを定義できます。 + +_Interactivity API での個々のリアクティブステートの使用方法については、[グローバルステート、ローカルコンテキスト、派生ステートの理解](https://ja.wordpress.org/team/handbook/block-editor/reference-guides/interactivity-api/core-concepts/undestanding-global-state-local-context-and-derived-state/)を参照してください。_ + +2. **アクション**: 通常イベントハンドラによってトリガーされる関数。グローバルステートやローカルコンテキストを変更します。 + +3. **リアクティブバインディング**: HTML 要素は、特別な属性を使用して、リアクティブステートの値にバインドされます。属性の例: `data-wp-bind`、`data-wp-text`、`data-wp-class`。 + +4. **自動更新**: アクションがグローバルステートまたはローカルコンテキストを変更すると、Interactivity API は、そのステートに依存する DOM のすべての部分を (直接または派生ステートを介して) 自動的に更新します。 + +先ほどの例をベースに、これらのコンセプトの詳細を見ていきます。 ```javascript const { state } = store( 'myInteractivePlugin', { @@ -183,24 +272,35 @@ const { state } = store( 'myInteractivePlugin', { get visibilityText() { return state.isVisible ? 'hide' : 'show'; }, - // ... other derived state + // ... その他の派生ステート }, actions: { toggleVisibility() { state.isVisible = ! state.isVisible; }, - // ... other actions + // ... その他のアクション }, } ); ``` + +このコードでは、 + +- `isVisible` と `isActive` は基本のステートプロパティ +- `visibilityText` は派生ステートで `isVisible` が変わると自動的に更新される +- `toggleVisibility` はステートを変更するアクション + +HTML バインディングは次のようになっています。 ```html