|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
( r# U/ \/ I: R. s* s& q$ B- <div id="app">
$ F# o$ ~4 g8 H( i - {{ message.split('').reverse().join('') }}
/ p1 X" q) ^) {3 n - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2( D5 G; L( D v+ z/ Y
- <div id="app"> n$ W# B' {% e( o" S# o
- <p>原始字符串: {{ message }}</p>
/ y4 v, K$ e1 T! X, o" C - <p>计算后反转字符串: {{ reversedMessage }}</p>
, O( @0 t; M1 c2 G# f, i5 o0 j - </div>; X4 y$ A. c& v: l3 S5 R( V
-
d1 b9 R2 O; N - <script>
7 @ K" q( y% Y, r* _5 s, z, B - var vm = new Vue({# V, o# D, a u- J* C7 g% n. `: r
- el: '#app',
% e, _7 a* L' C/ m0 M+ C - data: {2 ^( {% f( \* s/ h; g) s) Q# f6 V; u
- message: 'Runoob!'
9 u$ t9 i# R0 U: y6 d* @& y - },' J5 o' h3 Y9 o6 a
- computed: {! F6 {% L% K9 _& B- H
- // 计算属性的 getter
& o3 h, y- w- M! Q - reversedMessage: function () {& _ n7 x/ t4 D8 M% m
- // `this` 指向 vm 实例
+ a8 D; l: U# W* q+ U1 F - return this.message.split('').reverse().join('')$ k5 N1 s8 C; U
- }- q; a0 y' J3 f7 u5 K2 Q
- }
4 w0 h" k# N# X; N - })( Q9 d, |2 L) [; h8 m
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 32 }/ o3 H/ t" ^ H& Y G
- methods: {
; L& N1 u- N: I1 h3 a - reversedMessage2: function () {
6 W4 x& V8 z4 N# u' ]5 W: a - return this.message.split('').reverse().join('')1 t6 j+ u5 ?; ~6 t ~: o+ {
- }
$ n& D5 [6 U3 k3 [ - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4/ O. z ~; M& l# ]% A
- var vm = new Vue({
2 f) x" x% `! n' l4 ?% J" z+ O - el: '#app',
3 E+ K. O% C4 |- j8 ?' ? - data: {
' U! a& h3 ]2 l! u# } - name: 'Google',) i! \4 ]; E; ? ?3 i2 x$ x5 P# ~
- url: 'http://www.google.com'7 w! Z* f3 |5 |2 ]* ~( p; c
- },
( K4 @' l5 W F4 ?2 `/ U - computed: {
) s0 M/ g# Q. ], v# U3 [ Q - site: {
' I; {0 `1 J0 y - // getter" X) N! A6 H8 n9 o; |
- get: function () {. i6 M( m& ] U8 t* F4 B/ L
- return this.name + ' ' + this.url
! }+ x- i1 `4 ^7 j. A! G - },
- C- ]# Q8 b6 V# J - // setter6 I2 M5 k! j6 p# \! G
- set: function (newValue) {
, T" h. w- N& T8 g: {; o! Y+ Z - var names = newValue.split(' ')
6 ]3 a, O0 _$ M - this.name = names[0]
! S3 `% c# H" h - this.url = names[names.length - 1]8 e: o$ Q r2 I) P8 }* k
- }% {. t1 E& l2 R) R' b. C
- }7 f/ i! X2 E j9 z+ K
- }2 H9 ]2 v: b( [) @( K9 I6 Y* Q
- })
. [& |$ U0 a+ W+ f - // 调用 setter, vm.name 和 vm.url 也会被对应更新( \& f1 B V2 D8 b& d9 {, w5 g
- vm.site = '百度教程 http://www.baidu.com';: x& L7 z) ^2 c% F S) X! G
- document.write('name: ' + vm.name);! f/ z( Z3 e" r% {
- document.write('<br>');
, r J" w3 ]9 A O+ c7 L - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。; V; l U$ W, K5 m, B
' F+ e+ n, \/ M4 j1 ]& s
7 k* H9 [ `% U' } Q4 [& j4 p4 Z& y# p, @2 T3 @
4 H( J5 w/ g) l7 d7 c( z9 x% N4 C8 v4 I8 R' F, W! P! _! R
|