|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
/ V5 {; X# ^, _$ p3 Q+ P s( V- <div id="app">1 t6 Z1 u/ N" Q5 ?5 A
- {{ message.split('').reverse().join('') }}# e6 k) ^5 U7 z, `$ \
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 27 p# ] M) g& @* f- v6 N3 j& O3 Y
- <div id="app">
6 \' }$ i0 e% D* F - <p>原始字符串: {{ message }}</p>. Z' t! A3 n$ g" L1 P9 |
- <p>计算后反转字符串: {{ reversedMessage }}</p>2 i& k* ?; |( D* j$ A8 \! k
- </div>
$ S3 I1 g$ e5 ^5 \) y4 i9 Y" T - 6 C9 d$ O: B- H4 z. p
- <script>
' d; k8 @, y: g ^: Q0 g! ~2 V: ?* G - var vm = new Vue({
. K* O, i; K+ k, d6 b3 g2 s - el: '#app',
5 f0 R, O3 J3 l5 @) a - data: {' L2 s# _' _" i+ Q1 t5 M7 U4 J
- message: 'Runoob!'
3 T5 y5 v% G+ K/ h8 ^ - },# e3 i7 L' l! X/ z: y
- computed: {
1 i2 } \ e' m8 x- j$ } - // 计算属性的 getter
5 Z) y9 C j) d. V( x p9 ^4 L - reversedMessage: function () {
2 S/ P- N: _" _$ ^: L - // `this` 指向 vm 实例
/ w% K" o; g, k- f( t" s; f - return this.message.split('').reverse().join('')
, s h6 p& @9 N5 G7 `: G4 l - }
* e7 C% p4 j: l6 x$ E - }' i! }- `) X+ i3 T
- })* B" f( W- W$ V! [# C) z
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
) g E! H( W2 D; D) X; P. v- methods: {$ a% e/ C9 t: Q1 C- G
- reversedMessage2: function () {' F% H- |2 V9 j' [# ^: s8 \
- return this.message.split('').reverse().join('')3 S& l0 Q& ^$ Q8 J1 I4 t
- }
% t ~! L! q b4 o; \ - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 46 K; Z0 c& D( t. g7 O
- var vm = new Vue({# b2 L1 X: a4 x: P/ V5 S1 [
- el: '#app',& R( @6 S8 i3 I. \) {. t
- data: {. R) ` G; m: T1 d
- name: 'Google',
! X/ R" n, F4 ^; B4 Y% t8 q+ \ - url: 'http://www.google.com'1 F0 B! ^/ H1 X" S, s% I
- },
7 r% R- u% W8 K9 q5 V8 f - computed: {
# C2 P$ ?5 ~5 O7 k, M - site: {0 `! z D; F8 g7 x
- // getter4 t1 M* f: S4 @2 p; d6 S
- get: function () {" @+ q* ~, {4 e; ^
- return this.name + ' ' + this.url
7 ^# q9 y- g3 E1 i - },
6 Z7 F4 d) T0 _, a0 j - // setter2 w1 q) I5 T5 K! G
- set: function (newValue) {
$ W5 [! e2 }4 I: c, x* ?7 S% H& V - var names = newValue.split(' ')
0 A# r5 |; R/ @1 J) A- {3 @1 t) E - this.name = names[0]" {8 F8 ~! @: `) N& G
- this.url = names[names.length - 1]
! H$ v4 l' R, ^ - }
2 `/ Y) Y7 V. i6 c, [ - }
# R$ s- _1 h f M - }
# Q. \+ ~% S3 J - }): V7 D4 s$ ]$ L; _" w
- // 调用 setter, vm.name 和 vm.url 也会被对应更新
$ ^! e$ A9 K2 t8 a, B4 R6 X& z - vm.site = '百度教程 http://www.baidu.com';$ M: ~7 Y/ q& f, h1 C
- document.write('name: ' + vm.name);
) d. E$ y# _; C" ^. Z, J - document.write('<br>');
; t5 i7 j) G4 {: x - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
- m4 {$ B# E/ c# N8 v
. Q- P9 Z, w) x Z) d$ A9 k2 h/ m2 d0 u6 q
( T1 s! L* A! q+ ^7 |) N9 v X
1 ~7 L3 t$ J: a; X2 ~5 |$ d+ l2 \8 ~9 J1 X5 ^8 ~% F; u' E
|