|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
. G: Z/ D' {! g/ `- <div id="app">" N! T5 _- F* J
- {{ message.split('').reverse().join('') }}
& r+ l! A+ Q3 j - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
U W) O7 h8 @2 u: Y- <div id="app">
8 |2 o( f% M0 A) S) [* N - <p>原始字符串: {{ message }}</p>
4 d) J+ a- A& [/ F- W! |- Q8 \1 @ - <p>计算后反转字符串: {{ reversedMessage }}</p>
B! ?* ?9 s6 u! O - </div>
0 m6 a( u/ b# t, B -
c7 S1 b0 f! V; A - <script>
~2 L( u0 x! N: y) o3 E - var vm = new Vue({
* b2 V/ F3 @- ^* Q5 ?' l - el: '#app',4 D7 P" Q" ^* J) H
- data: {
5 o( x. }* U* o, w( l4 y5 J - message: 'Runoob!'
7 g" |, l# |6 Q5 }' u, v - },
/ |: m" `: P3 l a8 E5 F - computed: {1 z; H* j" k# `! |
- // 计算属性的 getter
, q, R: r) m o+ l$ w; } - reversedMessage: function () {
# b/ g2 P y- y* j1 q - // `this` 指向 vm 实例* p9 r; \" l0 K6 R/ w/ \' k' [
- return this.message.split('').reverse().join('')% H1 }+ X: `( C* X2 j# c
- }
+ H2 }! I9 k0 I9 d! A - }
0 f/ a) d" t4 X+ g" A) M6 M - })
3 T9 X# l1 }2 m2 L$ s6 A - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
# C) z- T& b# ^) W: x3 U+ w- methods: {' c3 y5 G: l( {2 Z
- reversedMessage2: function () {
% U6 U& Q% W. Q/ u @ - return this.message.split('').reverse().join('')# E0 h: r! y5 ~/ a$ N: P1 v
- }
% k, z. Q% W" J3 w1 y$ ~ - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4 v* G+ n6 x6 B& \5 `! u1 o- F
- var vm = new Vue({& C S* ~; y/ O
- el: '#app',6 _/ G+ y- j1 r( J* c1 v# ^7 h
- data: {
& J* z+ L0 B. _ c+ h: h. b% t - name: 'Google',* P; J7 f0 B3 {: n
- url: 'http://www.google.com'
4 G4 N, D, @% R# \. r - },
4 x6 V2 ?: t$ U- [# k7 C3 A' d5 Z - computed: {3 U0 z, z" s( W9 F o
- site: {8 @( J: A! t9 H. |8 H# \( m5 N
- // getter
0 k: |2 X* A+ Z! n - get: function () {
' e4 E) \2 R% }3 N - return this.name + ' ' + this.url
& x! w( _( }7 `0 j/ ^- j3 U - },
: \' P- v q+ ~+ L* u; y/ J+ [7 S - // setter. Z+ r0 v8 \; a; B0 t+ Q) i/ f7 a
- set: function (newValue) {' E* z1 t$ p r; ^' I+ f6 c( w
- var names = newValue.split(' ')
; C- w7 z# A6 L9 W9 V3 } x' O - this.name = names[0]% i# \4 L6 o- H; w! S4 F
- this.url = names[names.length - 1]
. u9 F9 z- S4 d c" ]* z% ? - } t7 u+ C' k' |/ W: m8 t
- }8 M; Y8 ?" d5 M1 K, [
- }% |, f% ^" V1 z" C: c
- })
8 M" P, f M2 f' r/ q - // 调用 setter, vm.name 和 vm.url 也会被对应更新8 s8 o# V6 C& H; y; R6 |; a2 `
- vm.site = '百度教程 http://www.baidu.com';
% U7 g& A5 M( t+ z - document.write('name: ' + vm.name);
2 n+ @, b( x: S) o8 r3 y9 B - document.write('<br>');
9 _$ t/ v$ s& F, E - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。- G% \' N; I& u7 Q2 q# f
5 }+ s# t* ]9 |, W7 |! I" M
$ O7 ~( N% R9 \0 Y8 K4 u
! F; \/ G8 Y. d9 \& e
4 U$ V0 m3 c v, x% Y' U1 w0 h' k! z2 r5 m* e
|