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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 10 |4 K& h" D. X, }% ~1 ~" t4 T3 N
  1. <div id="app">
    0 M) M; a3 B4 _! P7 Y
  2.   {{ message.split('').reverse().join('') }}) T4 f+ e( N* I8 O  \) v7 t7 h) m
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2  @5 A5 z6 s2 Q1 k6 y3 e
  1. <div id="app">
    / p4 ~& q+ _1 g6 [( K4 Y
  2.   <p>原始字符串: {{ message }}</p>
    3 B; A4 x$ W+ @4 [0 G4 h1 t
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>3 M7 p& q" \: o4 _0 s! y
  4. </div>
    8 {( @/ Y' l* I0 ~

  5. 5 L7 V0 ^) K! `1 m! i$ [! s
  6. <script>6 e& S$ _# z6 s) w. Y$ Y% D" A
  7. var vm = new Vue({6 S% B% q2 E9 L8 a8 `5 E
  8.   el: '#app',: ~% m4 g+ ?( Z( y0 a% W  }; v3 w
  9.   data: {
    # f4 @7 L# h! q1 g7 U& J; x
  10.     message: 'Runoob!'
    1 V3 b9 Q. Z1 P! ^0 a; r- \
  11.   },
    9 e. Q+ T/ b7 `* m' R; @  A( V
  12.   computed: {
    ' P* D4 q  q( W* p  |' r/ }. C- R
  13.     // 计算属性的 getter
    1 ~/ ]0 T3 f$ p, Y  r2 \
  14.     reversedMessage: function () {- N* j5 ]  g' \" Z' x% H+ q
  15.       // `this` 指向 vm 实例
    7 R& S5 Z$ ~" X$ B& h6 l( n
  16.       return this.message.split('').reverse().join('')
    + {+ C6 [3 W  o7 U, s
  17.     }1 D$ l3 T6 W3 u' l1 Y* G
  18.   }
    ( L6 [2 _6 J% O5 K5 o/ R# }0 x
  19. })' X% ~- T$ N8 _
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 38 f. T1 k: X5 x0 N
  1. methods: {$ s# Z) h6 G, f7 S$ V/ K
  2.   reversedMessage2: function () {
    ( n  g  L8 {: t
  3.     return this.message.split('').reverse().join(''): \3 M  I4 S& P+ B: B
  4.   }, }2 N) J; }& M
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
, e* n) x. }% r0 G" c# w
  1. var vm = new Vue({
    $ d  S2 K5 b( Q4 a! O4 `2 O- W
  2.   el: '#app',4 g8 y% Q( ?7 S! f! c; o
  3.   data: {
    5 R" k# A! K" {  T4 {& I
  4.     name: 'Google',
    $ x" j, }( ~$ y" w, K
  5.     url: 'http://www.google.com'
    4 Y" D( \+ \  n1 u" s0 k2 _( m4 l
  6.   },1 \, M4 x% N# y% j, Y! X# ~* U
  7.   computed: {
    - A4 {) Q0 z. J7 a
  8.     site: {
    & r& u2 V4 S: e& n
  9.       // getter1 `+ G) U9 W" f( O# r5 |$ O) G% [/ O
  10.       get: function () {
    ' E& ]( U+ T4 |2 }: n. D& s. Q3 D
  11.         return this.name + ' ' + this.url& _$ o/ _1 [& }
  12.       },
    + z) ~! v# ]8 u; T! x- c
  13.       // setter" C2 f5 b9 ]( r, l6 R% J
  14.       set: function (newValue) {) G3 J% m8 q( p$ m7 G: m  X9 R
  15.         var names = newValue.split(' ')/ x+ W. |, P0 \* W0 T
  16.         this.name = names[0]' X/ \- U  t1 k: i3 k6 ]0 j% }
  17.         this.url = names[names.length - 1], D0 X4 |0 }# v$ L
  18.       }8 a, e* V/ c1 |+ Q4 ?
  19.     }  g. D9 A6 i0 E
  20.   }  y2 a+ |0 {$ N# ?' M3 m( N' p
  21. })' a$ H5 C0 B7 n  {' {3 n
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新, D8 T; T3 S: M- r
  23. vm.site = '百度教程 http://www.baidu.com';
    0 f. I# r8 u; L
  24. document.write('name: ' + vm.name);
    5 }; _9 ~. C; j$ z. c
  25. document.write('<br>');
    % @4 P4 I( n/ x  a2 Q6 c
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。% Q: r9 m7 B. [8 L
- B4 j- A3 Y* D8 k( I  j+ F: k

1 g5 T4 D- Y" W9 }( O. K: z
! l' _. u2 N% @, F8 O% j0 s+ D7 C. r4 p4 q! F( I  v6 i
* d$ F- @" |, q' H% o0 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:02 , Processed in 0.085159 second(s), 24 queries .

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