|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1% t0 C% T) Q+ ?6 m3 P
- <div id="app"># b' i, D1 E; ^$ y& b6 d4 p0 o# G
- {{ message.split('').reverse().join('') }}
; \/ }8 K& S9 L5 g1 ` - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
9 y# I6 Q; @- [8 ~% v; `; t O- <div id="app">
3 p- z6 b/ g. B, @" e - <p>原始字符串: {{ message }}</p>
7 }& W! L& @" A1 J3 E - <p>计算后反转字符串: {{ reversedMessage }}</p>
: Q- v/ z: u* S6 o& R - </div>7 c5 w0 @7 s) _: G
-
/ Q: I/ ?1 Y; J' p - <script>
7 |# o0 D3 }5 p4 _+ D. i: M - var vm = new Vue({
( g" w+ s8 k; a8 e0 }+ e0 p! o& l/ x- @ - el: '#app',
& T3 }+ o, Q8 h- V7 i# A% S" g2 O - data: {6 [+ w) e/ K3 @1 u
- message: 'Runoob!'
) s) z+ v2 T. d3 S - },1 y* H8 y" e" R' n
- computed: {
/ Z" G3 l, U! s4 s W - // 计算属性的 getter
( H/ d1 R! F& x! {9 e - reversedMessage: function () {- r. F) a+ M0 A
- // `this` 指向 vm 实例 R) D- f$ @/ u3 p
- return this.message.split('').reverse().join('')* ?1 A5 \4 u! V
- }
% z3 [* n+ }" S3 g3 L" D - }
. y* Y/ @% [6 a: l ^ - })
& b0 T! t i% S( n% { P# l3 e - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
' v" H o! Q+ M6 {6 Z* l9 H- methods: {
! s) I- x' E8 H - reversedMessage2: function () {
& O- o/ I; S. A) X0 t - return this.message.split('').reverse().join('')
2 e9 z: J P! f# h- W, C& C - }
5 Y$ \3 c0 g; k- { - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 45 q S+ N* g9 ]3 x' D3 w% ^
- var vm = new Vue({9 T3 K- P. r/ c4 M8 |( ~
- el: '#app',+ o9 @4 X$ Z; O
- data: {+ X5 g$ Q7 d& i \9 {' d5 y
- name: 'Google',
6 A7 N/ z8 c' O" z0 h8 d$ Q/ l - url: 'http://www.google.com'
7 A2 ^+ v9 m, ^ - },+ z- U5 T# K, I% C# i6 d2 h
- computed: {
7 d+ c. j4 C, i- k: { - site: {- _3 d) v8 z/ d% f* n* c
- // getter3 Y! `2 T2 {" K! b6 E9 t& V
- get: function () {
6 Z' `! m6 D) D9 d* I% W - return this.name + ' ' + this.url
! A8 w1 t2 `4 F+ O+ w( @, Y) B - },
. P9 t v6 d4 c% P1 g' p5 ] E - // setter7 F% p6 t5 z! `! F) M; Y& A5 F! X X6 ?
- set: function (newValue) {* _ h+ W) p5 e0 e4 ^
- var names = newValue.split(' ')( `5 n2 ^/ ~0 \( z5 P+ i
- this.name = names[0]
! V9 Z3 G$ u3 R - this.url = names[names.length - 1]1 J% \: u( y1 ?4 l) y
- }
* m3 q) A' {3 F8 e5 v, l - }. n- E- r+ _. y
- }
2 L* W) k v% n: f; W - })( I9 y! d0 B; b3 j, t
- // 调用 setter, vm.name 和 vm.url 也会被对应更新
- m: I \4 l9 z% k - vm.site = '百度教程 http://www.baidu.com';
# } Q7 J' c1 `1 a/ { - document.write('name: ' + vm.name);
6 Z+ H: J$ [( Y3 r8 b7 P - document.write('<br>');3 F! I x% ^% B
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
# U V2 ^4 T9 v# W4 y! Z
& I" w. ~% H/ \1 ^. T8 G D
6 M; F) Q) c3 M" k; g9 a+ b H
# ]! e; i0 I3 s9 j6 _ J' ~* f( n* ]) ]! j# ~7 |
/ {; R V# t L: F
|