計算プロパティとリスナーの詳細

計算プロパティとリスナーの詳細

1. 計算されたプロパティ

テンプレート内の式は非常に便利ですが、主に単純な計算用に設計されています。テンプレートにロジックを詰め込みすぎると、煩雑になり、メンテナンスが困難になる可能性があります。

例えば:

<div id="例">
  {{ message.split('').reverse().join('') }}
</div>


この時点で、テンプレートは単なる宣言型ロジックではなくなります。ここで必要なのは、変数messageの逆文字列を表示することであると気づくには、しばらくそれを見る必要があります。この反転された文字列をテンプレート内の複数の場所に含める必要がある場合、処理がさらに難しくなります。

したがって、複雑なロジックの場合は、計算プロパティを使用する必要があります。

1.1 基本的な例

<div id="例">
  <p>元のメッセージ: "{{ message }}"</p>
  <p>計算された逆メッセージ: "{{reversedMessage }}"</p>
</div>
var vm = 新しい Vue({
  el: '#例',
  データ: {
    メッセージ: 'こんにちは'
  },
  計算: {
    // 計算プロパティゲッター
    逆メッセージ: 関数 () {
      // `this` は vm インスタンスを参照します。 return this.message.split('').reverse().join('')
    }
  }
})


結果:

元のメッセージ: 「こんにちは」

計算された逆メッセージ: "olleH"

ここでは、計算プロパティreversedMessage宣言します。私たちが提供する関数はproperty vm.reversedMessagegetter関数として使用されます。

console.log(vm.reversedMessage) // => 'olleH'
vm.message = 'さようなら'
console.log(vm.reversedMessage) // => 'eybdooG'


ブラウザ コンソールを開いて、例のvm自分で変更することもできます。 vm.reversedMessageの値は常にvm.messageの値に依存します。

通常のpropertyバインドするのと同じように、テンプレート内で計算プロパティをバインドできます。 Vue はvm.reversedMessage vm.messageに依存していることを認識しているため、 vm.messageが変更されると、 vm.reversedMessageに依存するすべてのバインディングも更新されます。そして最も良い点は、この依存関係を宣言的な方法で作成したことです。計算プロパティのgetterは副作用がないため、テストと理解が容易になります。

1.2 計算プロパティキャッシュとメソッド

式の中でメソッドを呼び出すことで同じ効果が得られることに気づいたかもしれません。

<p>反転されたメッセージ: "{{reversedMessage() }}"</p>
// コンポーネントメソッド内: {
  逆メッセージ: 関数 () {
    this.message.split('').reverse().join('') を返します
  }
}


同じ関数を、計算プロパティではなくメソッドとして定義できます。どちらの方法でも最終結果はまったく同じになります。ただし、違いは、計算されたプロパティは、リアクティブな依存関係に基づいてキャッシュされることです。関連するリアクティブ依存関係が変更された場合にのみ再評価されます。つまり、 messageが変更されていない限り、 reversedMessage計算プロパティに複数回アクセスすると、関数を再度実行しなくても、以前に計算された結果がすぐに返されます。

これは、Date.now() がリアクティブ依存関係ではないため、次の計算プロパティが更新されなくなることも意味します。

計算: {
  今: 関数() {
    Date.now() を返す
  }
}


対照的に、メソッドを呼び出すと、再レンダリングがトリガーされるたびに関数が常に再度実行されます。

なぜキャッシュが必要なのでしょうか?巨大な配列を走査し、大量の計算を実行する必要がある、計算コストの高いプロパティAがあるとします。そうすると、 Aに依存する他の計算プロパティが存在する可能性があります。キャッシュがなければ、必然的にAgetter複数回実行してしまいます。キャッシュが必要ない場合は、代わりにメソッドを使用します。

1.3 計算プロパティと監視プロパティ

VueVueインスタンス上のデータの変更を監視して応答するための、より一般的な方法であるプロパティのリッスンを提供します。他のデータが変更されたときに変更する必要があるデータがある場合、特に以前にAngularJS使用したことがある場合は、 watchを悪用するのは簡単です。ただし、命令型のwatchコールバックの代わりに計算プロパティを使用する方がよい場合がよくあります。

次の例を考えてみましょう。

<div id="demo">{{ fullName }}</div>
var vm = 新しい Vue({
  el: '#demo',
  データ: {
    ファーストネーム: 'Foo',
    姓: 'バー',
    フルネーム: 'Foo Bar'
  },
  時計:
    firstName: 関数 (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: 関数 (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})


上記のコードは命令型で反復的です。これを計算プロパティのバージョンと比較します。

var vm = 新しい Vue({
  el: '#demo',
  データ: {
    ファーストネーム: 'Foo',
    姓: 'バー'
  },
  計算: {
    フルネーム: 関数 () {
      this.firstName + ' ' + this.lastName を返します
    }
  }
})

ずっと良くなりましたね。

1.4 計算プロパティセッター

計算プロパティにはデフォルトではゲッターしかありませんが、必要に応じてセッターを提供することもできます。

// ...
計算: {
  フルネーム:
    // ゲッター
    取得: 関数 () {
      this.firstName + ' ' + this.lastName を返します
    },
    // セッター
    設定: 関数 (newValue) {
      var names = newValue.split(' ')
      this.firstName = 名前[0]
      this.lastName = 名前[名前.長さ - 1]
    }
  }
}
// ...

これで、 vm.fullName = 'John Doe'を実行すると、 setterが呼び出され、それに応じてvm.firstNamevm.lastNameが更新されます。

2. リスナー

ほとんどの場合、計算プロパティの方が適切ですが、カスタム リスナーが必要な場合もあります。そのため、 Vuewatchオプションを通じてデータの変更に応答するより一般的な方法を提供します。このアプローチは、データが変更されたときに非同期またはコストのかかる操作を実行する必要がある場合に最も役立ちます。

例えば:

<div id="watch-example">
  <p>
    はい/いいえで答えられる質問をします:
    <input v-model="質問">
  </p>
  <p>{{ 答え }}</p>
</div>
<!-- AJAX ライブラリと一般的なツールのエコシステムはすでに非常に充実しているため、Vue コアコードは繰り返されません -->
<!-- これらの機能は、簡素化するために提供されています。これにより、より使い慣れたツールを自由に選択できるようになります。 -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>
<スクリプト>
var watchExampleVM = 新しいVue({
  el: '#watch-example',
  データ: {
    質問: ''、
    答え: 「質問されるまでは答えることができません!」
  },
  時計:
    // `question` が変更された場合、この関数が実行されます question: function (newQuestion, oldQuestion) {
      this.answer = '入力が終わるのを待っています...'
      this.debouncedGetAnswer()
    }
  },
  作成: 関数 () {
    // `_.debounce` は、Lodash 経由の操作頻度を制限する関数です。
    // この例では、yesno.wtf/api へのアクセス頻度を制限します。// ユーザーが入力を完了するまで AJAX リクエストは行われません。 `_.debounce` 関数(およびその類似関数 `_.throttle`)の詳細については、
    // 詳細は以下を参照してください: https://lodash.com/docs#debounce
    this.debouncedGetAnswer = _.debounce(this.getAnswer, 500)
  },
  メソッド: {
    答えを得る: 関数() {
      if (this.question.indexOf('?') === -1) {
        this.answer = '質問には通常疑問符が含まれます。 ;-)'
        戻る
      }
      this.answer = '考え中...'
      var vm = これ
      axios.get('https://yesno.wtf/api')
        .then(関数 (応答) {
          vm.answer = _.capitalize(レスポンスデータ.answer)
        })
        .catch(関数 (エラー) {
          vm.answer = 'エラー! API にアクセスできませんでした。' + error
        })
    }
  }
})
</スクリプト>

結果:

はい/いいえの質問をします:

質問されるまでは答えることができません!

この例では、 watchオプションを使用すると、非同期操作 (API へのアクセス) を実行し、その操作の実行頻度を制限し、最終結果が得られる前に中間ステータスを設定できます。これらは計算プロパティでは実行できないことです。

計算プロパティとリスナーの詳細についての記事はこれで終わりです。計算プロパティとリスナーの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue の計算プロパティとリスナーの使用の概要
  • Vue 学習ノート: 計算プロパティとリスナーの使用
  • Vue.js の計算プロパティとリスナーの簡単な分析
  • Vue の計算プロパティとメソッドとリスナーの違いの詳しい説明(面接テストのポイント)

<<:  Kubernetes ポッドオーケストレーションとライフサイクルの詳細な説明

>>:  txt ブックの内容を Web ページに表示するコード

推薦する

ノードイベントループとメッセージキューの分析

目次非同期とは何ですか?なぜ非同期性が必要なのでしょうか?非同期IOとは何ですか?イベントループとは...

Angular の 12 の典型的な問題について簡単に説明します

目次1. Angular 2 アプリケーションのライフサイクル フックとは何ですか? 2. Angu...

count(1)、count(*)、count(列名)の実行の違いの詳細な説明

実施効果: 1. count(1) と count(*)テーブル内のデータ量が多い場合、テーブルを分...

IDEA2020.1.2 Webプロジェクトの作成とTomcatの設定に関する詳細なチュートリアル

この記事は、IDEA で Web プロジェクトを作成し、Tomcat を構成する方法についての統合記...

nginx ロードバランシングを介して https にリダイレクトする方法

ウェブ上で証明書とキーをコピーするscp -rp -P52113 /application/ngin...

Windows 10 + mysql 8.0.11 zipインストールチュートリアルの詳細

準備する: MySQL 8.0 Windows zip パッケージのダウンロード アドレス: htt...

HTMLリンクを書くときは、HTTPリクエストを減らすためにサブフォルダに必ずスラッシュを追加してください。

サブフォルダーの末尾にスラッシュがない場合、2 つの HTTP リクエストが生成され、効率に影響しま...

MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

目次問題の説明解決問題分析問題の説明MySQL で delete ステートメントを使用してデータを削...

Ubuntuはカーネルモジュールをコンパイルし、その内容はシステムログに反映されます。

目次1.Linuxログインインターフェース2. コードを書く3. Makefileを書く4. コンパ...

ページのスクロールバーを無効にするには、overflow: hiddenを使用します。

コードをコピーコードは次のとおりです。 html {オーバーフロー: 非表示; }体{オーバーフロー...

Vueデータ割り当て問題の解決

私が長い間遭遇してきた問題を要約してみましょう。プロジェクトでは、フロントエンドをレンダリングするた...

UbuntuにMySQLデータベースをインストールする方法

Ubuntu は、Linux をベースにした無料のオープンソース デスクトップ PC オペレーティン...

Vueはプライベートフィルターと基本的な使用法を定義します

プライベート フィルターとグローバル フィルターのメソッドと概念は同じですが、プライベート フィルタ...

ApacheとTomcatを組み合わせて静的状態と動的状態を分離する方法

実験環境ApacheとTomcatは両方ともIPアドレス192.168.153.136のホストにイン...

MySQL 8.0.22 のインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 8.0.22のインストールと設定について記録します。具体的な内容は以下のとお...