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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
1 u! v4 i" D4 T$ z
  1. <div id="app">+ h  R7 m' p- B( l- o6 ?/ L
  2.   {{ message.split('').reverse().join('') }}
    - H5 l4 ^- O! c' c
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2" M" h, z. i" P* D0 L3 Y8 z! W
  1. <div id="app">
      b" _1 \6 I2 d. d8 O* p3 G/ K
  2.   <p>原始字符串: {{ message }}</p>$ Z/ z* H, {, L
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>* e% _8 Q$ h+ N$ r" s* o
  4. </div>
    * S7 {: {; E0 k4 x, }: |4 a

  5. 0 K: A7 d1 B" D
  6. <script>
    ' @+ p" n( C0 B% ~  y" {. S% [# x
  7. var vm = new Vue({/ i1 P; E1 w2 S$ |0 O
  8.   el: '#app',; @: g% o& [: G6 C# J" `) u
  9.   data: {
    9 p/ H: S" ~$ [  v% @
  10.     message: 'Runoob!'
    & k! U0 t/ _$ P/ @0 S/ F
  11.   },/ c# Z% [/ s1 O0 k2 q6 Q. G/ Q4 Q- |
  12.   computed: {3 l2 ~" |" X4 F' R5 B
  13.     // 计算属性的 getter
    5 F' {: e& v) @1 S& u( j
  14.     reversedMessage: function () {
    $ W4 d* O+ z/ |3 c& P% P/ s+ _' b
  15.       // `this` 指向 vm 实例
    4 |- Z- t4 F$ C: \1 K# S1 _! v3 ?
  16.       return this.message.split('').reverse().join('')
    8 J# K7 }& C) r7 o
  17.     }% C; h$ j3 r1 ~- e
  18.   }* r& E: N) x% k7 _4 `4 Z
  19. })
    1 l+ r- C3 v. o. `) f: c; W
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
9 r2 D, s. M9 B0 l
  1. methods: {/ J4 J. Q0 }+ Y1 U: o+ c8 X
  2.   reversedMessage2: function () {
    ! C# C; y: C* w) f
  3.     return this.message.split('').reverse().join('')
    $ m) V8 U: s- h
  4.   }$ t3 E0 L; z* r
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4/ K+ b1 V) p% P0 X: a
  1. var vm = new Vue({# G  n/ C0 N3 d+ W/ O8 p
  2.   el: '#app',) U1 j- W) ]+ y! j" W: Y
  3.   data: {4 ]) [, [+ q  b/ g+ g" k; t
  4.     name: 'Google',+ M" k% h( E2 G. W; `( Y8 V* _
  5.     url: 'http://www.google.com'' i& O6 u" z2 H7 w+ }1 N2 v
  6.   },* x9 H- d1 K+ b0 i' G' i  J
  7.   computed: {2 N: F' s( H. }! Z0 T
  8.     site: {
    - I: l6 _" r, d; b" h  Z
  9.       // getter
    & G1 A) `' g  [  @( J. I/ v
  10.       get: function () {" i' i; k& d$ s" A+ s9 f
  11.         return this.name + ' ' + this.url' |7 S6 W) E& Q- E  n' ?3 }
  12.       },
    8 w$ A( n5 h$ a4 }# Q. h2 q7 ^
  13.       // setter, s' S5 P, Z) K6 y/ [. w* h
  14.       set: function (newValue) {
    3 u% T# Q/ }7 \  w9 k7 N
  15.         var names = newValue.split(' ')& J- [/ s6 {, T) A  c) E7 w
  16.         this.name = names[0]8 u" Z" j! r5 k0 r6 s
  17.         this.url = names[names.length - 1]6 p- v$ m( E: V0 F) l
  18.       }
    7 q# c! g% }* D8 R- S. g9 c6 C
  19.     }" q  i. y$ v1 X' e* k, E; m: @
  20.   }
    + l5 l" i- Q+ x/ W
  21. })0 t$ B! p6 d1 L3 `3 F6 V0 j
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新% z6 E6 ^( m2 B1 m0 u
  23. vm.site = '百度教程 http://www.baidu.com';
    + I, Z+ q. S& C" r  E" x+ G
  24. document.write('name: ' + vm.name);% d5 o) U8 P$ s: h
  25. document.write('<br>');
    0 @) Q6 ]. N6 Q/ a* e
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。" A! Z6 N( K& V' w) ~4 O
" o4 _5 U3 |( Z+ C9 |" j

. d% B) g2 J" \7 ~5 Q( K) ^' `
2 x$ K0 s8 o/ B% N3 `* N) f/ Z, T+ T( ~& E+ b
% s. q; a( o0 W0 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 16:00 , Processed in 0.059542 second(s), 23 queries .

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