cncml手绘网

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

作者: admin    时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1- X2 h/ S4 n6 K
  1. <div id="app">
    / g2 n$ H. y  y, K+ R8 Q2 R
  2.   {{ message.split('').reverse().join('') }}
    7 u% d. z- F% A7 A0 e" \0 P9 H8 g
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2+ e2 O% s+ \6 ~" |
  1. <div id="app">
    " C* Q) y+ Z+ ]
  2.   <p>原始字符串: {{ message }}</p>  G& [6 P! ~3 R: K: O- P' F
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    ( }; H; {, Z# P" W0 _3 n) Q, ?; p
  4. </div>$ m/ ]! Z- N$ N* H

  5. ' a. t5 b7 s/ h$ a  w
  6. <script>
      F. s! ^9 R* u5 n5 d: \
  7. var vm = new Vue({
    ' ~$ j! V. E0 ]
  8.   el: '#app',
    # u1 Y0 B9 R( Q9 c
  9.   data: {
    ' s, n* x- k( n! @' K5 S
  10.     message: 'Runoob!'
    ! W' n0 Z9 U- S3 a3 I2 Q
  11.   },& }! F) a; _9 V
  12.   computed: {
    " }1 Z8 J8 N* n
  13.     // 计算属性的 getter
    ; c7 m2 M' O5 }
  14.     reversedMessage: function () {
      e3 c- J2 l7 M
  15.       // `this` 指向 vm 实例1 }  [! o# H6 H
  16.       return this.message.split('').reverse().join('')/ T0 y. n8 z* d3 q
  17.     }
    ' t. _- _+ H# w1 S! Q" A
  18.   }- \1 {  u$ D- I, h$ g( n5 z
  19. })6 B* q5 M. ~. I& r
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
4 F8 J+ y4 _' H% ^
  1. methods: {
    1 i9 j( J7 |" c& Y- U0 }
  2.   reversedMessage2: function () {" X9 ]# b( P$ n' I0 @
  3.     return this.message.split('').reverse().join('')
    ' E6 H% m6 G0 i% T
  4.   }1 n8 R+ k6 V; b9 l- J! l! [8 W4 ?
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
: A7 D: _; \# q, P$ K4 i
  1. var vm = new Vue({. P& ~. ]. {( c% @8 N
  2.   el: '#app',/ Y; T  ~$ H! R! ^5 }! s9 j, {1 ?( e
  3.   data: {* T1 w2 @1 D3 G( N
  4.     name: 'Google',# l( u% n0 k0 y) z- J0 F; p& Z* P
  5.     url: 'http://www.google.com'
    * B# r+ s; S. L( k% M* u
  6.   },6 o% C  G6 y. p  k# y% i
  7.   computed: {; c- l2 D* _, N/ M6 U6 M
  8.     site: {
    + `( E4 @& f! m  L4 L; Z
  9.       // getter
    2 o% d3 l2 o* l5 W- j- p
  10.       get: function () {! x+ J9 z9 |4 {" u5 \/ G
  11.         return this.name + ' ' + this.url  W& N& |, I% g) l* e3 {" ]7 v
  12.       },% M$ m7 x4 b' \% b1 F/ T) ^
  13.       // setter7 D2 w2 w- K+ q8 o
  14.       set: function (newValue) {: ?% \4 {0 C$ E7 ]0 f
  15.         var names = newValue.split(' ')
    7 c; ?/ {. y3 i. `/ h' g2 t
  16.         this.name = names[0]
    9 ^9 l* n- K* [, K) ^# r! L
  17.         this.url = names[names.length - 1]( l3 `- Y1 ]' u# e3 T
  18.       }
    9 I9 ?" @# u# W, N- V
  19.     }
    5 i4 w1 O$ ?1 S+ v) U0 t, i) ?
  20.   }; M0 Q: x3 q9 e: N" W( r6 c9 C
  21. })) Y& ]* T1 R! d, r6 l
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新7 q, _! J+ F8 b* X6 i6 l8 v0 N
  23. vm.site = '百度教程 http://www.baidu.com';
    ' Q3 i+ S6 d0 j( G
  24. document.write('name: ' + vm.name);7 a% U# e4 `% }. S+ h
  25. document.write('<br>');$ B7 l& \7 F1 z8 Y
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
% B: F, ~4 R+ Q. W. r% C ) u0 O5 r) d5 b1 k% a, _

" n( a& P# I1 Q" \( O4 f1 _8 q3 ?# n( c# H, r4 K) ~0 D
6 V4 m; o' R" J9 S" Z% h* h

& [# B9 K; o8 ^  b4 g




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