cncml手绘网

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

作者: admin    时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 16 P' A$ X  t" C  @* x: |
  1. <div id="app">
    3 o9 ?& q+ m" H
  2.   {{ message.split('').reverse().join('') }}5 y9 c$ ?( ^, v: ^9 s
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 28 z1 D( S8 k0 k; b' t: W, r7 a
  1. <div id="app">
    9 L8 |' [, L. q$ A+ a6 v
  2.   <p>原始字符串: {{ message }}</p>4 ^" o( o% O' {5 e; T  I
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>  P6 O: _: b& t4 d
  4. </div>3 n* ]) d* ^9 a" q. W" Q6 D
  5. $ B4 F3 k! X  E) q
  6. <script>
    6 _" {3 [$ n* m8 P$ w1 D7 A
  7. var vm = new Vue({
    & j( Q, y; s* [
  8.   el: '#app',
    ) F1 _1 h3 S: Z; o
  9.   data: {
    3 b6 K! O+ _( ?' X+ ~! `+ h
  10.     message: 'Runoob!'' i6 v: a7 n8 M6 A
  11.   },0 v; y" J  P: B; A. z0 o
  12.   computed: {
    6 b7 }% Q& c* G7 ?; y
  13.     // 计算属性的 getter3 J) F- O8 Z  W
  14.     reversedMessage: function () {/ X  I8 h, a7 d8 R$ e$ ^
  15.       // `this` 指向 vm 实例
    - ~# S. g. m9 I6 {0 X
  16.       return this.message.split('').reverse().join('')- b- n; L% R0 k) d2 q
  17.     }
    ) k) x0 q! c; ?
  18.   }3 E# X2 Y5 `: z! I3 W
  19. })
    . ~, P- z5 }5 f
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
- {9 T0 d0 R1 j  N1 k3 p) `
  1. methods: {# _: y$ P0 l; _' |1 U0 c9 \
  2.   reversedMessage2: function () {
    : \5 k6 r( @. ^. O: A' w
  3.     return this.message.split('').reverse().join('')4 F3 \1 X: |5 G6 O5 D: G3 z
  4.   }3 G8 \$ j' Y6 {$ I9 v4 |8 Y) R4 t* ?2 w
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4+ x; [( `, n- W2 z  Y* z7 |
  1. var vm = new Vue({& g  {8 M4 F% A: n) C" v* f
  2.   el: '#app',
    ' a- D* ~+ r' D: I
  3.   data: {
    " t  W' w" B4 Y# u5 V
  4.     name: 'Google',
    6 O! L0 e* M/ J$ r% w/ |$ _6 Z( s
  5.     url: 'http://www.google.com'
    & E$ I/ q. R' s- {! `  I+ _3 l" r
  6.   },8 r- G9 `) v) u5 t: M
  7.   computed: {
      c& f* i7 K1 t) U+ b
  8.     site: {
    3 M' C( g. d0 f4 T+ v& E
  9.       // getter
    / i* ?% N" k; f  O) L! L  ]. H. }5 G
  10.       get: function () {. g: D. j  @" P3 u& Y- w- f5 N) b
  11.         return this.name + ' ' + this.url
    + o$ ]+ z& V: k% [
  12.       },1 w# E7 b- l/ R1 n1 y$ ~! L, U5 R
  13.       // setter+ m( s4 [' k0 p
  14.       set: function (newValue) {
    5 O5 z1 o) W/ V# e/ E' M7 s2 q
  15.         var names = newValue.split(' ')
    , W  {/ L2 R# J* I7 ?  g5 j
  16.         this.name = names[0]% W% }& K/ k. D9 C! n, N  h; Z9 N
  17.         this.url = names[names.length - 1]- [- y8 n, I. V4 T
  18.       }& O* h* G! t, G
  19.     }7 o3 A; L5 s% t0 o
  20.   }* X  P( ~+ z  R5 A
  21. })
    - W4 ~( e! {8 D% M
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    % W/ c1 W0 O% C' Q6 x
  23. vm.site = '百度教程 http://www.baidu.com';0 `$ @" A: x* A1 a- C
  24. document.write('name: ' + vm.name);" C% l$ G* \! ?4 W- E
  25. document.write('<br>');  w. y6 E# d' L2 A+ l% t. a
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
2 z# e  _% D3 {# j1 I 6 q+ b/ t/ i  L; C: H
* w# p- ]: k- p7 t# N/ Q
* ]+ C" v; }/ o/ D2 u/ L

- l  k8 l2 R6 w# k
" ]  P  e) s2 b. s+ f6 c' P7 C




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