Vue.js の計算プロパティをリスナーで使用する方法

php中世界最好的语言
リリース: 2018-05-23 14:50:39
オリジナル
1329 人が閲覧しました

今回は、Vue.js の計算プロパティとリスナーの使用方法と、Vue.js の計算プロパティとリスナーを使用する際の 注意事項 について説明します。実際のケースを見てみましょう。

1. 概要

計算プロパティ

テンプレート内の

は非常に便利ですが、元々は単純な操作用に設計されています。テンプレートにロジックを入れすぎると、テンプレートが太くなり、保守が困難になる可能性があります。例:

<p id="example">
 {{ message.split('').reverse().join('') }}
</p>
ログイン後にコピー
ここで、テンプレートは単純な宣言ロジックではなくなりました。ここに変数メッセージを表示するために反転された

string があることがわかるまで、しばらく観察する必要があります。ここで反転した文字列をテンプレート内で複数回参照したい場合、対処がさらに難しくなります。

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

基本的な例

<p id="example">
 <p>Original message: "{{ message }}"</p>
 <p>Computed reversed message: "{{ reversedMessage }}"</p>
</p>
var vm = new Vue({
 el: '#example',
 data: {
  message: 'Hello'
 },
 computed: {
  // 计算属性的 getter
  reversedMessage: function () {
   // `this` 指向 vm 实例
   return this.message.split('').reverse().join('')
  }
 }
})
ログイン後にコピー
結果:

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

console.log(vm.reversedMessage) // => 'olleH'
vm.message = 'Goodbye'
console.log(vm.reversedMessage) // => 'eybdooG'
ログイン後にコピー
通常のプロパティと同じように、計算されたプロパティをテンプレートにバインドできます。 Vue は、vm.reversedMessage が vm.message に依存していることを認識しているため、vm.message が変更されると、vm.reversedMessage に依存するすべてのバインディングも更新されます。そして最も良い点は、この依存関係を宣言的に作成したことです。計算されたプロパティのゲッター関数には副作用がないため、テストと理解が容易になります。

2. 計算属性キャッシュとメソッド

式の中でメソッドを呼び出すことで同じ効果を達成できることにお気付きかもしれません

<p>Reversed message: "{{ reversedMessage() }}"</p>
// 在组件中
methods: {
 reversedMessage: function () {
  return this.message.split('').reverse().join('')
 }
}
ログイン後にコピー
同じ関数を計算属性の代わりにメソッドとして定義できます。最終結果はどちらの方法でもまったく同じになります。ただし、計算されたプロパティが依存関係に基づいてキャッシュされるという点が異なります。計算されたプロパティは、関連する依存関係が変更された場合にのみ再評価されます。つまり、メッセージが変更されていない限り、 reversedMessage 計算プロパティに複数回アクセスすると、関数を再度実行することなく、直前の計算結果が即座に返されます。

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

computed: {
 now: function () {
  return Date.now()
 }
}
ログイン後にコピー
対照的に、呼び出しメソッドは、再レンダリングがトリガーされるたびに常に関数を再度実行します。

なぜキャッシュが必要なのでしょうか?

比較的高価な計算属性 A があるとします。これには、巨大な配列を走査して多くの計算を行う必要があります。その場合、 A に依存する他の計算プロパティがある可能性があります。キャッシュがなければ、必然的に A のゲッターを複数回実行することになります。キャッシュしたくない場合は、代わりにメソッドを使用してください。

3. 計算されたプロパティとリスニング プロパティ

Vue は、Vue インスタンスのデータ変更を観察してそれに応答するためのより一般的な方法、つまりリスニング プロパティを提供します。

他のデータの変更に合わせて変更する必要があるデータがある場合、特に以前に AngularJS を使用したことがある場合、ウォッチを悪用するのは簡単です。ただし、多くの場合、命令型の監視コールバックではなく、計算されたプロパティを使用する方が適切です。

この例について考えてください

<p id="demo">{{ fullName }}</p>
var vm = new Vue({
 el: '#demo',
 data: {
  firstName: 'Foo',
  lastName: 'Bar',
  fullName: 'Foo Bar'
 },
 watch: {
  firstName: function (val) {
   this.fullName = val + ' ' + this.lastName
  },
  lastName: function (val) {
   this.fullName = this.firstName + ' ' + val
  }
 }
})
ログイン後にコピー
上記のコードは命令的であり、繰り返しです。計算されたプロパティのバージョンと比較してください:

var vm = new Vue({
 el: '#demo',
 data: {
  firstName: 'Foo',
  lastName: 'Bar'
 },
 computed: {
  fullName: function () {
   return this.firstName + ' ' + this.lastName
  }
 }
})
ログイン後にコピー
はるかに優れているのではないでしょうか。

4. 計算されたプロパティのセッター

計算されたプロパティにはデフォルトでゲッターのみが含まれますが、必要に応じてセッターを提供することもできます

// ...
computed: {
 fullName: {
  // getter
  get: function () {
   return this.firstName + ' ' + this.lastName
  },
  // setter
  set: function (newValue) {
   var names = newValue.split(' ')
   this.firstName = names[0]
   this.lastName = names[names.length - 1]
  }
 }
}
// ...
ログイン後にコピー

现在再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstName 和 vm.lastName 也会相应地被更新。

五、侦听器

      虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

    例如:

<p id="watch-example">
 <p>
  Ask a yes/no question:
  <input v-model="question">
 </p>
 <p>{{ answer }}</p>
</p>
<!-- 因为 AJAX 库和通用工具的生态已经相当丰富,Vue 核心代码没有重复 -->
<!-- 提供这些功能以保持精简。这也可以让你自由选择自己更熟悉的工具。 -->
<script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
<script>
var watchExampleVM = new Vue({
 el: '#watch-example',
 data: {
  question: '',
  answer: 'I cannot give you an answer until you ask a question!'
 },
 watch: {
  // 如果 `question` 发生改变,这个函数就会运行
  question: function (newQuestion, oldQuestion) {
   this.answer = 'Waiting for you to stop typing...'
   this.getAnswer()
  }
 },
 methods: {
  // `_.debounce` 是一个通过 Lodash 限制操作频率的函数。
  // 在这个例子中,我们希望限制访问 yesno.wtf/api 的频率
  // AJAX 请求直到用户输入完毕才会发出。想要了解更多关于
  // `_.debounce` 函数 (及其近亲 `_.throttle`) 的知识,
  // 请参考:https://lodash.com/docs#debounce
  getAnswer: _.debounce(
   function () {
    if (this.question.indexOf('?') === -1) {
     this.answer = 'Questions usually contain a question mark. ;-)'
     return
    }
    this.answer = 'Thinking...'
    var vm = this
    axios.get('https://yesno.wtf/api')
     .then(function (response) {
      vm.answer = _.capitalize(response.data.answer)
     })
     .catch(function (error) {
      vm.answer = 'Error! Could not reach the API. ' + error
     })
   },
   // 这是我们为判定用户停止输入等待的毫秒数
   500
  )
 }
})
</script>
ログイン後にコピー

    结果:当没有输入?号,那么显示如下:

    当有?时候会输出“yes”或者“no”

 具体案例效果地址:侦听器

 在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

有哪些js使用方式(附代码)

如何动态引入JS文件

以上がVue.js の計算プロパティをリスナーで使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート