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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1+ f% g/ c6 Y* x3 I3 F6 f
  1. <div id="app">
    + |8 `# d/ c9 S% u7 w
  2.   {{ message.split('').reverse().join('') }}
    $ J) X! {- \; B, x. ^6 \  f& ~) {0 a9 n
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
# E- W4 }( D4 C! R
  1. <div id="app">
    6 e  S$ Q( x, h$ O, v$ Y
  2.   <p>原始字符串: {{ message }}</p>
    4 l4 d1 s3 x9 h6 ~- y# w
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>8 z) m  x. S+ Y: V0 B; I4 }7 x. y. B
  4. </div>4 U* {- Q4 `6 m$ z
  5. : [1 H7 S! m3 |
  6. <script>1 i# }3 o7 s& e: g0 I, f
  7. var vm = new Vue({. B6 P2 j1 ^: {* m# z0 ?8 l  j! U
  8.   el: '#app',( m6 }; T- @  r2 s$ d! @. N* e
  9.   data: {
    & a2 E" Z" z! k6 P8 H/ ~
  10.     message: 'Runoob!'
    9 C8 X5 n+ z% U) c" ?/ t9 X
  11.   },( N. }0 @4 Q9 i* H+ x+ t
  12.   computed: {5 Q7 ]5 y8 z) h
  13.     // 计算属性的 getter: P# e: x+ I7 a9 @. Q
  14.     reversedMessage: function () {
    % r: M3 N% H) J- ]
  15.       // `this` 指向 vm 实例
    & m. k9 P. b& c* @6 \: n
  16.       return this.message.split('').reverse().join('')
    ( ^# O% y+ v, y
  17.     }3 Q, J& C5 y# U1 d/ o" ^; ?
  18.   }
    6 K( J5 s' C, r2 u. O
  19. })
    # d% a# s" {8 c" g- E+ S( G! L
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
; i, D* d, N: e6 ?! k% k- V
  1. methods: {; T8 N3 E4 F6 [5 |5 a0 y
  2.   reversedMessage2: function () {
    2 y- @4 d$ p. U2 A; C' z
  3.     return this.message.split('').reverse().join('')
    9 D* J5 _& x0 h) a1 w0 J$ @
  4.   }
    8 D+ m- I7 O- h$ S3 c9 Q& Q
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4% Q+ T0 B. S1 V7 y0 x
  1. var vm = new Vue({
    2 f- M! |+ \& H- o
  2.   el: '#app',
    : t* e2 l. Q- l1 M6 v; H
  3.   data: {
    7 w3 F5 V! J, `8 R. `
  4.     name: 'Google',7 R' _. Q8 v; l3 ]
  5.     url: 'http://www.google.com'
    4 W2 U' ~: q3 c7 b
  6.   },
    & X2 ?* z% {3 E8 b
  7.   computed: {4 l5 u! |7 ], X& _- \$ ~
  8.     site: {, K* t" B! H9 Q5 o$ T- g) ^
  9.       // getter. R: T! [2 I: Y- j
  10.       get: function () {
    1 h+ ~) z8 t7 `0 K/ K( n! ]
  11.         return this.name + ' ' + this.url  e& I9 A; g# k7 F
  12.       },$ `; D0 H. u1 O+ B+ J9 c1 Z- @5 U
  13.       // setter2 S1 O) q4 x+ ], b" S6 m( Q+ [
  14.       set: function (newValue) {2 N8 |) U$ j- }# d: j: P
  15.         var names = newValue.split(' ')  Y+ ^7 f* Y6 w/ b- N/ n9 |+ `
  16.         this.name = names[0]+ m9 j9 p: H& J7 S9 X
  17.         this.url = names[names.length - 1]' {! y6 M4 i; O
  18.       }
    1 ~/ c& D; w. q6 ?% O  d2 [
  19.     }
    9 _% _" r7 G; L) |: U0 b
  20.   }
    * U* }/ j6 \4 y
  21. })
    % V3 x! C) W( d0 T
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新1 q. i. C. B5 B% k2 Z
  23. vm.site = '百度教程 http://www.baidu.com';* h+ l( j$ ]9 \( Q$ J4 K. }# L
  24. document.write('name: ' + vm.name);
    , `- T" J3 D  b0 s  v
  25. document.write('<br>');
    - Z  q* K' y5 ~" o# I: a
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
  |" a4 E' x2 |8 l
0 F( y. Q' u- }9 o, f+ J
  A, {4 i) g, ]( c# ~. S3 |
# \- g4 q. F& r" F( r. O, D9 e( w2 Y6 f1 I- A$ b/ U

9 k; U& f8 F  \  C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 21:04 , Processed in 0.117318 second(s), 25 queries .

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