ホームページ >ウェブフロントエンド >jsチュートリアル >VUE 3の新しい反応性システムを理解する
最新のフロントエンドフレームワークのコアコンポーネントの1つは、レスポンシブシステムです。それらは、アプリケーションが高いインタラクティブ性、ダイナミズム、応答性を実現できるようにする魔法の杖です。レスポンシブシステムとは何か、実際にそれを適用する方法を理解することは、すべてのWeb開発者にとって重要なスキルです。
レスポンシブシステムは、同期中のデータソース(モデル)とデータ表現(ビュー)レイヤーを自動的に保持するメカニズムです。モデルが変更されるたびに、ビューはこれらの変更を反映するように再レンダリングされます。 単純なマークダウンエディターを例として取りましょう。通常、2つのペインがあります。1つはMarkdownコードを作成する(基礎となるモデルの変更)、もう1つはコンパイルされたHTML(更新されたビューを表示する)のプレビュー用です。ライティングペインにコンテンツを書くと、すぐにプレビューペインで自動的にプレビューされます。もちろん、これは単なる簡単な例です。多くの場合、状況ははるかに複雑です。
多くの場合、表示したいデータは他のデータに依存します。この場合、依存関係が追跡され、それに応じてデータが更新されます。たとえば、FirstNameおよびLastNameプロパティに依存するFullNameプロパティがあるとします。依存関係が変更されると、FullNameプロパティが自動的に再計算され、結果が表示に表示されます。
今度は、応答性がどのようなものであるかを判断したので、新しいVUE 3レスポンシブメカニズムがどのように機能し、実際にそれを使用するかを学ぶ時が来ました。しかし、これを行う前に、古いVUE 2の応答性メカニズムとその欠点を簡単に見てみましょう。
キーポイント
reactive
ref
readonly
やref
などの高度なレスポンシブAPIメソッドは、依存関係と副作用を効果的に管理することにより、より動的で応答性の高いアプリケーションを作成するためのツールを開発者に提供します。 reactive
computed
VUE 3レスポンシブシステムには利点がありますが、ES6環境でのみサポートされており、応答性のあるプロキシと元のオブジェクトはIDの比較が異なります。 watch
舞台裏で、Vue 2はES5 object.defineProperty()を使用して、データオブジェクトのすべてのプロパティをgetterandsetterに変換します。各コンポーネントインスタンスについて、Vueは依存関係オブザーバーインスタンスを作成します。コンポーネントレンダリング中に依存関係として収集/追跡された属性は、オブザーバーによって記録されます。その後、依存関係のセッターが起動されると、オブザーバーはコンポーネントがビューを再レンダーして更新することを通知されます。これは基本的にすべての魔法の仕組みです。残念ながら、注意すべきことがいくつかあります。
検出を変更するための予防策オブジェクトに属性を追加/削除します(例:obj.newkey = value)
次の例で上記の状況を探りましょう:
<code class="language-javascript"><div id="app"> <h1>Hello! My name is {{ person.name }}. I'm {{ person.age }} years old.</h1> <button>Add "age" property</button> <p>Here are my favorite activities:</p> <ul> <li v-for="(item, index) in activities" :key="index">{{ item }} <button>Edit</button> </li> </ul> <button>Clear the activities list</button> </div></code>上記の例では、これらの3つの方法のいずれも機能しないことがわかります。 Personオブジェクトに新しいプロパティを追加することはできません。インデックスを使用してアクティビティアレイ内のアイテムを編集することはできません。また、アクティビティアレイの長さを変更することはできません。
<code class="language-javascript">const App = new Vue({ el: '#app', data: { person: { name: "David" }, activities: [ "Reading books", "Listening music", "Watching TV" ] }, methods: { // 1. Add a new property to an object addAgeProperty() { this.person.age = 30 }, // 2. Setting an array item by index editActivity(index) { const newValue = prompt('Input a new value') if (newValue) { this.activities[index] = newValue } }, // 3. Modifying the length of the array clearActivities() { this.activities.length = 0 } } });</code>
もちろん、これらの状況には解決策があります。次の例で説明します。
この例では、vue.set APIメソッドを使用して、new AgeプロパティをPersonオブジェクトに追加し、アクティビティアレイから特定のアイテムを選択/変更します。最後のケースでは、JavaScriptに組み込まれたSplice()アレイメソッドのみを使用します。私たちが見ることができるように、これは機能しますが、それは少し不器用であり、一貫性のないコードベースにつながります。幸いなことに、VUE 3では、この問題が解決されました。次の例でそれがどのように魔法であるか見てみましょう:
<code class="language-javascript">const App = new Vue({ el: '#app', data: { person: { name: "David" }, activities: [ "Reading books", "Listening music", "Watching TV" ] }, methods: { // 1. Adding a new property to the object addAgeProperty() { Vue.set(this.person, 'age', 30) }, // 2. Setting an array item by index editActivity(index) { const newValue = prompt('Input a new value') if (newValue) { Vue.set(this.activities, index, newValue) } }, // 3. Modifying the length of the array clearActivities() { this.activities.splice(0) } } });</code>
この例では、VUE 3を使用して、最初の例で使用されている内蔵JavaScript機能に戻り、すべてのメソッドが適切に機能します。
Vue 2.6では、Vue.observable()APIメソッドが導入されました。レスポンシブシステムをある程度公開し、開発者がオブジェクトを明示的に応答させることができます。実際、これはVueがデータオブジェクトを内部的にラップするために使用するまったく同じ方法であり、単純なシナリオのために最小限のクロスコンポーネント状態ストレージを作成するのに役立ちます。しかし、それは有用ですが、この単一のアプローチは、VUE 3に付属する完全な機能が豊富なレスポンシブAPIの機能と柔軟性と一致しません。次のセクションで理由を確認します。
<code class="language-javascript">const App = { data() { return { person: { name: "David" }, activities: [ "Reading books", "Listening music", "Watching TV" ] } }, methods: { // 1. Adding a new property to the object addAgeProperty() { this.person.age = 30 }, // 2. Setting an array item by index editActivity(index) { const newValue = prompt('Input a new value') if (newValue) { this.activities[index] = newValue } }, // 3. Modifying the length of the array clearActivities() { this.activities.length = 0 } } } Vue.createApp(App).mount('#app')</code>
注:object.defineProperty()はES5機能であり、シミュレートできないため、VUE 2はIE8以下をサポートしていません。
プロキシAPIを使用すると、開発者はターゲットオブジェクトの低レベルオブジェクト操作を傍受および変更できます。プロキシは、オブジェクトのクローン/ラッパー(a
ターゲットと呼ばれます)であり、特定の操作に応答し、JavaScriptの組み込み動作を上書きする特別な関数(trapと呼ばれる)を提供しますオブジェクト。デフォルトの動作を使用する必要がある場合は、対応する反射APIを使用できます。これは、名前が示すように、プロキシAPIのメソッドを反映しています。これらのAPIがVUE 3でどのように使用されているかを確認するための例を調べてみましょう:
<code class="language-javascript"><div id="app"> <h1>Hello! My name is {{ person.name }}. I'm {{ person.age }} years old.</h1> <button>Add "age" property</button> <p>Here are my favorite activities:</p> <ul> <li v-for="(item, index) in activities" :key="index">{{ item }} <button>Edit</button> </li> </ul> <button>Clear the activities list</button> </div></code>新しいプロキシを作成するには、新しいプロキシ(ターゲット、ハンドラー)コンストラクターを使用します。ターゲットオブジェクト(Personオブジェクト)とハンドラーオブジェクトの2つのパラメーターを受け入れます。これは、どの操作(取得および設定操作)が傍受されるかを定義します。ハンドラーオブジェクトでは、GETトラップとセットトラップを使用して、プロパティが読み取られたときとプロパティが変更/追加されるときに追跡します。メソッドが適切に機能することを確認するために、コンソールステートメントを設定します。
トラップを取得して設定します。次のパラメーターを使用します
ターゲット:プロキシでラップされたターゲットオブジェクト
Annotated Track()およびTrigger()関数はVUE固有であり、プロパティが読み取られたときとプロパティが変更/追加されるときに追跡するために使用されます。その結果、Vueはこのプロパティを使用してコードを再実行します。
例の最後の部分では、コンソールステートメントを使用して元の人オブジェクトを出力します。次に、別のステートメントを使用して、プロキシオブジェクトの属性名を読み取ります。次に、Age Propertyを変更し、新しい趣味のプロパティを作成します。最後に、人オブジェクトを再度出力して、それが正しく更新されているかどうかを確認します。
これは、VUE 3応答メカニズムの簡単な説明です。もちろん、実際の実装ははるかに複雑ですが、上記の例があなたに主なアイデアを得るのに十分であることを願っています。
VUE 3レスポンシブメカニズムを使用する場合、次のポイントを考慮する必要があります。
ES6対応ブラウザ
でのみ利用できます最初のグループには、データの応答性を制御するための最も基本的な方法が含まれています。
これらの方法の実用的なアプリケーションを見てみましょう:
<code class="language-javascript"><div id="app"> <h1>Hello! My name is {{ person.name }}. I'm {{ person.age }} years old.</h1> <button>Add "age" property</button> <p>Here are my favorite activities:</p> <ul> <li v-for="(item, index) in activities" :key="index">{{ item }} <button>Edit</button> </li> </ul> <button>Clear the activities list</button> </div></code>この例では、4つの基本的な応答方法の使用を調べます。
最初に、値が0のカウンターREFオブジェクトを作成します。次に、ビューでは、それぞれ2つのボタンを配置し、それぞれカウンターの値を増加させて減少させます。これらのボタンを使用すると、そのカウンターが実際に反応することがわかります。
第二に、人の応答性のあるオブジェクトを作成します。次に、ビューでは、その人の名前と年齢の編集に使用される2つの入力コントロールを配置します。 Human Propertiesを編集すると、すぐに更新されます。
第三に、数学の読み取り専用オブジェクトを作成します。次に、ビューでは、数学のPIプロパティの値を2倍にするボタンを設定します。ただし、ボタンをクリックすると、オブジェクトが読み取り専用であり、そのプロパティを変更できないことを示すコンソールにエラーメッセージが表示されます。
最後に、プロキシに変換して元のオブジェクトとしてマークすることを望まないアルファベットナンバーオブジェクトを作成します。すべての文字と対応する数字が含まれています(簡潔にするために、最初の3文字のみがここで使用されます)。この順序が変更される可能性は低いため、このオブジェクトを意図的に通常のオブジェクトとして保持します。これはパフォーマンスに有益です。テーブル内のオブジェクトコンテンツをレンダリングし、ボタンを設定してB属性の値を3に変更します。これを行い、オブジェクト
を変更できますが、ビューを変更することはないことを示します。 MarkRawは、カントリーコード、カラー名、対応する16進数などの長いリストなど、応答性を高める必要のないオブジェクトに最適です。
最後に、次のセクションで説明したタイプチェック方法を使用して、作成した各オブジェクトのタイプをテストおよび決定します。 onmounted()ライフサイクルフックを使用して、アプリケーションが最初にレンダリングされたときにこれらのチェックをトリガーします。
タイプチェック方法
ISREFは、値がREFオブジェクトであるかどうかを確認します。
shallowrefは、その値を応答することなく、その値属性のみを追跡するREFを作成します。
この例は、設定の浅いRefオブジェクトの作成から始まります。次に、ビューでは、2つの入力コントロールを追加して、幅と高さのプロパティを編集します。しかし、それらを変更しようとすると、それらが更新されていないことがわかります。この問題を解決するために、オブジェクト全体とそのすべてのプロパティを変更するボタンを追加します。今では機能します。これは、値のコンテンツ(単一のプロパティとしての幅と高さ)が応答性のあるオブジェクトに変換されないが、値(オブジェクト全体)のバリエーションがまだ追跡されているためです。
<code class="language-javascript"><div id="app"> <h1>Hello! My name is {{ person.name }}. I'm {{ person.age }} years old.</h1> <button>Add "age" property</button> <p>Here are my favorite activities:</p> <ul> <li v-for="(item, index) in activities" :key="index">{{ item }} <button>Edit</button> </li> </ul> <button>Clear the activities list</button> </div></code>次に、幅と高さのプロパティを含むsettingsa浅い反応性プロキシと、xおよびyプロパティを含むネストされた座標オブジェクトを作成します。次に、ビューでは、各プロパティの入力コントロールを設定します。幅と高さの特性を変更すると、それらが応答的に更新されていることがわかります。しかし、xプロパティとyプロパティを変更しようとすると、それらが追跡されていないことがわかります。
最後に、settingsaと同じプロパティを持つsettingsb浅い読み取りオブジェクトを作成します。ここで、幅または高さの属性を変更しようとすると、オブジェクトが読み取り専用であり、その属性を変更できないことを示すコンソールにエラーメッセージが表示されます。一方、XおよびYプロパティは問題なく変更できます。
最後の2つの例からのネストされた座標オブジェクトは、変換の影響を受けず、通常のオブジェクトのままです。これは、自由に変更できることを意味しますが、その変更はVUEによって追跡されません。
変換方法
次の3つの方法は、プロキシを参照または通常のオブジェクトに変換するために使用されます。
torefsは、応答性のあるオブジェクトを通常のオブジェクトに変換します。通常のオブジェクトの各プロパティは、元のオブジェクトの対応するプロパティを指す参照です。
次に、同じ名前で人の名前のプロパティを参照に変換します。次に、ビューでは、2つの入力コントロールを追加します。1つは名前ref用、もう1つは人の名前のプロパティです。それらの1つを変更すると、もう1つもそれに応じて更新されるため、それらの間の応答性のある接続が維持されます。
次に、人のすべてのプロパティを、PersonDetailsオブジェクトに含まれる単一のREFに変換します。次に、ビューでは、2つの入力コントロールを再度追加して、作成したばかりのREFをテストします。ご覧のとおり、PersonDetailsの年齢は、前の例のように、人の年齢財産と完全に同期されています。
最後に、人の応答性オブジェクトをRawserson Normalオブジェクトに変換します。次に、ビューでは、Rawsersonの趣味プロパティを編集するための入力コントロールを追加します。しかし、私たちが見ることができるように、Vueは変換されたオブジェクトを追跡しません。
メソッドの最後のセットは、複雑な値を計算し、特定の値を「監視」するために使用されます。
この例では、FirstNameおよびLastName Refに基づいて計算されるFullName Computed変数を作成します。次に、ビューでは、2つの入力コントロールを追加して、フルネームの2つの部分を編集します。ご覧のとおり、パーツを変更すると、フルネームが再計算され、結果が更新されます。
<code class="language-javascript"><div id="app"> <h1>Hello! My name is {{ person.name }}. I'm {{ person.age }} years old.</h1> <button>Add "age" property</button> <p>Here are my favorite activities:</p> <ul> <li v-for="(item, index) in activities" :key="index">{{ item }} <button>Edit</button> </li> </ul> <button>Clear the activities list</button> </div></code>次に、ボリュームRefを作成し、Watch Effectを設定します。ボリュームが変更されるたびに、効果がコールバック関数を実行します。これを証明するために、ビューでは、ボリュームを増加させるボタンを追加します。コールバック関数に条件を設定して、ボリュームの値が3で割り切れることができるかどうかをテストします。それがtrueを返すと、アラートメッセージが表示されます。アプリケーションが開始されると効果は1回実行され、ボリュームの値を設定し、ボリュームの値が変更されるたびに再び実行されます。
最後に、状態Refを作成し、その変更を追跡するために時計関数を設定します。状態が変更されると、コールバック関数が実行されます。この例では、ボタンを追加して、再生と一時停止の間に状態を切り替えます。これが起こるたびに、アラートメッセージが表示されます。
WatcheffectとWatchは機能性の点で非常に似ていますが、いくつかの明らかな違いがあります。
ご覧のとおり、VUE 3レスポンシブAPIは、さまざまなユースケースで使用できる幅広い方法を提供します。 APIは非常に大きく、このチュートリアルでは、基本のみを探ります。詳細な調査、詳細、およびエッジケースについては、レスポンシブAPIドキュメントにアクセスしてください。
長所:
VUE 3レスポンシブシステムFAQ(FAQ)
VUE 3レスポンシブシステムはVUE 2とどのように異なりますか?
私のアプリケーションでVUE 3応答システムを使用する方法は?
vue 3のref()関数は、値への応答性の参照を作成するために使用されます。値を単一のプロパティ「.Value」でオブジェクトのラップし、このオブジェクトを応答します。これは、値が変更されると、このREFを使用するコンポーネントが更新されることを意味します。
raceive()およびref()は、両方ともVUE 3でデータの応答性を高めるために使用されますが、さまざまなシナリオで使用されます。 Reactive()関数はオブジェクトを応答するために使用されますが、Ref()関数は文字列や数値の応答性などのベース値を作成するために使用されます。ただし、ref()はオブジェクトでも使用できます。この場合は、ractive()と同様に動作します。
VUE 3アレイの応答性は、オブジェクトを処理するものと同じです。 Reactive()関数を使用してアレイを応答する場合、Vueは配列要素とその長さの変更を追跡します。これは、要素を追加、削除、または交換する場合、Vueはその配列に依存するコンポーネントを更新することを意味します。
VUE 3のオブジェクトが応答するのを防ぐ方法は?
VUE 3応答性メカニズムの計算された関数は何ですか?
vue 3マップとセットの応答性に対処する方法は?
以上がVUE 3の新しい反応性システムを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。