|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 19 k+ f2 Q# O5 a
- <div id="app">$ Y( P7 H+ U* {! r1 X
- {{ message.split('').reverse().join('') }}5 D1 v; g5 p2 r' g) x" l
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
0 M1 c: {6 D2 R1 b0 T0 Y+ S- <div id="app">
- Q& e( t8 _* I; H2 c9 p8 C. v' v - <p>原始字符串: {{ message }}</p>
! [+ c2 `0 i- B8 V+ _; t - <p>计算后反转字符串: {{ reversedMessage }}</p>+ i5 z4 R+ Z6 i- h5 q t& |
- </div>! g2 i/ X, |3 A* D# b8 D: ]
-
K0 A; B% c9 Q' q0 ^% h - <script>$ B0 W* G6 p) t+ A
- var vm = new Vue({
0 ?1 R/ ^$ g1 ?7 M+ s6 a* W - el: '#app',
( ~7 o# ]2 q0 e; S8 Z# h - data: {
6 `9 p9 K) p, X( X - message: 'Runoob!'
3 t0 Z7 O& T8 i: I! c1 Q' _$ E - },
4 V& x8 |( X2 m& {8 g0 G - computed: {
5 o+ G+ t6 j/ p0 N, `. H - // 计算属性的 getter
; [3 [5 I) Q- `6 z6 \ - reversedMessage: function () {
( d4 u3 Y# p9 i O% P) R4 y - // `this` 指向 vm 实例4 L- t! x' V' g# c8 ^, n
- return this.message.split('').reverse().join(''): B3 h3 h3 M5 e7 k x E$ }
- }7 g8 e' i, H: Z( e1 A4 z
- }
# U+ |6 e, g# K2 e% u% v! F - }) D0 x2 w! n8 d
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
% ]$ p) ?4 O! K/ |! Y- methods: { v5 k$ a) }- o0 w% W/ g. P
- reversedMessage2: function () {5 }9 ~$ `% t! e
- return this.message.split('').reverse().join('')" ?( t. |* L; _; e
- }! E+ x. }, F# r4 B4 Z/ h
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4, c6 O" p" R" f% c+ Z/ P. R
- var vm = new Vue({
+ Z6 J# I+ o% Z! A8 @ - el: '#app',
& `$ F3 p4 S7 k8 X$ m/ d - data: {1 U6 F0 h. [ f* p
- name: 'Google',% F; g ~) D1 r$ B$ c/ D
- url: 'http://www.google.com'
+ U- S2 Q* {; p* g - },4 S( R* U8 L9 v
- computed: {# u$ ?5 e1 Q9 d' x! ^
- site: {
) j3 i3 ?/ l& A! T - // getter
5 b+ j. O+ I9 d- E; i. w" n1 w# n - get: function () { M8 N/ \+ l$ O( I, I8 R+ D) o; s
- return this.name + ' ' + this.url: q& @- `+ O( l3 s/ }
- },
6 s1 B* y S( _+ p - // setter
) u" L' g* W$ E, W% A! ? - set: function (newValue) {+ Z9 L1 V6 z' l1 [0 n; v8 k
- var names = newValue.split(' ')- V, B/ j3 x ?* z6 K. V
- this.name = names[0]5 W# j6 z3 a( o+ \
- this.url = names[names.length - 1]
; @- s) X* F0 {' q6 K5 a# t6 E - }2 v- B, J0 b1 F, T; ~* y
- }& X. P7 @' `$ X7 A0 d
- }
- h) u+ U# @& C* S - })
% |9 A' C4 k$ y3 ] - // 调用 setter, vm.name 和 vm.url 也会被对应更新
: ^/ d9 ~1 _# `9 r; ]/ H8 G- m - vm.site = '百度教程 http://www.baidu.com';
; |6 N8 W7 ~+ {1 F - document.write('name: ' + vm.name);1 P% y0 s- Q0 e3 p# l
- document.write('<br>');* z5 W5 {8 m# g0 h4 G
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
) v! X( o; t W0 {0 V* M
& ]; d: b6 L: v( y, L
: |8 O) A* B2 R' Q# Q, x4 [
' z/ N: B3 T4 J
: G! l% [6 A. D. @" F( x7 O; T0 c6 @
|