您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16721|回复: 0
打印 上一主题 下一主题

[Vue.js] Vue.js 计算属性

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
% N; G8 u$ P% M9 f4 _7 U% N
  1. <div id="app">! O: X& \. E8 L% I# @
  2.   {{ message.split('').reverse().join('') }}5 j& L' I3 X& E
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2+ N% D" I+ |) f+ L% ~
  1. <div id="app">" |6 B) p7 q. F/ P+ R
  2.   <p>原始字符串: {{ message }}</p>0 Z3 x9 P8 A6 t* ?. B
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    6 P3 g( U5 y3 m& K3 f( d
  4. </div>% A  A' f4 v" ^. C

  5. - c( ~3 D1 _( E* h
  6. <script>, Z7 _: Q0 O, k. h" _2 E2 q! _1 i
  7. var vm = new Vue({
    ' g5 H! {' t" Y* k
  8.   el: '#app',
    6 t* ?7 [/ n6 _6 z2 n3 o
  9.   data: {5 y, l) A1 V0 M* C6 r
  10.     message: 'Runoob!'
    : o8 ~7 F& @1 s" t
  11.   },
    3 s( D3 f( Q% h" Q! T0 W$ o
  12.   computed: {1 @$ w9 E; i: S, h' y# \
  13.     // 计算属性的 getter
    2 H3 d5 M1 z4 Q% p% C9 |
  14.     reversedMessage: function () {9 L8 c8 p- n  ?7 j( |5 R+ `; G
  15.       // `this` 指向 vm 实例
    7 E; m  i9 V$ v6 Z  G' q( A, m6 ^
  16.       return this.message.split('').reverse().join('')6 q! Y, ], T" w. c
  17.     }
    3 I: P7 n# B" q9 ^
  18.   }
    5 e1 F0 y, |$ z' I
  19. })
    - Q2 u# }7 M  [( i: C
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3: T) h# o6 e. s2 ^
  1. methods: {* d5 i) ?2 L1 E% o# @% b: ]
  2.   reversedMessage2: function () {7 ^/ i$ e6 ]  {4 {3 a* f4 H
  3.     return this.message.split('').reverse().join('')
      D$ s" M6 ~, i9 ]4 c) \: R; e
  4.   }1 ~* O  }3 k$ [0 C
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
: P. n" p) x# H0 s
  1. var vm = new Vue({
    2 y2 B$ a- y" C( \; `
  2.   el: '#app',
    / ~+ P, z6 j, v0 |3 `6 [/ f
  3.   data: {
    # [! u  [% n9 Z: @
  4.     name: 'Google',
    . {! f% x0 u  `" t
  5.     url: 'http://www.google.com'$ w" _$ F. j3 t3 c% |2 p( l
  6.   },( i9 b% N. h1 T% s
  7.   computed: {# b2 X5 M, g. r9 e) {0 X
  8.     site: {9 {% G4 S$ Z, G$ c- Z( [
  9.       // getter! ^& a- s1 Z% K: l. ^5 {; S& ?
  10.       get: function () {' Z5 y6 C* P1 R8 l- d! f
  11.         return this.name + ' ' + this.url
    1 i2 f& u, B( t$ K
  12.       },: h% n% l% n% E9 V% _9 l* E
  13.       // setter
    & {$ g. s$ S! u* o. Y, O2 a, ~
  14.       set: function (newValue) {. \- ?, r& ?7 V: c) @# l
  15.         var names = newValue.split(' ')
    7 B! @) x8 s. Y' r" V$ U' Z
  16.         this.name = names[0]4 w# y! u( Y: |8 \1 E) U+ K
  17.         this.url = names[names.length - 1]
    , x: _. m3 o9 B- w' p: X
  18.       }
    # I3 N* [. \- t  Z/ b
  19.     }
    - N& I, C& q! @6 T. y4 E- |& x
  20.   }
    5 |$ c- O6 k9 p7 t% `2 U
  21. })" E& h0 y# o. U" M
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新1 t8 |+ V3 e3 X6 N
  23. vm.site = '百度教程 http://www.baidu.com';( H$ S' J( [0 N/ f2 I5 V
  24. document.write('name: ' + vm.name);  w- R+ d0 }" T
  25. document.write('<br>');- q3 L* `! h1 t9 ~
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。, Q* h  _) A  k. ~( D

( `3 H2 d; Q' {- Q* \$ H% K6 C7 D5 E% {
% k1 I9 v8 d2 N& g

6 {, @9 Z# K0 {5 B/ Q7 m+ |
  g0 G- ?, F9 A0 O% V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 14:07 , Processed in 0.052484 second(s), 22 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!