|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 13 o" ~5 H, [& q8 w
- <div id="app">
: W. t7 V( q/ z7 d4 s- | - {{ message.split('').reverse().join('') }}
. \/ O1 I2 s2 I' R& d0 | - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2+ M$ k; \; Z: u3 o3 l& q
- <div id="app">
Y) z$ G& E$ F - <p>原始字符串: {{ message }}</p>
, P- ~6 m5 E1 l5 Z, W3 H+ x - <p>计算后反转字符串: {{ reversedMessage }}</p>- D+ v* ]! V/ ?( X" {4 j
- </div>5 B7 u- Q0 _3 ]$ O; G) ^+ P
-
1 Q/ C- z7 \; V* X9 E# g1 r - <script>
' M( P& G) f5 ~ - var vm = new Vue({1 Z$ v8 N& \: ^2 m8 D
- el: '#app',
T+ Z( M* c( h) @0 Z) u' Y - data: {
6 X. E' z8 c. W' e2 v2 B% w' } - message: 'Runoob!'
- x ?7 j- {7 v- o0 z7 `! m8 a# Z - },1 I, q% a- r9 `% v7 g7 {5 N+ d
- computed: {" b% l! [( a, y0 p
- // 计算属性的 getter
8 [( E: S/ O8 e) [6 D - reversedMessage: function () {* L P9 E1 Z/ f- W; b% y) V7 W
- // `this` 指向 vm 实例 o7 `1 Z1 n2 ^- D
- return this.message.split('').reverse().join('')$ D' \0 @( L- ^* @7 D
- }. T# e1 m: H' L/ N) J
- }) I) i9 q* Y' u. Y- X2 }. c- y
- })& M: L, K/ R- v* I8 Y2 V
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
0 i* k w( k5 W6 [+ M8 M- methods: {
, e; q1 g) }8 X, C u - reversedMessage2: function () {1 L" d: r5 R+ N4 q
- return this.message.split('').reverse().join('')
! m& |- K$ Y! m+ j) z, D - }
+ O: }! K( ~' I - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 41 z2 |5 j% g \9 p7 P/ d9 @
- var vm = new Vue({
- q3 Z/ i0 f X2 h - el: '#app',
" i/ l7 A% ^* q6 B. p' |2 s1 ~ - data: {
( d; L4 R" w2 W" r& \# y* l2 w - name: 'Google',
4 r L% L$ W$ ^ - url: 'http://www.google.com'
6 ~- P% d7 y3 L0 q3 D. Z - }," Q7 o4 L" K! B7 k) B
- computed: {" Y0 p9 m, ]/ u. j4 [, C! x: X
- site: {' _$ _! J/ V% P# L- a
- // getter
6 I- {# S; P) {! o - get: function () {
" y% G! v6 y6 T; H6 W9 @. X# n+ B - return this.name + ' ' + this.url; L- x5 [9 L ^/ a
- },
& o2 @( o( }( E5 K M9 E - // setter. M/ W) y; ^7 o8 s$ H9 p8 P2 J/ i
- set: function (newValue) {; Z. y7 o/ E, M$ Z
- var names = newValue.split(' ')
! V) z8 R- b2 C; L" \ - this.name = names[0]0 q8 ~1 [5 `; ~' @6 C5 U
- this.url = names[names.length - 1]1 |: w; j! K& T n, }- ~0 C. S' M
- }
9 Y! h( d8 M' H - }
7 B5 O! T- A7 ]8 P; Q - }
" V) o. M9 G$ G; V. B7 |& O. n+ K - })
) j: m! B% ?4 {: x0 @$ i - // 调用 setter, vm.name 和 vm.url 也会被对应更新
% L" y1 p; C4 Q, a) Z- l8 X ] - vm.site = '百度教程 http://www.baidu.com'; u6 V* @# J! o! X% X- u- O, |0 Y
- document.write('name: ' + vm.name);
- }+ T7 o; T# O/ b% Y" S - document.write('<br>');
K8 k5 l" K3 F9 H; \ - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
1 ]2 [. S E- u3 @0 c
0 E; n. m" F w. Q. i4 p$ Y9 m* m5 }* s. h9 J9 w8 b
: D2 V. W+ C+ v# ?; @2 y/ Y- a1 n1 a
3 l5 Z) r; w: }) N/ H) @. X6 j! j, K- r: H* i
|