计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
+ i. q K2 ^ A! l" [8 S7 j+ w- <div id="app">8 d4 u8 N2 d1 d0 \
- {{ message.split('').reverse().join('') }}
/ L x' c% s4 j+ l( }5 p. n - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
# k" \) j! L0 s! c. Z- <div id="app">
$ J3 @8 c! x6 X1 ] - <p>原始字符串: {{ message }}</p>
* H/ E+ L6 F& J5 C - <p>计算后反转字符串: {{ reversedMessage }}</p>
' v9 ^; x9 d: o* e - </div>
+ @7 Q: v+ ^+ `( E, q - 6 Y; F( _5 @; y5 o% `6 v0 J
- <script>9 e" h) Q |2 g3 K2 s
- var vm = new Vue({# T! h. w3 K$ y; v
- el: '#app',
# H4 p/ L0 f. n. A) g - data: {
. D3 j* u% Y7 X0 _- c% n; O3 B - message: 'Runoob!'
- f& l U+ H8 p4 ?9 N# U; w - },
6 @$ B! N# _( G' B% h" U T - computed: {
, M& h0 O# W, ] - // 计算属性的 getter( J \" s" Z4 i; w) c
- reversedMessage: function () {7 L- H1 I& Q6 g+ H& G
- // `this` 指向 vm 实例0 k0 h, v+ Z2 Q4 j
- return this.message.split('').reverse().join('')
& |* G7 _/ R. C% q: T% a" ~ - }
6 e6 C6 X3 Q& b [( B - }# Y8 l8 p) P' r% M Y
- })- Y0 |2 _" y5 K' e4 E$ N
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
/ ?: L9 ^" j& o% z- methods: {
/ I8 `( {: T4 \) D+ y( m - reversedMessage2: function () {( T' ~0 P3 @ ]/ D2 {3 g* c3 V
- return this.message.split('').reverse().join('')) q; W) n' T8 d n, U1 x3 W4 b
- }( R7 w1 |6 H. R; e w5 p3 K
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 49 U q# x" a, J) M( O6 s7 |4 m$ ?2 H
- var vm = new Vue({
' Y- J6 b& s% Z( n8 k - el: '#app',. z% F$ r: {; z# x7 V
- data: {
2 f5 B; e. `3 b" ?7 L& y# x. E - name: 'Google',
+ p+ a! G3 I) k) N" v8 Z% {# g- o5 } - url: 'http://www.google.com'
. ]& c1 d, v7 a4 \ - },7 x% X" y2 u" q7 d% e, E
- computed: {& [) I+ G" z5 r8 }. u6 i
- site: {
8 \( M, N+ ?7 B- G - // getter
' `$ _5 V: j. p; Z8 ` - get: function () {
& ^; R, f- Y, U3 _% z - return this.name + ' ' + this.url
6 ?! w1 y# I& T - },* H6 r. e) I) L
- // setter
8 T# F$ T+ u; Y - set: function (newValue) {/ e) B4 {: j {' N7 o, O0 Z* _
- var names = newValue.split(' ')$ v2 I5 R& p2 x
- this.name = names[0]$ I7 h9 U8 o5 o
- this.url = names[names.length - 1]1 G+ P* ]) k3 U$ g8 v/ f8 y
- }
/ z. Z& E% i0 J4 N( E - }! i" U6 l4 ?" p1 t8 x
- }
2 x# P9 p, v* d0 C) ^0 b5 r5 E - })
; M3 m. n1 W3 F: t' P" O: B - // 调用 setter, vm.name 和 vm.url 也会被对应更新
; @& B% k y. T1 E; w - vm.site = '百度教程 http://www.baidu.com';
$ K" K7 F/ q. p2 o: R9 I; u9 i - document.write('name: ' + vm.name);! e b; a+ N2 y5 O
- document.write('<br>');
( l7 k4 ^1 q$ r& v# G; V- o - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
" Y/ N1 R: c1 b( @3 S5 [" l
! [* q2 b! @1 z1 H& ]# K9 i& F8 m' X$ B
3 B2 B) m4 i, m; S; `. g' B, e. k9 S+ j0 J) o
! z/ d# j) ?( e( q2 S
* K+ W* S* [8 {! k& p2 I8 P9 h |