|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
0 @1 o& R9 h5 U0 b! h9 l E9 y- <div id="app">
$ z3 U- o8 C* C' O$ a/ r3 d9 O - {{ message.split('').reverse().join('') }}
' l; X* @0 E! M6 r$ E5 @! a+ R - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2% D! B& V9 Z9 m) n8 z" x" s- s
- <div id="app">
5 }* J* a6 Q* G4 q+ i) P; @8 ^2 E - <p>原始字符串: {{ message }}</p>
- ?; G' ?9 Q* N0 F- U* Q0 Y; z - <p>计算后反转字符串: {{ reversedMessage }}</p>: F' |6 D& P2 w' D
- </div>; D) k) }( X' z V
-
1 C/ f( C" v- f- a3 s - <script>
' R. k+ L. k6 v# ?) p p4 A2 K$ b - var vm = new Vue({- o* I6 E& f; ^9 W
- el: '#app',
" S- {# X$ e/ j. e4 B; C# u - data: {0 } C- B' A) B5 ^
- message: 'Runoob!'$ w2 s% E0 m. l' B! A5 _
- },1 `6 M2 E3 q- _/ y S2 E: S; G E
- computed: {
& @4 O5 [1 ^* i1 b: { - // 计算属性的 getter
) u5 X/ X6 X) O9 e$ f U7 ]& D$ T - reversedMessage: function () {5 [& e- H) c' J' r0 U( t3 \
- // `this` 指向 vm 实例. z- e+ a8 T* h
- return this.message.split('').reverse().join('')
7 v! [/ U# H% |, w - }; j0 t+ V, L, y
- }
3 x) V+ H* O* A" ^) H - })! u+ n& |; t9 `0 m3 D4 @
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 39 q. F; G% J2 y, r
- methods: {9 D2 O- Z1 h0 J( @, L2 g2 i
- reversedMessage2: function () {
' f& f7 L' J( t - return this.message.split('').reverse().join('')
+ U% V! y: H! z. P - }, r/ z' x/ m% U: H3 G
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
3 W S# A' E) L% v- var vm = new Vue({
% S2 F; O* s0 a. | - el: '#app',
" w9 o, a0 o0 @! T5 l( C, U - data: {
9 m+ |( M0 u- J - name: 'Google',
+ d; A5 J1 r1 y1 \! Z+ U# e+ ? - url: 'http://www.google.com'
' m9 _. w3 q% E - },
/ x F9 k4 P; D3 a$ a9 Q1 @5 w& C - computed: {2 n" m6 D+ z6 r# e8 v5 b# n) o
- site: {6 S9 N. c/ m% h6 g9 s
- // getter! ?+ ?6 j* e+ C6 K, Q
- get: function () {( ]$ ~# i4 _! L; F+ n* |+ s
- return this.name + ' ' + this.url, o! k2 m- q$ v% L; Y
- },
2 ?% Y. E8 A7 X: l0 Z' v$ S1 [1 m6 | - // setter. l& J6 L; w: d/ s& j
- set: function (newValue) {: |% ^8 k. H8 @# d& x
- var names = newValue.split(' ')2 L; ]' ^' e9 g8 N' X8 E, b7 s* e
- this.name = names[0]
7 r$ v% z6 V; ?5 H; \; E - this.url = names[names.length - 1]
* K0 q+ [# |2 s7 e$ p7 @& k( q - }2 r4 z1 Y* c6 s! N) B, Z1 W }6 @
- }) I7 c7 P2 {* q0 d n% C
- }& Z1 i* b! x0 L1 T2 W0 Z. E
- }); R; l7 g9 j. t, V& ]; U. O0 @
- // 调用 setter, vm.name 和 vm.url 也会被对应更新, M! V) T+ K# q8 ~ F+ J9 t
- vm.site = '百度教程 http://www.baidu.com';2 T# [7 V& K4 X# x/ C/ }' n1 X
- document.write('name: ' + vm.name);
; G3 P/ d' d" ^, N c" h - document.write('<br>');% y( N( ~% u" Y& t0 L& Y6 g: Y
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。8 R1 F( v- X9 f/ R7 E0 C8 O7 n9 t
( E* N, n& f- ?2 [) T" [; K* K* W( h- T K4 o
; z" U5 W4 x7 b' a: H- y: g+ l( m6 U+ J! B
' R$ Q9 D7 G8 i- m" E+ P( y# L' ?/ W' h$ t' m5 J1 M
|