|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 13 e- s. j. p( Z) x4 ]% O" W
- <div id="app">) N1 H7 E; M2 d* X1 b' S) G
- {{ message.split('').reverse().join('') }}
3 Y( i2 l: P! \4 f, T - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 26 e- G. N+ {4 g+ k- [0 d
- <div id="app">
& F" |, Y. V" X! a) y - <p>原始字符串: {{ message }}</p>7 }. z$ O8 M/ ^! |4 T* k# h" u
- <p>计算后反转字符串: {{ reversedMessage }}</p>; G' n# `8 v8 O0 L2 P" V. w
- </div>" D3 {0 e1 G; q
-
0 ~" \0 Z/ W6 y0 ^* W+ m; G - <script>$ F# _9 E: b/ q, _6 f* O4 W
- var vm = new Vue({
8 r: k7 R$ g2 W: L) W3 Y( p5 N - el: '#app',
3 i+ E& G) A* v4 B7 r+ d7 M. b - data: {
3 l1 m& \( w7 b' }$ x - message: 'Runoob!'9 n. {8 j1 L g+ R0 X8 Y3 u% l, ~
- },
* k1 A5 e; w0 @, z* P4 t x - computed: {" s0 U6 P3 ]% \* ^
- // 计算属性的 getter
: N0 W U5 V8 q. m' a5 F/ k! }( _ - reversedMessage: function () {3 Y; Z/ v; o- k, q! e5 n& s4 \% w
- // `this` 指向 vm 实例
3 w/ L' B. n7 i" X9 Y: z - return this.message.split('').reverse().join('')6 a9 a" i8 e7 L+ ]1 V0 f' N, M8 r4 W
- }
0 {5 X( ?( x2 U" m, l - }
; G5 S, b+ ^! K- C/ @ - })
O- B- U( {( h* y# R# _ - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3! H6 ]$ H' I; h# D, t
- methods: {1 ? c& w! m' s, N$ S
- reversedMessage2: function () {
. K% x# ~9 B8 L5 z2 `0 U1 X E {; q( g - return this.message.split('').reverse().join('')
8 k! c1 I( I- f1 A - }6 |: ?6 s. S5 m
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
& C( x- h% T. }# M- var vm = new Vue({
( L5 C( k2 z1 G) b - el: '#app',
9 i! n; O3 w. }2 v7 z Q; z8 p$ Y" q - data: {8 X! ?9 d# T1 {" A
- name: 'Google',
, ~" |: ?* U* }- K+ j - url: 'http://www.google.com'
' y9 B2 C# w3 N2 A$ h$ G5 W+ S( L - },( ^2 A: O9 q* B1 {; `
- computed: {& a q, z6 ~ r; U# x
- site: {* B4 h6 ^& M+ O' `) m
- // getter d; G3 @" m% X, w5 f" i) r. Z
- get: function () {
! F3 K. F. ]. e3 n - return this.name + ' ' + this.url
, L. _" i- `( w& o - },
3 M8 I1 Z$ @2 o5 v' o/ N - // setter
- K" o( d. T6 C7 ? - set: function (newValue) {; }! `6 H, U( I) g, J
- var names = newValue.split(' ')# |8 M! V/ w O+ ]+ ~0 v3 u( c
- this.name = names[0]0 y7 Q$ C. S1 Y1 a0 E. R7 ?8 e
- this.url = names[names.length - 1]
: L b% B$ n7 L - }
- @6 y) w+ D' r' ~7 E: x - }
! z, q% A- I8 F - }
0 C. e, f0 g5 R$ R - })) B3 N l$ b( x! M, \. H+ W
- // 调用 setter, vm.name 和 vm.url 也会被对应更新' X/ h0 m5 T* O
- vm.site = '百度教程 http://www.baidu.com';/ X) I1 S% y* O' Q) J1 M2 _1 r/ _
- document.write('name: ' + vm.name);
! U6 k% ]! X* a* ?: u# G9 P - document.write('<br>');
1 D$ b2 d7 ^9 R - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
; y, T7 J( Q5 \! ]
4 J9 c$ ~& } h2 E7 G2 O1 [
" I3 q. u0 v' T9 C
8 U+ V1 [; C- c
3 V+ k5 m7 C3 n4 S
1 b' J v- k6 {/ v( w/ b |