cncml手绘网

标题: Vue.js 计算属性 [打印本页]

作者: admin    时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1$ W4 h$ H4 v( T# P  v
  1. <div id="app">
    $ j+ S! }8 z: o
  2.   {{ message.split('').reverse().join('') }}
    ; R" A! S, @" h% J
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
4 ?6 u1 o9 O2 z3 a' E
  1. <div id="app">' ?' o: D  h% r6 j0 e
  2.   <p>原始字符串: {{ message }}</p>& m  d9 B( g! x' g
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    , P5 g, H, w; |3 z$ [
  4. </div>
    3 ?, |+ ^# ~6 ], E

  5. ) A, Z8 e( k* n2 n  y( }# t
  6. <script>
    * d5 t! M* D5 r% z& M# E3 J
  7. var vm = new Vue({! o% W4 j" Y. N' ^: Q
  8.   el: '#app',
    * N/ h' w: A' _: }, V$ ?
  9.   data: {6 }- R$ J7 l2 w
  10.     message: 'Runoob!'
    # i$ ]* Z1 x6 T) O
  11.   },
    " r( n; p( J! K2 [. w; ]5 {2 e7 N
  12.   computed: {
      s( J, l& ?) k( O! e( h
  13.     // 计算属性的 getter
      K. A& l* d* U9 o+ U
  14.     reversedMessage: function () {
    ) J9 B" `- o. @  j
  15.       // `this` 指向 vm 实例9 Q9 l+ A8 u; G4 s( `0 D
  16.       return this.message.split('').reverse().join('')
    % L: L) F! |& g2 N; }* ^# I% @) k
  17.     }
    * i2 k: x4 ]& Q' h# I: n
  18.   }
    " h8 p! H* v$ r( Z
  19. })
    . J: S8 V; b5 Z3 ~% l
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
) g+ C" r! V% [9 u
  1. methods: {) R& `1 T; D: @( ^' Y5 {# R
  2.   reversedMessage2: function () {. D- x0 c. q$ V- v
  3.     return this.message.split('').reverse().join('')
    5 O! U7 F' D, C/ v) `
  4.   }
    . I3 q0 G2 ?. s1 i+ }2 E
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
" G' f+ X: C7 Q- w1 C
  1. var vm = new Vue({- P1 q5 U, z* y+ Z9 K' w4 s
  2.   el: '#app',
    2 x1 H- i$ D& c* @' s7 q  T* N) p
  3.   data: {
      X5 S% c1 F, t! b6 r6 |
  4.     name: 'Google',
    2 Y' Y" m8 Z+ f- Z
  5.     url: 'http://www.google.com'7 F8 ]6 o7 ?7 x$ Q
  6.   },
    / p& C' Z; \# ~/ x
  7.   computed: {
    , P% o5 Q5 i% V  e& F; }
  8.     site: {
    5 \7 U) S7 V1 G6 m
  9.       // getter
    6 a7 a8 K# z2 h/ M
  10.       get: function () {
    * p$ u5 s3 _. I5 |. G3 q0 I6 n
  11.         return this.name + ' ' + this.url
    1 i8 A0 [" p4 d: \9 ?! K
  12.       },
    + s( c9 s) ~% V4 k  g* n; t
  13.       // setter  m& H) V+ E# z  \8 a& \0 T& Q
  14.       set: function (newValue) {
    ' b4 w# D4 I" {) B2 F- l0 ^
  15.         var names = newValue.split(' ')1 z" O% W# M7 v: L3 c% X8 F5 R
  16.         this.name = names[0]. j& }9 g+ u) b# I( f1 u7 u: }
  17.         this.url = names[names.length - 1]
    . w7 ^3 b! ]- w# _" Y/ u. `; l
  18.       }
    8 _/ x) F+ Q* y9 m) p4 A6 {! G
  19.     }! a8 i* l: e( d5 Y7 p  m2 Q' ^( u
  20.   }8 |- i5 w5 [# ~% z
  21. })% k6 h9 D) L) s/ y
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新5 y6 x: w: S5 k7 ~
  23. vm.site = '百度教程 http://www.baidu.com';
    9 j( E3 C! \( m4 r. ?; X
  24. document.write('name: ' + vm.name);3 K9 D4 C# r0 N) {
  25. document.write('<br>');
    5 ?; s' b5 L. M2 K1 ^5 a
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。4 ^) ~" U$ [: x4 M9 I

  E- P' ~5 E0 d/ r! Z- m
: w0 I8 z+ o9 b/ @
* j$ t2 H3 {2 u8 B  z! w
- H- Z: F; N( T( g3 Q) c
4 d6 Q3 }0 W7 d) J! a$ P




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2