|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 18 A! J' I+ `8 }' _% d5 n: n
- <div id="app">) M* h" {: w3 [/ }: ^
- {{ message.split('').reverse().join('') }}0 i: k% l. C. b! d7 T. c
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
8 j2 k7 R. g5 @( ]- <div id="app">
4 `" M! y2 a* Y - <p>原始字符串: {{ message }}</p>
8 N2 R1 G7 J4 E6 K, o: t - <p>计算后反转字符串: {{ reversedMessage }}</p>
6 k1 A, K% S j& |4 ? - </div>9 q7 e7 b% K2 x3 y4 S2 C
-
7 [2 {) o8 g$ I- ^ - <script>. W% O4 P- H/ e; P, b
- var vm = new Vue({
) |3 e/ i0 G" r7 i' A+ J* A - el: '#app',+ c9 R- y% m- c3 \0 k3 {6 x
- data: {8 O* f- G3 n: ^, w- R, x* b# K8 ]
- message: 'Runoob!'8 y; Z9 n1 F+ L0 ]/ P
- },3 a) S* N; o* ]. a. W; g
- computed: {
6 K$ Q$ w& o1 F! f' n4 L; } - // 计算属性的 getter
7 Y' v; ^$ [9 _ }7 k" U+ a, Y- y - reversedMessage: function () {
/ _1 B! Q. a+ \! a$ P1 l* }# f - // `this` 指向 vm 实例
0 k5 F# [2 U. p' [& Z& E+ b; { - return this.message.split('').reverse().join('')
; ~4 c% d& n9 T1 ~* l - }) y& [3 w/ R" ?7 @0 m. A( _8 Y' P
- }
( i( q$ j8 s) [ - })% a0 {" l- c- X0 w
- </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- methods: {
( M+ K8 C, b: a; v8 J: G5 d: k - reversedMessage2: function () {2 A7 Z9 i: M$ e& y3 P
- return this.message.split('').reverse().join('')" C, s/ i4 W2 s9 d$ a. j& H% z
- }" v: c M- ]( L8 n" e
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
& i* I$ ^- z' x% [" J0 g- var vm = new Vue({) m) T( o8 z6 c
- el: '#app'," H) R/ F& f% b/ T
- data: {
1 J; W2 R1 V( X- |3 Y2 \, u, r7 m - name: 'Google',$ m$ \' H7 e" [. R- I2 R0 }; E
- url: 'http://www.google.com', E2 @7 l& [7 e0 }
- },
! M# Z; I+ f) o/ [. k2 P. u2 u - computed: {1 a8 I0 r, [, U M" b( T' Y( z
- site: {
; P* A7 }3 a3 E/ H8 N - // getter
V K( d, t2 @3 T9 r4 o - get: function () {% z' A3 A. ^+ O# r4 G, l- E3 B) m
- return this.name + ' ' + this.url
/ y" i; ^' [" R/ `! e - },7 j% P1 l3 s4 R
- // setter
7 s% y: W8 w9 a2 X5 f. t+ ~, f* m - set: function (newValue) {/ i; |3 T6 e( G- v- J7 m3 I
- var names = newValue.split(' ')
4 i( {/ _9 P) n - this.name = names[0]
" E6 z( F- m1 t6 n' C5 p - this.url = names[names.length - 1]
; ?* w/ h7 h" r - }
7 @: w. O! }% \4 A4 a - }
: i q! r; C* x/ k. R0 B9 {0 E - }
' _) J+ W0 e$ z o2 l% F - })
; {/ c! T6 I; N) h6 e8 J4 H - // 调用 setter, vm.name 和 vm.url 也会被对应更新3 a6 p' c/ u; D
- vm.site = '百度教程 http://www.baidu.com';
/ z. w2 Y; y; [4 e* n - document.write('name: ' + vm.name);. o& J6 Y1 r+ W
- document.write('<br>');9 ~, w- M* e+ k' ?) s% R5 r
- 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 |