cncml手绘网

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

作者: admin    时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1' J" d3 I4 z+ {/ }$ s/ ~& J0 ]( j
  1. <div id="app">
    9 _" }; n, |3 r' i1 U: k, M
  2.   {{ message.split('').reverse().join('') }}  R2 E" @# @- g6 c
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
9 z) ^( h$ F9 i
  1. <div id="app">
    9 m2 D$ n+ a% f5 v( t$ z6 F, X/ d
  2.   <p>原始字符串: {{ message }}</p>  f* w# ~3 o7 X4 n4 S* i  E1 m
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>7 m( ^# r- [( X- a* b
  4. </div>( p6 U4 Q, H% B* [% X

  5. ) G. \$ t9 h7 A$ G! H/ M$ @" A8 M
  6. <script>3 m. R0 h7 L& i3 F. ?
  7. var vm = new Vue({  U) N3 A* _9 S+ s) J- t' ]
  8.   el: '#app',$ z+ H; G6 J. z- T8 B) R8 [
  9.   data: {
    / q4 q1 Q% i9 P5 ]9 C) o4 |  R
  10.     message: 'Runoob!'
    % x  Q+ j1 D: K: j( i
  11.   },' W! _( \: z* b4 \( ]0 Q0 }
  12.   computed: {
    9 ~9 Y) T% o+ i: h! p$ B
  13.     // 计算属性的 getter
    2 D, u2 M3 G; |; g$ E
  14.     reversedMessage: function () {" Z: @& f' w0 E  M
  15.       // `this` 指向 vm 实例, u1 U$ ^: L3 x
  16.       return this.message.split('').reverse().join('')1 V( u; c. O* ~6 Q5 B7 Q. c
  17.     }  v: N9 J! r/ o7 m# k; A
  18.   }
    . U3 _, a! v0 z% o) R5 ~7 P) g' l
  19. })7 H' X4 d  k, g
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3: b: L, B7 h: J6 ]
  1. methods: {1 A. P, x1 c, p- i3 b7 i
  2.   reversedMessage2: function () {& x/ g2 S1 o# B7 }+ T# }
  3.     return this.message.split('').reverse().join('')
    & p* j& \8 i  p' M2 y8 U- E+ y
  4.   }2 b: a; ]4 e9 P
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 46 b9 U) \4 a+ B
  1. var vm = new Vue({7 T8 D) |, P$ O5 H4 o. M
  2.   el: '#app',
    2 D1 z  r2 V/ R1 ^  t
  3.   data: {2 w( @5 }1 Z, j4 s
  4.     name: 'Google',! R1 P2 L5 D$ k* n# G
  5.     url: 'http://www.google.com'9 S0 l7 n5 Z7 r9 Q* v
  6.   },
    & @& n8 w- B. _( v- n
  7.   computed: {8 F# _3 P1 v; g. w) l# P; x" _( r$ g8 ^
  8.     site: {
    # g- q/ T, X% h2 h
  9.       // getter
    + b2 ]( c- b3 I
  10.       get: function () {
    ! b$ p8 P5 [$ H) K, Q$ u% [9 `
  11.         return this.name + ' ' + this.url1 h" M; O' Z$ X+ q& b
  12.       },; g, L+ z3 K- l
  13.       // setter$ P2 J" _' y% I. F
  14.       set: function (newValue) {. v8 D! q; T  z" D9 z0 [
  15.         var names = newValue.split(' ')
    ' g- d' E7 g: C; x
  16.         this.name = names[0]8 V/ R4 \( @1 l  w. ~. J
  17.         this.url = names[names.length - 1]6 O( `) O. W+ J1 y; ]6 F7 G3 V
  18.       }
    5 O1 H  ~) Y  ~4 N' J1 O
  19.     }, s% \3 J4 L, H& o- U- W
  20.   }+ f  S' G% U" u& i- d
  21. })& a! I( H1 r) y! j, v  t, [0 f
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新' J: Z& Q4 h8 A" l8 x
  23. vm.site = '百度教程 http://www.baidu.com';
    / j7 M; @) I8 ]3 Q9 W8 p
  24. document.write('name: ' + vm.name);
    ( j: v& R  p1 Q" S9 G( C. e+ ~
  25. document.write('<br>');
    / ^  F0 Z8 g8 O
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
, Z' S6 g1 C) l, J- v , B$ |# {$ d3 _% C( K( h  x
6 @0 M9 I& X$ H1 Z+ v
- I5 a6 r2 K0 K6 C; Z$ d" k# s
+ j, H% k/ v7 M! p& J% u
. }8 P% X' _. Q, G( w& h





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