您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16727|回复: 0
打印 上一主题 下一主题

[Vue.js] Vue.js 计算属性

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 18 A! J' I+ `8 }' _% d5 n: n
  1. <div id="app">) M* h" {: w3 [/ }: ^
  2.   {{ message.split('').reverse().join('') }}0 i: k% l. C. b! d7 T. c
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
8 j2 k7 R. g5 @( ]
  1. <div id="app">
    4 `" M! y2 a* Y
  2.   <p>原始字符串: {{ message }}</p>
    8 N2 R1 G7 J4 E6 K, o: t
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    6 k1 A, K% S  j& |4 ?
  4. </div>9 q7 e7 b% K2 x3 y4 S2 C

  5. 7 [2 {) o8 g$ I- ^
  6. <script>. W% O4 P- H/ e; P, b
  7. var vm = new Vue({
    ) |3 e/ i0 G" r7 i' A+ J* A
  8.   el: '#app',+ c9 R- y% m- c3 \0 k3 {6 x
  9.   data: {8 O* f- G3 n: ^, w- R, x* b# K8 ]
  10.     message: 'Runoob!'8 y; Z9 n1 F+ L0 ]/ P
  11.   },3 a) S* N; o* ]. a. W; g
  12.   computed: {
    6 K$ Q$ w& o1 F! f' n4 L; }
  13.     // 计算属性的 getter
    7 Y' v; ^$ [9 _  }7 k" U+ a, Y- y
  14.     reversedMessage: function () {
    / _1 B! Q. a+ \! a$ P1 l* }# f
  15.       // `this` 指向 vm 实例
    0 k5 F# [2 U. p' [& Z& E+ b; {
  16.       return this.message.split('').reverse().join('')
    ; ~4 c% d& n9 T1 ~* l
  17.     }) y& [3 w/ R" ?7 @0 m. A( _8 Y' P
  18.   }
    ( i( q$ j8 s) [
  19. })% a0 {" l- c- X0 w
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
5 p" s6 q" h! \% E
  1. methods: {
    ( M+ K8 C, b: a; v8 J: G5 d: k
  2.   reversedMessage2: function () {2 A7 Z9 i: M$ e& y3 P
  3.     return this.message.split('').reverse().join('')" C, s/ i4 W2 s9 d$ a. j& H% z
  4.   }" v: c  M- ]( L8 n" e
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
& i* I$ ^- z' x% [" J0 g
  1. var vm = new Vue({) m) T( o8 z6 c
  2.   el: '#app'," H) R/ F& f% b/ T
  3.   data: {
    1 J; W2 R1 V( X- |3 Y2 \, u, r7 m
  4.     name: 'Google',$ m$ \' H7 e" [. R- I2 R0 }; E
  5.     url: 'http://www.google.com', E2 @7 l& [7 e0 }
  6.   },
    ! M# Z; I+ f) o/ [. k2 P. u2 u
  7.   computed: {1 a8 I0 r, [, U  M" b( T' Y( z
  8.     site: {
    ; P* A7 }3 a3 E/ H8 N
  9.       // getter
      V  K( d, t2 @3 T9 r4 o
  10.       get: function () {% z' A3 A. ^+ O# r4 G, l- E3 B) m
  11.         return this.name + ' ' + this.url
    / y" i; ^' [" R/ `! e
  12.       },7 j% P1 l3 s4 R
  13.       // setter
    7 s% y: W8 w9 a2 X5 f. t+ ~, f* m
  14.       set: function (newValue) {/ i; |3 T6 e( G- v- J7 m3 I
  15.         var names = newValue.split(' ')
    4 i( {/ _9 P) n
  16.         this.name = names[0]
    " E6 z( F- m1 t6 n' C5 p
  17.         this.url = names[names.length - 1]
    ; ?* w/ h7 h" r
  18.       }
    7 @: w. O! }% \4 A4 a
  19.     }
    : i  q! r; C* x/ k. R0 B9 {0 E
  20.   }
    ' _) J+ W0 e$ z  o2 l% F
  21. })
    ; {/ c! T6 I; N) h6 e8 J4 H
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新3 a6 p' c/ u; D
  23. vm.site = '百度教程 http://www.baidu.com';
    / z. w2 Y; y; [4 e* n
  24. document.write('name: ' + vm.name);. o& J6 Y1 r+ W
  25. document.write('<br>');9 ~, w- M* e+ k' ?) s% R5 r
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
8 C4 `( a- ^' a8 R, t
+ V. ~$ n8 j4 l$ g5 u! n
" _: h" v* W1 A( s7 m2 A. E) ~' x& ~$ r' z8 L9 O9 f

- y+ r1 V0 q! o, Z* L- {
1 y, E  N. A) Y1 ^3 G2 `$ {% P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-5 00:00 , Processed in 0.076854 second(s), 22 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!