|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
8 q( O( T$ c& N- <div id="app">
" g) b a+ c I. S1 n - {{ message.split('').reverse().join('') }}
/ D( o* b k- {+ } - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
5 h! e8 ?$ A$ Z' y( I4 D- t# d- <div id="app">* [% v. G/ H3 G% J; {" @
- <p>原始字符串: {{ message }}</p>
- j' K3 u& B0 d& d - <p>计算后反转字符串: {{ reversedMessage }}</p>
) n5 n8 [4 w% _# S( r - </div>
) L, d6 W Z6 g - 7 ~* O& S5 a2 I% Z9 [
- <script>* r6 S8 u* @( u( t0 d
- var vm = new Vue({4 s3 k, U1 z5 ]9 p" x+ E9 V1 y
- el: '#app',
+ P% d. o3 ?3 e - data: {
# ^' {$ |/ v5 c s [ - message: 'Runoob!'
) _) N4 ~8 _" s: ^3 ] - },' G6 e4 l, a2 W! L. R0 @9 o V1 f& R
- computed: {
, E6 t' }3 Y& L; T d - // 计算属性的 getter8 p. a7 `! `9 Y, x- s8 _$ g2 X
- reversedMessage: function () {
" I9 i' J# }$ t% g# p8 ]# P2 N - // `this` 指向 vm 实例+ M* l+ J3 {1 P. i* K! K
- return this.message.split('').reverse().join('')+ V, Z( s8 s$ @. C3 |/ t
- }9 _0 O: B6 H# e" g r; X
- }, B( {4 r) a$ Z' e+ j7 I% E
- })0 T5 X- ]/ x- D( ^3 B6 t
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
+ o/ i) I5 ?' E0 s- methods: {6 a9 u! o) s- S8 y
- reversedMessage2: function () {
) w$ [$ }. a# A; i - return this.message.split('').reverse().join('')
! W4 t8 h8 D4 v - }0 C8 ]$ |8 E$ s$ |
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 48 u% @) r5 R' k
- var vm = new Vue({
2 l" U2 l0 g* x' e+ l* p7 D' G - el: '#app',
; C+ ?9 n+ A5 w - data: {
' Y# G2 m+ s% e7 ] - name: 'Google',6 f/ u2 ^/ O; f; I" B5 m
- url: 'http://www.google.com'% F% j. _$ Y5 I. s
- },
& W- W- t$ m1 S. w- D. q: z7 } - computed: {
/ A; D$ P) V0 u9 u - site: {% Y' d2 X) ^, m
- // getter
6 o" [( Y. } e3 w% Z! \- P - get: function () {
" \' i" X9 H: ?$ n! @ - return this.name + ' ' + this.url; o+ v, t; o2 W$ R0 h" l
- },- @) p0 P1 J: D/ [
- // setter- }- b' ~& W! V3 q/ }
- set: function (newValue) {" b2 o/ o) G* }, t) ?2 r* W
- var names = newValue.split(' ') c. x' I, \# i r
- this.name = names[0]% t- P% A4 }+ G! y6 Z+ W
- this.url = names[names.length - 1]
1 c: l7 J8 W& a# r3 a - } G1 P& U6 c! R. r* p* s
- }* ~$ Y L. h. P4 m
- }* ~+ s* H) ]/ ~4 ?) R( _/ I
- })
: S! q2 h4 R! O" ] - // 调用 setter, vm.name 和 vm.url 也会被对应更新
( y% Y; t) l: p9 Q - vm.site = '百度教程 http://www.baidu.com';
' P4 x3 ~3 w( p - document.write('name: ' + vm.name);
) K) [1 w8 U; f3 T, `6 @9 O - document.write('<br>');+ ]) T7 W4 I! ]5 G v
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
5 E1 u j0 I- c. O
: j5 H9 q! s0 z; B; D- Q' o0 g1 y. p
5 o+ b& K1 }/ o I& I. E2 o; N5 Q" s8 y4 h3 A
% w* A4 J+ K" {
|