|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
% N; G8 u$ P% M9 f4 _7 U% N- <div id="app">! O: X& \. E8 L% I# @
- {{ message.split('').reverse().join('') }}5 j& L' I3 X& E
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2+ N% D" I+ |) f+ L% ~
- <div id="app">" |6 B) p7 q. F/ P+ R
- <p>原始字符串: {{ message }}</p>0 Z3 x9 P8 A6 t* ?. B
- <p>计算后反转字符串: {{ reversedMessage }}</p>
6 P3 g( U5 y3 m& K3 f( d - </div>% A A' f4 v" ^. C
-
- c( ~3 D1 _( E* h - <script>, Z7 _: Q0 O, k. h" _2 E2 q! _1 i
- var vm = new Vue({
' g5 H! {' t" Y* k - el: '#app',
6 t* ?7 [/ n6 _6 z2 n3 o - data: {5 y, l) A1 V0 M* C6 r
- message: 'Runoob!'
: o8 ~7 F& @1 s" t - },
3 s( D3 f( Q% h" Q! T0 W$ o - computed: {1 @$ w9 E; i: S, h' y# \
- // 计算属性的 getter
2 H3 d5 M1 z4 Q% p% C9 | - reversedMessage: function () {9 L8 c8 p- n ?7 j( |5 R+ `; G
- // `this` 指向 vm 实例
7 E; m i9 V$ v6 Z G' q( A, m6 ^ - return this.message.split('').reverse().join('')6 q! Y, ], T" w. c
- }
3 I: P7 n# B" q9 ^ - }
5 e1 F0 y, |$ z' I - })
- Q2 u# }7 M [( i: C - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3: T) h# o6 e. s2 ^
- methods: {* d5 i) ?2 L1 E% o# @% b: ]
- reversedMessage2: function () {7 ^/ i$ e6 ] {4 {3 a* f4 H
- return this.message.split('').reverse().join('')
D$ s" M6 ~, i9 ]4 c) \: R; e - }1 ~* O }3 k$ [0 C
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
: P. n" p) x# H0 s- var vm = new Vue({
2 y2 B$ a- y" C( \; ` - el: '#app',
/ ~+ P, z6 j, v0 |3 `6 [/ f - data: {
# [! u [% n9 Z: @ - name: 'Google',
. {! f% x0 u `" t - url: 'http://www.google.com'$ w" _$ F. j3 t3 c% |2 p( l
- },( i9 b% N. h1 T% s
- computed: {# b2 X5 M, g. r9 e) {0 X
- site: {9 {% G4 S$ Z, G$ c- Z( [
- // getter! ^& a- s1 Z% K: l. ^5 {; S& ?
- get: function () {' Z5 y6 C* P1 R8 l- d! f
- return this.name + ' ' + this.url
1 i2 f& u, B( t$ K - },: h% n% l% n% E9 V% _9 l* E
- // setter
& {$ g. s$ S! u* o. Y, O2 a, ~ - set: function (newValue) {. \- ?, r& ?7 V: c) @# l
- var names = newValue.split(' ')
7 B! @) x8 s. Y' r" V$ U' Z - this.name = names[0]4 w# y! u( Y: |8 \1 E) U+ K
- this.url = names[names.length - 1]
, x: _. m3 o9 B- w' p: X - }
# I3 N* [. \- t Z/ b - }
- N& I, C& q! @6 T. y4 E- |& x - }
5 |$ c- O6 k9 p7 t% `2 U - })" E& h0 y# o. U" M
- // 调用 setter, vm.name 和 vm.url 也会被对应更新1 t8 |+ V3 e3 X6 N
- vm.site = '百度教程 http://www.baidu.com';( H$ S' J( [0 N/ f2 I5 V
- document.write('name: ' + vm.name); w- R+ d0 }" T
- document.write('<br>');- q3 L* `! h1 t9 ~
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。, Q* h _) A k. ~( D
( `3 H2 d; Q' {- Q* \$ H% K6 C7 D5 E% {
% k1 I9 v8 d2 N& g
6 {, @9 Z# K0 {5 B/ Q7 m+ |
g0 G- ?, F9 A0 O% V |