|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1: s" }: W$ `& A2 g
- <div id="app">
* y% K9 S u7 Z* ~& b" N5 L - {{ message.split('').reverse().join('') }} O! c: p! W6 j, l. u( I
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
% n3 z, `4 B/ D4 t5 E: @" L2 ~- B" [+ ?- <div id="app">
8 K. Q% s, {5 x( @: o' v9 Z; C - <p>原始字符串: {{ message }}</p>
6 o. X8 U0 G! l7 v - <p>计算后反转字符串: {{ reversedMessage }}</p>/ F$ F0 S. n, M; N
- </div>/ }# Z, g2 X% e, E' h
- 2 l) _+ [6 u2 p4 O) b
- <script>; a3 {( B8 J! i
- var vm = new Vue({
! f; U J* R: h5 w$ {# `8 c. k3 D - el: '#app',
; l- L4 O; M/ ~8 j: e! b8 p4 \& t - data: {+ R; E9 u- y3 n4 K, A$ G! q( h% o* M
- message: 'Runoob!'% w, X% j, F- D3 Z+ |
- },
3 J" `1 H% Y" Y) _! K - computed: {! T) W; [& M" e
- // 计算属性的 getter* y1 Z: J v: z: g) Y" t' H
- reversedMessage: function () {
( t# Q! D$ \: ~ - // `this` 指向 vm 实例9 \& }" Z4 ^* A& n+ e
- return this.message.split('').reverse().join('')8 N/ q2 u$ l9 H# Y
- }' v2 R H* o. _- c) X
- }
0 K0 s2 q+ R: ?! y# d - })
2 k* `* P9 D2 E9 `0 x5 U - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
/ L' g) W' N& [. Q% I- methods: {0 b$ x. m) p& d/ t, G7 f4 ]* n& l4 Q5 l
- reversedMessage2: function () {" P% k0 J9 x9 r# D4 _; g F
- return this.message.split('').reverse().join(''), s, ^. M# H2 m% H8 m
- }
* }6 C1 d+ F/ F3 I j - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4! y8 R; P. R5 h: R% j
- var vm = new Vue({
, y$ N% `- v, `1 {2 p0 i7 n6 ~ - el: '#app',9 m& V1 |& A4 p- d, A2 c2 o* j
- data: {
& w* i4 C. J' |" F/ O - name: 'Google',
5 E% A, ?8 W* J0 j r - url: 'http://www.google.com'- N% a6 e; Z8 f1 d, L' V
- },: I3 E9 n4 G: x% G" t
- computed: {3 @3 i0 E# J& }0 e& J7 V( K6 l' k
- site: {
6 K. s5 d6 m- q1 @; i3 n - // getter6 [3 ~5 W: O5 I* z
- get: function () {3 R' I, Z$ t# H0 d8 f
- return this.name + ' ' + this.url- Y" j/ N; z% z; {, A: z
- },
' i" r* N" g/ l/ y9 S, l N4 ` - // setter
1 N: A+ ^4 X! r$ c! M1 n - set: function (newValue) {
4 y$ F3 ^8 ^% h/ T - var names = newValue.split(' ')
: P8 M+ b9 M" K2 @. C' B4 k- O - this.name = names[0]9 t9 S7 \9 |% f- L
- this.url = names[names.length - 1]
! V) Q0 I) P4 y0 f( ^; f. g - }# E& _) n: A5 { N7 r
- }
' ^4 C( t) v! o! t( g9 \' V - }
+ E) ]3 P' x" g" p - })
6 Y7 {) l& H# V8 ^, R7 Y - // 调用 setter, vm.name 和 vm.url 也会被对应更新
$ L. v/ ~1 T9 v, ]* s - vm.site = '百度教程 http://www.baidu.com';
3 ]3 D3 e( r4 s* b- T$ _6 D - document.write('name: ' + vm.name);7 N! i# F% c3 h) H4 o% \2 _; [
- document.write('<br>');* x+ M3 F L4 ]" ?; R2 o0 C2 Y
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。" d1 b% ?5 f {, h
+ S( I6 \( G* |) n" |, ? y' P. P" b' z/ W
: ^* b( Z) a8 [: Q8 C0 U" S
! L7 w2 Y/ Y' J2 @5 ?9 m
8 T5 C5 [3 P( w* ? |