|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 13 I! w( l6 V A- m% ]5 n
- <div id="app">
9 G: E+ v z; y8 W6 E6 Y# a - {{ message.split('').reverse().join('') }}& H4 A. _! `( N5 L3 W
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
8 l) p7 l6 M. k |( y0 S0 P- <div id="app">
1 \* t7 |. G7 _7 D: `9 D5 C# G# p - <p>原始字符串: {{ message }}</p>
4 g$ [4 e- n' R( Z: m - <p>计算后反转字符串: {{ reversedMessage }}</p>
7 N% c: R( c; f$ V - </div>
9 n) i6 H, ]4 ~9 g! v3 U& U$ d - 3 {% L& R0 K( V! W$ q+ g0 S0 R
- <script>0 P4 ^ e4 X! Q0 w
- var vm = new Vue({. H; f0 A5 D" m) r9 r4 O" L; {
- el: '#app',
' r: {& ?' h3 x - data: {
1 |8 \! V1 o. }$ ~% z# W7 r9 X - message: 'Runoob!'
' b( M. m% z: H2 m - },
9 {! C2 ]* w$ f1 | - computed: {
6 B) z6 i) U8 }) U% M: ]' Y - // 计算属性的 getter& l9 D: G0 S, V8 O
- reversedMessage: function () { K0 K2 N6 ]& k. Y
- // `this` 指向 vm 实例. q( o+ Q: r# ?+ H9 P
- return this.message.split('').reverse().join('')
* S. f! d0 ]9 U. G0 U - }' L- p& |- Y1 `2 u0 d5 f
- }; E( o; u4 H" _3 T
- })! ]+ A/ `( M# P {: V7 f. K
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
! x. e: J$ m; ^# h0 l- Z" ]; S8 T" U& L- methods: {" M+ X$ N3 j1 l7 a j( m, N8 E3 B- ?
- reversedMessage2: function () {
0 C4 N9 Q/ {; W1 [, S+ G9 [( h - return this.message.split('').reverse().join('')
+ ~5 j8 c8 M, n5 d) t9 V - }
: H7 u3 W4 v: U; m; k( u - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 47 I) j. ]8 Y7 C0 ~3 i
- var vm = new Vue({
% v7 j" r6 c# ]9 f. o2 S - el: '#app',6 s' }! {0 c% h. J! U6 S# B% K$ f8 h
- data: {# C; b% D2 e' L
- name: 'Google',
4 Y8 a- V* X) n# g4 ?, [/ y - url: 'http://www.google.com' z/ x$ g, z7 Y- g
- },( x" T3 D% T! V$ x
- computed: {% B1 n- V" O: |/ x, Y6 ?7 j
- site: {" ^' c! |+ |" e: ~
- // getter
; \2 R1 T0 ~/ N1 S$ K1 q+ a4 G - get: function () {
7 C% R9 A6 Q9 M5 z$ j - return this.name + ' ' + this.url7 s" p( a6 \" _/ y
- },
% F( ?) B0 b' I) @( M/ ?0 Z - // setter R8 ? I8 ~9 l" Z f4 x& x
- set: function (newValue) {2 U, s3 X% ]; ~, p2 ^7 H# q+ a5 B
- var names = newValue.split(' ')5 Y( W1 N, {7 y2 s. T' U
- this.name = names[0]. v+ s" B3 _; U! ?1 Q/ g2 e: h
- this.url = names[names.length - 1]- X9 a7 t% ^: }) \* @$ {" U
- }# I5 O( ?5 E5 O' C
- }
5 l0 x# l, n- \( M - }) L1 v! i- F, n& [# H
- })5 A6 u5 [) N `4 f; q) O/ {
- // 调用 setter, vm.name 和 vm.url 也会被对应更新# q6 |' W8 L9 c" G; g h3 Q% @% e
- vm.site = '百度教程 http://www.baidu.com';
2 M" b1 |9 k8 X6 R3 t' P - document.write('name: ' + vm.name);
- P! _0 u$ w* f% l- L2 @1 W - document.write('<br>');1 _/ o" X& K+ X
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。1 p1 Y% B6 C; K3 b7 y
( s6 T4 J [8 p
: ^: Y* q" ~: ]. l2 l% u$ S, a0 B& h; M- @# x* R7 F) L. Q+ k6 x
# X! m0 y; v+ w0 J& Z/ P+ [, M% B8 I7 X; z: _; [
|