|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 10 |4 K& h" D. X, }% ~1 ~" t4 T3 N
- <div id="app">
0 M) M; a3 B4 _! P7 Y - {{ message.split('').reverse().join('') }}) T4 f+ e( N* I8 O \) v7 t7 h) m
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2 @5 A5 z6 s2 Q1 k6 y3 e
- <div id="app">
/ p4 ~& q+ _1 g6 [( K4 Y - <p>原始字符串: {{ message }}</p>
3 B; A4 x$ W+ @4 [0 G4 h1 t - <p>计算后反转字符串: {{ reversedMessage }}</p>3 M7 p& q" \: o4 _0 s! y
- </div>
8 {( @/ Y' l* I0 ~ -
5 L7 V0 ^) K! `1 m! i$ [! s - <script>6 e& S$ _# z6 s) w. Y$ Y% D" A
- var vm = new Vue({6 S% B% q2 E9 L8 a8 `5 E
- el: '#app',: ~% m4 g+ ?( Z( y0 a% W }; v3 w
- data: {
# f4 @7 L# h! q1 g7 U& J; x - message: 'Runoob!'
1 V3 b9 Q. Z1 P! ^0 a; r- \ - },
9 e. Q+ T/ b7 `* m' R; @ A( V - computed: {
' P* D4 q q( W* p |' r/ }. C- R - // 计算属性的 getter
1 ~/ ]0 T3 f$ p, Y r2 \ - reversedMessage: function () {- N* j5 ] g' \" Z' x% H+ q
- // `this` 指向 vm 实例
7 R& S5 Z$ ~" X$ B& h6 l( n - return this.message.split('').reverse().join('')
+ {+ C6 [3 W o7 U, s - }1 D$ l3 T6 W3 u' l1 Y* G
- }
( L6 [2 _6 J% O5 K5 o/ R# }0 x - })' X% ~- T$ N8 _
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 38 f. T1 k: X5 x0 N
- methods: {$ s# Z) h6 G, f7 S$ V/ K
- reversedMessage2: function () {
( n g L8 {: t - return this.message.split('').reverse().join(''): \3 M I4 S& P+ B: B
- }, }2 N) J; }& M
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
, e* n) x. }% r0 G" c# w- var vm = new Vue({
$ d S2 K5 b( Q4 a! O4 `2 O- W - el: '#app',4 g8 y% Q( ?7 S! f! c; o
- data: {
5 R" k# A! K" { T4 {& I - name: 'Google',
$ x" j, }( ~$ y" w, K - url: 'http://www.google.com'
4 Y" D( \+ \ n1 u" s0 k2 _( m4 l - },1 \, M4 x% N# y% j, Y! X# ~* U
- computed: {
- A4 {) Q0 z. J7 a - site: {
& r& u2 V4 S: e& n - // getter1 `+ G) U9 W" f( O# r5 |$ O) G% [/ O
- get: function () {
' E& ]( U+ T4 |2 }: n. D& s. Q3 D - return this.name + ' ' + this.url& _$ o/ _1 [& }
- },
+ z) ~! v# ]8 u; T! x- c - // setter" C2 f5 b9 ]( r, l6 R% J
- set: function (newValue) {) G3 J% m8 q( p$ m7 G: m X9 R
- var names = newValue.split(' ')/ x+ W. |, P0 \* W0 T
- this.name = names[0]' X/ \- U t1 k: i3 k6 ]0 j% }
- this.url = names[names.length - 1], D0 X4 |0 }# v$ L
- }8 a, e* V/ c1 |+ Q4 ?
- } g. D9 A6 i0 E
- } y2 a+ |0 {$ N# ?' M3 m( N' p
- })' a$ H5 C0 B7 n {' {3 n
- // 调用 setter, vm.name 和 vm.url 也会被对应更新, D8 T; T3 S: M- r
- vm.site = '百度教程 http://www.baidu.com';
0 f. I# r8 u; L - document.write('name: ' + vm.name);
5 }; _9 ~. C; j$ z. c - document.write('<br>');
% @4 P4 I( n/ x a2 Q6 c - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。% Q: r9 m7 B. [8 L
- B4 j- A3 Y* D8 k( I j+ F: k
1 g5 T4 D- Y" W9 }( O. K: z
! l' _. u2 N% @, F8 O% j0 s+ D7 C. r4 p4 q! F( I v6 i
* d$ F- @" |, q' H% o0 P
|