|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
; S3 R" W0 w% b0 S- <div id="app">" x; C* U1 Q2 L! o# @
- {{ message.split('').reverse().join('') }}
* P& X2 e) j8 o8 L4 R3 s% J4 x - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 27 k1 t$ ^' f9 Y$ b; M9 a4 h5 e( r
- <div id="app">8 V |: C. D' R9 B, N* K
- <p>原始字符串: {{ message }}</p># D% Z# q: l5 q2 S$ ^
- <p>计算后反转字符串: {{ reversedMessage }}</p>0 d R% b a9 Z" p; B& @; {: D
- </div>* j) q. f A E2 S: M! a) s
-
, X, ]+ _' w- U" ~; J4 E0 {; W - <script>7 x5 M U' m p+ ^8 Y/ `, ` W$ s
- var vm = new Vue({
7 v! Z6 r! o" @, v0 d7 b - el: '#app',
2 `, f) K6 C9 p7 K - data: {& R. k% y/ A+ t ~* ~: L0 Y9 @
- message: 'Runoob!'
k+ x# d, C* Z8 I$ ?) x5 _4 [ - },
, @! v. E% `: ]6 y; ] - computed: {4 ~! T% B, `1 _0 B
- // 计算属性的 getter% v D& `! P4 J9 v Q
- reversedMessage: function () {
8 W6 u1 v g h! \& i% A- M - // `this` 指向 vm 实例
/ d' \) |% y& ?" L - return this.message.split('').reverse().join('')! i, N+ A- O9 i' E1 q
- }
3 G+ S) a# r& C+ b8 O- n! C: c - }
- U, C6 B( G) ]$ n+ A$ g - })
4 r! W( L8 U+ f* @( a - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 34 M( x" I/ I5 d& R) q# [. P) B
- methods: {
. n+ T- h5 v* ^( c0 a$ X - reversedMessage2: function () {
4 m* w' k ?) \3 o$ I! D - return this.message.split('').reverse().join('')
9 s5 r9 \3 U4 @: _2 `$ I% p2 s - } d% U* Q- B) y( z* K6 Q$ |
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 42 m: z7 \2 [, Q
- var vm = new Vue({
" e; C1 B5 z, r. z - el: '#app',
) Q G# q0 |6 l - data: {
+ H" f D U1 a# T% K - name: 'Google',
# p% l1 I3 x. x8 C3 w( O9 g9 O - url: 'http://www.google.com'
( p9 a+ d) m4 h1 J. e - },
o4 _& i" Z4 _# i! l4 ` - computed: {
( C9 l" B% \8 P# C) i/ N5 t( v - site: {! z; \. _: \* l1 r# ~2 |
- // getter
" R5 @% b/ N2 i# Z5 @, Y - get: function () {
( l% T8 ~% n$ w+ r - return this.name + ' ' + this.url
3 }: `) M6 m( e( { T1 P G4 O! ~ - },* ^0 W1 x9 q" [& I4 G4 P v" m& `
- // setter8 b& M, Y* b2 n8 s5 U I5 w9 \ d
- set: function (newValue) {
) l7 I1 Z8 G' Q% ~" s - var names = newValue.split(' ')( s8 a& B* |2 Y+ o) R! W0 h; t
- this.name = names[0]% s$ e3 u' y( ]* b v6 s' U4 L
- this.url = names[names.length - 1]
q( B; d. K. V' h6 W; I - }
& p* n8 @$ }0 `( n* @ - } m( F* L7 B( @
- } w. H2 x, G2 A# J* A f
- })( M2 C Y8 Y3 @. s7 a% S
- // 调用 setter, vm.name 和 vm.url 也会被对应更新
5 I$ X `' S; E* ` - vm.site = '百度教程 http://www.baidu.com';2 p7 I) U( W6 G4 N
- document.write('name: ' + vm.name);: N# G5 H0 U3 L4 M
- document.write('<br>');
7 V( K6 Z; T# C* u0 T" i - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
0 c$ \0 ?. F8 J; v
1 r& `. q" r/ a- o c
2 [5 ]9 p# ^! B) O7 f( L& P
/ N1 D1 q% y- S; T' J& ?! m# @) I3 _) B+ l' R1 h
3 R# N. y) Q% S! E6 E
|