计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
( p) c. r. f- O% ^( ]5 e- <div id="app">6 Y; w, _0 n6 d, f1 U0 _) N/ N
- {{ message.split('').reverse().join('') }}0 F( |& P2 p, S, ]
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
/ w/ {* ] i1 d7 e& f, ]& f- <div id="app">
+ _. W1 Q( a% k2 \2 V) W4 F - <p>原始字符串: {{ message }}</p>
% [" Y* A- U( A/ i2 E! ] - <p>计算后反转字符串: {{ reversedMessage }}</p>7 `$ D6 |# M" n& k$ L
- </div>
9 R+ C2 L1 Z. ? -
1 E$ L1 b+ I! i8 ] d/ N9 e7 x - <script>
; e; L# s ~( E: [% t - var vm = new Vue({
# S* D/ U# D& ?; O& K - el: '#app',' \4 N( b' ?* u d& P: S+ |: {3 x( T
- data: {4 w- M9 _: A% i, }7 h7 x3 P! S
- message: 'Runoob!', `/ v$ L, x4 C" T1 e! u: j4 m
- },: P" X$ F& _$ B1 u3 B0 u8 D( l! G: g; ~
- computed: {
. ~, I3 k0 [& n1 p1 l) P0 F2 } - // 计算属性的 getter; p' r& d! S/ ]4 Y- A. {
- reversedMessage: function () {
* D; j& r7 T5 }" G! X - // `this` 指向 vm 实例
9 D( S9 i% m. k+ Z - return this.message.split('').reverse().join('')
- Y& y2 Y8 x- N3 a% A - }
6 S u+ C% D3 ]0 w& | - }
; Q) J5 t6 S6 p8 O$ V, X' W - })' S" ?+ s; p1 R
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
. S5 B: d' ?- |3 }0 g: p# F$ M) a1 T- methods: {9 a8 V' {) W! e: o) d- K' N
- reversedMessage2: function () {
6 n) Q6 K$ y. Q - return this.message.split('').reverse().join('')8 k4 J. p* B+ Q# M
- }
1 c2 A5 t( K' n/ h - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
8 @. R$ U/ N$ A; n( q6 U# ]- var vm = new Vue({
: C6 }' ~ r ^4 }" R - el: '#app',
' X7 W0 H5 F0 |: f* y- S3 \$ h; G' R' a - data: {) M& j* w8 A7 l0 C2 B! o2 k1 N
- name: 'Google',
% R* I4 @, [1 D+ H - url: 'http://www.google.com'9 `0 w D1 H0 o5 R2 V4 \7 U( T" R
- },
1 y; {1 s2 l! B; ?' i/ w - computed: {7 _6 J' j: Q/ }' U
- site: {
" {8 Q, H: N# u+ J( | - // getter# h) t( S9 V6 h* k' u4 \3 J0 U' g
- get: function () {. p, S: e3 z- E
- return this.name + ' ' + this.url
$ D* E- Y# B% Y/ [% K* K - },
: i1 w6 }1 f9 Y" V* c - // setter
, N0 g3 _" m: _ - set: function (newValue) {0 ?3 z. \' U: B; o) Y' I ?3 L. X
- var names = newValue.split(' ')5 F' [+ [- B; e& |1 @8 V
- this.name = names[0]
: {# U, n1 E, X/ d( y - this.url = names[names.length - 1]
! N6 A8 B) t/ I v - }' z' n M; g6 ^8 n$ j4 s0 F
- }
0 Y' K/ s+ ?1 I# A6 E i - }
8 ^" J% E: n. h7 ]! m - })$ \6 t" Z. Z# X! P
- // 调用 setter, vm.name 和 vm.url 也会被对应更新
% K E5 C* s! e9 p7 m @* c0 W - vm.site = '百度教程 http://www.baidu.com';
) E1 P6 Y6 t$ w: N0 \" O; D8 t- s - document.write('name: ' + vm.name);
3 e+ j# q+ D% ? - document.write('<br>');4 {2 t2 }- x( K$ Z# q
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
9 Z* D* v, P* W
9 A) M' I& ~7 H3 t. f7 ~: c% Z
4 B& W; _* ^9 e" [( l! o
6 y1 E c1 L1 R+ F* m' S8 U$ D, ?9 F* s( T& {! b4 M& E
( o0 l5 a! T' Q0 D `7 z |