|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
1 u! v4 i" D4 T$ z- <div id="app">+ h R7 m' p- B( l- o6 ?/ L
- {{ message.split('').reverse().join('') }}
- H5 l4 ^- O! c' c - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2" M" h, z. i" P* D0 L3 Y8 z! W
- <div id="app">
b" _1 \6 I2 d. d8 O* p3 G/ K - <p>原始字符串: {{ message }}</p>$ Z/ z* H, {, L
- <p>计算后反转字符串: {{ reversedMessage }}</p>* e% _8 Q$ h+ N$ r" s* o
- </div>
* S7 {: {; E0 k4 x, }: |4 a -
0 K: A7 d1 B" D - <script>
' @+ p" n( C0 B% ~ y" {. S% [# x - var vm = new Vue({/ i1 P; E1 w2 S$ |0 O
- el: '#app',; @: g% o& [: G6 C# J" `) u
- data: {
9 p/ H: S" ~$ [ v% @ - message: 'Runoob!'
& k! U0 t/ _$ P/ @0 S/ F - },/ c# Z% [/ s1 O0 k2 q6 Q. G/ Q4 Q- |
- computed: {3 l2 ~" |" X4 F' R5 B
- // 计算属性的 getter
5 F' {: e& v) @1 S& u( j - reversedMessage: function () {
$ W4 d* O+ z/ |3 c& P% P/ s+ _' b - // `this` 指向 vm 实例
4 |- Z- t4 F$ C: \1 K# S1 _! v3 ? - return this.message.split('').reverse().join('')
8 J# K7 }& C) r7 o - }% C; h$ j3 r1 ~- e
- }* r& E: N) x% k7 _4 `4 Z
- })
1 l+ r- C3 v. o. `) f: c; W - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
9 r2 D, s. M9 B0 l- methods: {/ J4 J. Q0 }+ Y1 U: o+ c8 X
- reversedMessage2: function () {
! C# C; y: C* w) f - return this.message.split('').reverse().join('')
$ m) V8 U: s- h - }$ t3 E0 L; z* r
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4/ K+ b1 V) p% P0 X: a
- var vm = new Vue({# G n/ C0 N3 d+ W/ O8 p
- el: '#app',) U1 j- W) ]+ y! j" W: Y
- data: {4 ]) [, [+ q b/ g+ g" k; t
- name: 'Google',+ M" k% h( E2 G. W; `( Y8 V* _
- url: 'http://www.google.com'' i& O6 u" z2 H7 w+ }1 N2 v
- },* x9 H- d1 K+ b0 i' G' i J
- computed: {2 N: F' s( H. }! Z0 T
- site: {
- I: l6 _" r, d; b" h Z - // getter
& G1 A) `' g [ @( J. I/ v - get: function () {" i' i; k& d$ s" A+ s9 f
- return this.name + ' ' + this.url' |7 S6 W) E& Q- E n' ?3 }
- },
8 w$ A( n5 h$ a4 }# Q. h2 q7 ^ - // setter, s' S5 P, Z) K6 y/ [. w* h
- set: function (newValue) {
3 u% T# Q/ }7 \ w9 k7 N - var names = newValue.split(' ')& J- [/ s6 {, T) A c) E7 w
- this.name = names[0]8 u" Z" j! r5 k0 r6 s
- this.url = names[names.length - 1]6 p- v$ m( E: V0 F) l
- }
7 q# c! g% }* D8 R- S. g9 c6 C - }" q i. y$ v1 X' e* k, E; m: @
- }
+ l5 l" i- Q+ x/ W - })0 t$ B! p6 d1 L3 `3 F6 V0 j
- // 调用 setter, vm.name 和 vm.url 也会被对应更新% z6 E6 ^( m2 B1 m0 u
- vm.site = '百度教程 http://www.baidu.com';
+ I, Z+ q. S& C" r E" x+ G - document.write('name: ' + vm.name);% d5 o) U8 P$ s: h
- document.write('<br>');
0 @) Q6 ]. N6 Q/ a* e - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。" A! Z6 N( K& V' w) ~4 O
" o4 _5 U3 |( Z+ C9 |" j
. d% B) g2 J" \7 ~5 Q( K) ^' `
2 x$ K0 s8 o/ B% N3 `* N) f/ Z, T+ T( ~& E+ b
% s. q; a( o0 W0 D
|