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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
8 q( O( T$ c& N
  1. <div id="app">
    " g) b  a+ c  I. S1 n
  2.   {{ message.split('').reverse().join('') }}
    / D( o* b  k- {+ }
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
5 h! e8 ?$ A$ Z' y( I4 D- t# d
  1. <div id="app">* [% v. G/ H3 G% J; {" @
  2.   <p>原始字符串: {{ message }}</p>
    - j' K3 u& B0 d& d
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    ) n5 n8 [4 w% _# S( r
  4. </div>
    ) L, d6 W  Z6 g
  5. 7 ~* O& S5 a2 I% Z9 [
  6. <script>* r6 S8 u* @( u( t0 d
  7. var vm = new Vue({4 s3 k, U1 z5 ]9 p" x+ E9 V1 y
  8.   el: '#app',
    + P% d. o3 ?3 e
  9.   data: {
    # ^' {$ |/ v5 c  s  [
  10.     message: 'Runoob!'
    ) _) N4 ~8 _" s: ^3 ]
  11.   },' G6 e4 l, a2 W! L. R0 @9 o  V1 f& R
  12.   computed: {
    , E6 t' }3 Y& L; T  d
  13.     // 计算属性的 getter8 p. a7 `! `9 Y, x- s8 _$ g2 X
  14.     reversedMessage: function () {
    " I9 i' J# }$ t% g# p8 ]# P2 N
  15.       // `this` 指向 vm 实例+ M* l+ J3 {1 P. i* K! K
  16.       return this.message.split('').reverse().join('')+ V, Z( s8 s$ @. C3 |/ t
  17.     }9 _0 O: B6 H# e" g  r; X
  18.   }, B( {4 r) a$ Z' e+ j7 I% E
  19. })0 T5 X- ]/ x- D( ^3 B6 t
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
+ o/ i) I5 ?' E0 s
  1. methods: {6 a9 u! o) s- S8 y
  2.   reversedMessage2: function () {
    ) w$ [$ }. a# A; i
  3.     return this.message.split('').reverse().join('')
    ! W4 t8 h8 D4 v
  4.   }0 C8 ]$ |8 E$ s$ |
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 48 u% @) r5 R' k
  1. var vm = new Vue({
    2 l" U2 l0 g* x' e+ l* p7 D' G
  2.   el: '#app',
    ; C+ ?9 n+ A5 w
  3.   data: {
    ' Y# G2 m+ s% e7 ]
  4.     name: 'Google',6 f/ u2 ^/ O; f; I" B5 m
  5.     url: 'http://www.google.com'% F% j. _$ Y5 I. s
  6.   },
    & W- W- t$ m1 S. w- D. q: z7 }
  7.   computed: {
    / A; D$ P) V0 u9 u
  8.     site: {% Y' d2 X) ^, m
  9.       // getter
    6 o" [( Y. }  e3 w% Z! \- P
  10.       get: function () {
    " \' i" X9 H: ?$ n! @
  11.         return this.name + ' ' + this.url; o+ v, t; o2 W$ R0 h" l
  12.       },- @) p0 P1 J: D/ [
  13.       // setter- }- b' ~& W! V3 q/ }
  14.       set: function (newValue) {" b2 o/ o) G* }, t) ?2 r* W
  15.         var names = newValue.split(' ')  c. x' I, \# i  r
  16.         this.name = names[0]% t- P% A4 }+ G! y6 Z+ W
  17.         this.url = names[names.length - 1]
    1 c: l7 J8 W& a# r3 a
  18.       }  G1 P& U6 c! R. r* p* s
  19.     }* ~$ Y  L. h. P4 m
  20.   }* ~+ s* H) ]/ ~4 ?) R( _/ I
  21. })
    : S! q2 h4 R! O" ]
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    ( y% Y; t) l: p9 Q
  23. vm.site = '百度教程 http://www.baidu.com';
    ' P4 x3 ~3 w( p
  24. document.write('name: ' + vm.name);
    ) K) [1 w8 U; f3 T, `6 @9 O
  25. document.write('<br>');+ ]) T7 W4 I! ]5 G  v
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
5 E1 u  j0 I- c. O
: j5 H9 q! s0 z; B; D- Q' o0 g1 y. p

5 o+ b& K1 }/ o  I& I. E2 o; N5 Q" s8 y4 h3 A
% w* A4 J+ K" {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:42 , Processed in 0.077323 second(s), 22 queries .

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