|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
6 h1 L! Z* O" X: b- <div id="app">' @) ]% u) L( J# ]/ u
- {{ message.split('').reverse().join('') }}
, L K* X! [7 ]1 Q1 B) u: w2 S - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2/ E! p# g; X! }. _ s
- <div id="app">
. ?$ _- O. |. q: u5 G+ r" N - <p>原始字符串: {{ message }}</p>
+ M7 P1 X. T9 \& W) { w0 N; i - <p>计算后反转字符串: {{ reversedMessage }}</p>
( u9 y3 W% D: z! R3 [; K, k. F - </div>
" _* W" F k5 h" ^) ]4 @2 n$ F+ l - ' Q" X) d' J8 y5 j4 S2 `- v
- <script># g( u3 P8 F; ~( H' O: A8 D
- var vm = new Vue({$ }) }4 ?' Q9 R; [( B6 D1 @
- el: '#app',+ F: w- d2 X! |6 B% h/ K. J/ `
- data: {# I* u( T n9 S
- message: 'Runoob!'
9 ]; g P( x+ g$ i2 F - },
9 g, q3 \( N- R2 ]* f) V - computed: {
2 v$ x) n/ F1 q* A2 h7 i - // 计算属性的 getter3 s. o* z% U% g, D
- reversedMessage: function () {
% l( @# m' E- p* C# Y `0 D$ p - // `this` 指向 vm 实例/ s* }& u& @. N. U+ g
- return this.message.split('').reverse().join('')
+ [+ g1 u6 p" s3 u - }- s! U7 t( N/ U( K. D3 X- n* x
- }) Z9 E- X# u9 v9 L2 V$ ]
- })& I" @' Y7 o2 I( Q. i2 [
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3. c" i* V3 C4 I/ M6 g
- methods: {
1 `9 ]7 f' G/ O - reversedMessage2: function () {7 Z) d5 U- X9 B
- return this.message.split('').reverse().join('')
) B8 r. R0 {$ R+ _$ P% s - }
8 A- g# m2 m$ z3 g' R2 P; T+ A' Z - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4+ n% D- z2 Y$ R" i3 P
- var vm = new Vue({3 `: _- U: L3 T* e3 [
- el: '#app',
$ m7 X2 o2 B: E$ X/ j, q - data: {
* [3 e. G. ?3 s2 r. \ - name: 'Google',: s7 B5 t* i/ v& h# C3 W
- url: 'http://www.google.com'' o4 O- j0 v" s" h' l6 y
- },
, g7 P$ w. J" Z7 K - computed: {
6 \" H. Z3 [: p - site: {# U5 t z" |* m9 \
- // getter6 ]8 R1 X+ \ w: ~' K6 j7 e
- get: function () {: M. P9 J" {+ H* F3 e/ y6 w
- return this.name + ' ' + this.url9 S, L% ]$ P- w0 |' K/ V
- },& }9 y3 M2 `5 m! O1 x/ T
- // setter, e% ~" o& ~5 f* `; p
- set: function (newValue) {
4 T2 z+ n7 J# X2 X' v - var names = newValue.split(' ')
, a" I3 J0 }) }9 K - this.name = names[0]8 J6 T6 V2 j( v- S [; d
- this.url = names[names.length - 1]7 F0 L% o; i* F6 ~$ \: O c- a' F
- }
* G4 Z- S D @ - }
2 P9 Y; S' C$ `' a1 s3 z" L- g - }
" n5 u- J4 T' O% X6 @! I C! O7 ^ - })
5 J( H* c. ?: K% p- @7 a - // 调用 setter, vm.name 和 vm.url 也会被对应更新; Z2 W, d+ d" Y( l4 S; O1 D$ K7 \% l/ y
- vm.site = '百度教程 http://www.baidu.com';
6 s! C* Q* g. M7 e3 A# Q - document.write('name: ' + vm.name);
. x& C6 b4 w7 J% H' @5 ^ - document.write('<br>');
& l0 R x0 O2 _& w$ x7 d1 h - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
" m& x1 x& i; S& ]( \
0 r P( C0 l* L1 s
3 p3 h# b+ i6 Y6 s
2 l8 I) I8 V8 H; a
, ~& M( ^% b5 `$ v; c
0 W, E+ o* _* Z7 t6 d, \
|