|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
( [. K# k- E- S* L5 `3 y- <div id="app">
* j: o* ^( b. g0 l/ |# d - {{ message.split('').reverse().join('') }}! B4 u) D* o7 l9 A
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 20 Z) l1 ^ A/ l) z u
- <div id="app">/ `+ m" F) a+ P6 y
- <p>原始字符串: {{ message }}</p>9 M' r) w* G, K( f$ j
- <p>计算后反转字符串: {{ reversedMessage }}</p>
c6 B" {- \# z, N8 t - </div>1 T3 x* {$ P3 }; o/ ~, j" a- W$ k
-
! c+ u' V: h! E4 x* b - <script>9 g. S5 z% F4 l0 T! j/ h& `
- var vm = new Vue({3 J) O! ]7 ]' S" t. j! ?
- el: '#app',
8 ?6 l: W. m1 x8 s - data: {) t" Q% _9 _7 v
- message: 'Runoob!': z2 L' p) |8 o7 s+ M# g" q2 O
- },
0 g I( b. N' t' J. I2 A& f- V/ Q - computed: {
1 F2 J8 p n8 V$ [ - // 计算属性的 getter
" N* e* J- }# O: R( g - reversedMessage: function () {" v5 d6 t8 k; C' g. U9 q3 M
- // `this` 指向 vm 实例+ P' u) r6 S3 r, i4 R- B7 Z
- return this.message.split('').reverse().join('')
% z5 s/ [: V$ {- Z I; w$ n - }6 I4 K. C5 z+ \. U
- }5 Z. O2 D2 [& }
- })
$ b, ?: c% O& t - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
. z+ e7 q. f! o1 v3 y$ O- methods: {7 g8 h2 y' b! W8 n8 P
- reversedMessage2: function () {5 [) v- r5 f7 P8 U
- return this.message.split('').reverse().join('')' {% N' R2 [; u& K& Z# S
- }
/ C4 w, ~" z# g/ k1 q9 L - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4& Q3 [( R- D& ~9 p, R
- var vm = new Vue({
. j9 J4 f& ?0 f - el: '#app',
6 @) t4 I8 C3 i J# A9 C - data: {
+ j6 y4 V; p2 s/ T - name: 'Google',
$ A' B/ n# g9 P) I4 q - url: 'http://www.google.com'
$ ^' ?+ K2 k- }+ X( K - },
7 t! T- t8 r& p7 K7 N - computed: {/ @0 T4 B! ]/ v# C
- site: {5 f. a |0 O" }% j( ?) _
- // getter# T$ Y$ e/ U# X ]( x& l! w
- get: function () {% Q$ P9 y5 ]( k# d6 U8 h
- return this.name + ' ' + this.url/ E4 j# f+ D% t! y* L l) t
- },
9 ]( O- _( t& B/ g: O - // setter
' ^+ H; U J- y% }- h& A4 [( o - set: function (newValue) {& V- j; G/ [% L/ }- L
- var names = newValue.split(' ')) U9 h& ~! C' ]" ]0 @; v
- this.name = names[0]1 D4 [7 I& r% f7 t9 s; {
- this.url = names[names.length - 1]1 Y1 V+ x& m7 p& D0 B* }2 |9 |
- }/ `& b( ^2 T6 `: w0 @% t
- }
! C, Y6 S- B+ D" ] - }" q5 L, |3 \! t( Z5 m9 a
- })& q1 a( {9 s2 D: F5 Q
- // 调用 setter, vm.name 和 vm.url 也会被对应更新% \. o1 g2 l) j( C
- vm.site = '百度教程 http://www.baidu.com';
) T# y/ h: o" z5 O - document.write('name: ' + vm.name);
- M7 q1 W8 E- }6 `. z3 h - document.write('<br>');
1 m7 H- A, B u, m* k* S0 F' [ - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
: J8 Z+ N' I' v( \' h: }! ?' W7 |
# c5 b. s2 L o
& ^& g4 o" {/ `" W4 Y6 K' i5 ]9 R
* b4 w" R0 c& s& m- f- L; a( H: V9 D
1 i" y. s' K0 r( F+ ~
0 v# m/ y% {* i! c7 b |