cncml手绘网

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

作者: admin    时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
# G/ G' M$ D# `0 c+ g
  1. <div id="app">1 m& R1 N' s6 x3 d5 z( u
  2.   {{ message.split('').reverse().join('') }}1 G+ P: B0 }4 g$ z/ a: W/ ]; w( R
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2; Q% s6 t3 k+ [  O; T
  1. <div id="app">
    ; t+ G) Q+ P& |/ K$ {  V+ s; g. _: s
  2.   <p>原始字符串: {{ message }}</p>- S, g8 h+ Z$ }2 S3 a. u
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    , R/ {7 u; o$ J( g$ ]* V3 `8 C
  4. </div>6 b, g- w: H; ?3 `% o6 B
  5. 2 n: m# s8 L# F  \  P: r
  6. <script>
    2 o* S( n5 X$ G* X4 ~- h! O
  7. var vm = new Vue({
    & p. Q" R5 r) y; z/ h% o" c0 h1 j# D6 r
  8.   el: '#app',
    / ?9 l) W  l2 x- h
  9.   data: {
    5 L! }1 z% }: d! c8 x
  10.     message: 'Runoob!'
    2 k' k% n$ J3 l
  11.   },6 {+ m  G. }( F2 q5 v; [8 H: |& R
  12.   computed: {. h: x- t( @' n! @  e0 m
  13.     // 计算属性的 getter
    * U% v' B! @5 B, f6 }" s/ B) L6 E
  14.     reversedMessage: function () {
    8 Z# o& b4 l/ u! x( e1 D) `( x
  15.       // `this` 指向 vm 实例$ w3 o5 X8 A2 e- v0 S# x0 i. \3 s
  16.       return this.message.split('').reverse().join('')1 V2 g; ]% ^2 X; j
  17.     }) c: @1 G, K+ t. X' q) v9 z
  18.   }
    6 d; ^5 t  G: q/ W0 F7 P) c
  19. })
    2 A) J% S& M2 L' |- _8 Z3 X
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3: H( }7 u7 L0 \/ J
  1. methods: {
    . S9 ?4 s9 u& G( _" a
  2.   reversedMessage2: function () {
    . @$ Z, p5 Y+ ]) q4 ^; _' x
  3.     return this.message.split('').reverse().join('')
    3 Y2 a- x3 V0 L1 i; p( i
  4.   }! O  E) q7 k+ a2 [  n! \
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
0 l0 ^+ Q& j8 J# i" V8 W& ?) N8 V
  1. var vm = new Vue({
    / ^: c, u+ Z0 i1 L# v
  2.   el: '#app',
    . c: |( |) E" H& _* L% |
  3.   data: {) t5 F; W1 n8 E/ g
  4.     name: 'Google',0 l- M! U+ X! G) M# V: \) e
  5.     url: 'http://www.google.com'
      _+ p- |" ^0 `7 c
  6.   },7 D& K$ ]$ ~  ?) p. y( M4 m6 j
  7.   computed: {) J- @' {: g" \% q  q! ?# F  G
  8.     site: {
    / t6 ^7 u, I+ D4 c. Y9 S
  9.       // getter
    1 d6 h. }, W0 j, D, Y
  10.       get: function () {
    ) p% N% V3 h3 x8 A
  11.         return this.name + ' ' + this.url: b3 z) F5 E  {1 Z# ~
  12.       },
    & x" ~& s6 P- x# w; \) ]
  13.       // setter- D+ ]3 j% f# t! Q$ w  {, u
  14.       set: function (newValue) {, i$ r) Q7 o# N
  15.         var names = newValue.split(' '), W8 @; o5 i1 k  B3 S7 D0 h5 u
  16.         this.name = names[0]
    ( `# G4 Z' \7 w, J3 m
  17.         this.url = names[names.length - 1]
    / H: w  V6 a5 h9 ^) s8 A
  18.       }# U" `5 d, S  G
  19.     }
    / f# c4 m3 N& N  w6 C% f1 O  {6 Z
  20.   }
      k- U1 _! m8 @! ^
  21. })
    5 l( ?. N! d! j' K* p( A
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新1 q+ a; Z8 `6 q) X
  23. vm.site = '百度教程 http://www.baidu.com';
    2 u  T  k8 @& _* T2 D! \
  24. document.write('name: ' + vm.name);7 t; a+ H) ?( d' ~/ X) p0 |' t
  25. document.write('<br>');: z' B5 _' \, ?
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
  ~/ `( k( v/ I
6 x/ \- f( ^% o2 q. r" s& _0 ]' d
1 |& S1 }9 _5 E, D. _7 R& ]9 M; `+ F8 y8 p5 e* o
" K& V' F' J# |; `
3 t8 n3 z" [" G* s0 c3 G# X0 K





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