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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1% t0 C% T) Q+ ?6 m3 P
  1. <div id="app"># b' i, D1 E; ^$ y& b6 d4 p0 o# G
  2.   {{ message.split('').reverse().join('') }}
    ; \/ }8 K& S9 L5 g1 `
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
9 y# I6 Q; @- [8 ~% v; `; t  O
  1. <div id="app">
    3 p- z6 b/ g. B, @" e
  2.   <p>原始字符串: {{ message }}</p>
    7 }& W! L& @" A1 J3 E
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    : Q- v/ z: u* S6 o& R
  4. </div>7 c5 w0 @7 s) _: G

  5. / Q: I/ ?1 Y; J' p
  6. <script>
    7 |# o0 D3 }5 p4 _+ D. i: M
  7. var vm = new Vue({
    ( g" w+ s8 k; a8 e0 }+ e0 p! o& l/ x- @
  8.   el: '#app',
    & T3 }+ o, Q8 h- V7 i# A% S" g2 O
  9.   data: {6 [+ w) e/ K3 @1 u
  10.     message: 'Runoob!'
    ) s) z+ v2 T. d3 S
  11.   },1 y* H8 y" e" R' n
  12.   computed: {
    / Z" G3 l, U! s4 s  W
  13.     // 计算属性的 getter
    ( H/ d1 R! F& x! {9 e
  14.     reversedMessage: function () {- r. F) a+ M0 A
  15.       // `this` 指向 vm 实例  R) D- f$ @/ u3 p
  16.       return this.message.split('').reverse().join('')* ?1 A5 \4 u! V
  17.     }
    % z3 [* n+ }" S3 g3 L" D
  18.   }
    . y* Y/ @% [6 a: l  ^
  19. })
    & b0 T! t  i% S( n% {  P# l3 e
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
' v" H  o! Q+ M6 {6 Z* l9 H
  1. methods: {
    ! s) I- x' E8 H
  2.   reversedMessage2: function () {
    & O- o/ I; S. A) X0 t
  3.     return this.message.split('').reverse().join('')
    2 e9 z: J  P! f# h- W, C& C
  4.   }
    5 Y$ \3 c0 g; k- {
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 45 q  S+ N* g9 ]3 x' D3 w% ^
  1. var vm = new Vue({9 T3 K- P. r/ c4 M8 |( ~
  2.   el: '#app',+ o9 @4 X$ Z; O
  3.   data: {+ X5 g$ Q7 d& i  \9 {' d5 y
  4.     name: 'Google',
    6 A7 N/ z8 c' O" z0 h8 d$ Q/ l
  5.     url: 'http://www.google.com'
    7 A2 ^+ v9 m, ^
  6.   },+ z- U5 T# K, I% C# i6 d2 h
  7.   computed: {
    7 d+ c. j4 C, i- k: {
  8.     site: {- _3 d) v8 z/ d% f* n* c
  9.       // getter3 Y! `2 T2 {" K! b6 E9 t& V
  10.       get: function () {
    6 Z' `! m6 D) D9 d* I% W
  11.         return this.name + ' ' + this.url
    ! A8 w1 t2 `4 F+ O+ w( @, Y) B
  12.       },
    . P9 t  v6 d4 c% P1 g' p5 ]  E
  13.       // setter7 F% p6 t5 z! `! F) M; Y& A5 F! X  X6 ?
  14.       set: function (newValue) {* _  h+ W) p5 e0 e4 ^
  15.         var names = newValue.split(' ')( `5 n2 ^/ ~0 \( z5 P+ i
  16.         this.name = names[0]
    ! V9 Z3 G$ u3 R
  17.         this.url = names[names.length - 1]1 J% \: u( y1 ?4 l) y
  18.       }
    * m3 q) A' {3 F8 e5 v, l
  19.     }. n- E- r+ _. y
  20.   }
    2 L* W) k  v% n: f; W
  21. })( I9 y! d0 B; b3 j, t
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    - m: I  \4 l9 z% k
  23. vm.site = '百度教程 http://www.baidu.com';
    # }  Q7 J' c1 `1 a/ {
  24. document.write('name: ' + vm.name);
    6 Z+ H: J$ [( Y3 r8 b7 P
  25. document.write('<br>');3 F! I  x% ^% B
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
# U  V2 ^4 T9 v# W4 y! Z & I" w. ~% H/ \1 ^. T8 G  D
6 M; F) Q) c3 M" k; g9 a+ b  H

# ]! e; i0 I3 s9 j6 _  J' ~* f( n* ]) ]! j# ~7 |
/ {; R  V# t  L: F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:38 , Processed in 0.055175 second(s), 22 queries .

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