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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 14 O% h3 u1 [$ w) q
  1. <div id="app">
    ; R6 k! m) B4 }+ `' |1 N9 Z
  2.   {{ message.split('').reverse().join('') }}
    , z1 O2 ?4 G' z) j
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
3 _% i# }3 }8 Z2 Q
  1. <div id="app">. ]" b2 u+ ~/ G( c2 ]
  2.   <p>原始字符串: {{ message }}</p>/ z; d* o/ r' n8 |1 b3 f9 ?6 H; Y( E
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>4 N: l: g, e) ^8 Y3 K" l6 {
  4. </div>/ c& |' l( h; ^5 h3 i

  5. * W8 q0 ^8 z. M: X7 S9 E
  6. <script>$ ~5 M  {% x) c9 \, V* \# Q- f/ X
  7. var vm = new Vue({7 u* s! A  {# d9 r/ c
  8.   el: '#app',8 w# J& p1 v% U7 O$ @
  9.   data: {
    $ |6 i7 F  W# ]& w6 H3 _
  10.     message: 'Runoob!'5 ~, k3 g( i+ l  {& e: j* Z3 [/ j
  11.   },
    ; K) a& G# K3 [8 O& N  d( J& R
  12.   computed: {
    , N# ?: ?6 m! W* \+ g0 W3 K8 d
  13.     // 计算属性的 getter, h' y- R/ Q  k; ?% p/ p6 c7 O
  14.     reversedMessage: function () {
    , K+ k: ]& g! \( ?
  15.       // `this` 指向 vm 实例/ j$ u7 h5 ?! R' f
  16.       return this.message.split('').reverse().join('')6 l" |. [1 B. A/ F  P
  17.     }
    $ G: Y; U3 U# |+ w+ Y
  18.   }& q3 m$ i0 s- g, ?2 R
  19. })2 u/ M! u! j. A2 `; k
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
7 H7 S8 L- D2 c* @. `/ o% M
  1. methods: {
    + X3 d. R) b5 Y7 A) D- X- ~: Q
  2.   reversedMessage2: function () {4 C$ ?! z$ ^5 B. D5 y) v
  3.     return this.message.split('').reverse().join('')
    ; R/ R4 e. Y0 c. Q
  4.   }
    5 M( y4 Z/ j0 m4 o0 N7 C
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 43 O; H* p. ^+ B4 n
  1. var vm = new Vue({# M. P/ S2 X' ?$ M
  2.   el: '#app',$ J: s6 N  }9 R7 k7 g% Z4 ]5 _
  3.   data: {2 Q" q; G: k6 i' W/ |& [: }1 h
  4.     name: 'Google',
    9 h; f5 s( a$ P: H
  5.     url: 'http://www.google.com'
    ! e7 n. i; p1 j: z9 R& `6 v
  6.   },% y& m6 f0 s1 ^9 U+ @2 n
  7.   computed: {
    ! o$ V4 A7 Y0 O! w! I
  8.     site: {  Q  ^1 C2 J! [9 h7 ?0 q
  9.       // getter: w9 L- @$ X3 D$ _
  10.       get: function () {$ a$ V- |7 R8 v( y4 Q7 x) t
  11.         return this.name + ' ' + this.url
    ; O% _/ M( T& M" Q8 z6 w* i. p
  12.       },! y4 A$ d' T4 P7 B! r
  13.       // setter3 `, c* F2 `! A+ K& }2 X
  14.       set: function (newValue) {
    3 k7 h! k0 C5 a& U7 F
  15.         var names = newValue.split(' ')
    $ k/ a3 n1 u0 W, P1 z# ]4 s* z# V
  16.         this.name = names[0]
    - D/ _5 t' t) c& |0 d4 l' b' d
  17.         this.url = names[names.length - 1]* p4 u8 k9 W* e# d
  18.       }6 S$ l4 X- s" G/ ~5 ^# O9 j& R$ H# z' F
  19.     }
    ' x9 P5 Y0 ?5 W
  20.   }
    % W  d. g$ e! }2 d6 }% P
  21. })" M+ ^) T2 H( O6 d9 x2 o0 |4 {5 A
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    7 I7 v' h& L; b- l/ l0 w
  23. vm.site = '百度教程 http://www.baidu.com';
    + D- z  J3 D( o  B0 ~" |; Y# `
  24. document.write('name: ' + vm.name);* f. K0 f3 B( e4 V" y- ]
  25. document.write('<br>');
    6 ~0 x! B  K. k0 f
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
. b7 m# L% s( u2 m
& p6 f: Y( `9 R3 n4 l; r7 z: i# |. W. A9 w

+ Q  ?" z* ?' b5 n2 x0 ]$ r9 f4 x2 B9 C. y3 I

% f# I; r; ]- I) O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 21:11 , Processed in 0.108839 second(s), 22 queries .

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