|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 17 _' x7 h- P8 ^' v2 X. L; k: o
- <div id="app">6 p3 K7 {( E& v) W4 E
- {{ message.split('').reverse().join('') }}
8 q$ d& G7 v" e( \ - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
$ d* m9 F* ~/ T0 `/ n* `- <div id="app">. \3 d& m5 U0 L5 Y4 z8 B
- <p>原始字符串: {{ message }}</p>+ y1 r9 T' v- i: k9 X( W6 ~ o
- <p>计算后反转字符串: {{ reversedMessage }}</p>' @2 u w! z4 L& i% R1 m
- </div>, b$ O( y F$ h; N
-
5 }% v7 O1 x4 I! t; L, X5 O - <script>
3 S: w; i/ g4 V - var vm = new Vue({" e Y/ E4 l. ?
- el: '#app',1 n+ U6 P$ \& w( T
- data: {9 u I$ r" d$ R/ X
- message: 'Runoob!'
6 g! Z5 N& w5 q; _( ?# f - },
2 k+ d, v8 C, }8 x7 }# P) s$ e - computed: {7 H! D. R( w8 u3 U( i4 G5 q3 l3 R
- // 计算属性的 getter
, l; z; Z v9 x/ a - reversedMessage: function () {; m6 | j/ L" S- l
- // `this` 指向 vm 实例
* q5 _, _! h* ~ k - return this.message.split('').reverse().join('')9 j' i8 Y+ l" J* b3 J
- }
# H! l$ w& t2 G0 f* s - }. m, R% g! L7 u& ^% n w2 S0 a; k6 D+ b
- })4 t: d: r3 x( F* `0 s
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
3 i' L4 i" a4 W+ y( S. I$ E- methods: {
0 u3 y2 D7 R+ ?3 G$ Y! c9 E - reversedMessage2: function () {
m9 O+ h8 c" \! Y- h! M' O! M - return this.message.split('').reverse().join('')
: l( ]4 a) D* v2 m - }
3 v& |; A; m8 k u - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 43 \/ [) h& Y4 ]' e! V# ^ m
- var vm = new Vue({
4 ~) d7 n& ?% N4 g7 Y1 W5 A - el: '#app',$ k7 ~, e+ L6 z) x2 y
- data: {5 w4 F) \( {, Q$ m
- name: 'Google',% G7 Y* Y" Z( S y
- url: 'http://www.google.com'
; X5 p5 i- j6 t4 I) v - },
; L0 d& W- E# w" P3 O2 K" ^% p: c - computed: {+ i: G! B0 U; P9 |2 U$ d
- site: {+ t* x8 p; H! I! {6 r* X: F
- // getter
# @4 \3 c( P. h( s( s# I* @3 G - get: function () {" r# y* K& c) M+ K, V* L" W$ G
- return this.name + ' ' + this.url0 F( w0 d: L# U y3 x! g8 P
- },
4 a0 ]* b& L- ? - // setter8 }0 Z) M1 x: v) S
- set: function (newValue) {
* t8 [. Y6 T) O# a1 U0 B; F' Q8 V - var names = newValue.split(' ')
, O' ~! y2 J& y/ x1 }/ i - this.name = names[0]* Q2 h! m z( m; F- ^0 A# n9 w; i
- this.url = names[names.length - 1]. n8 }$ H% K2 w9 [6 s* b. A; }
- }
9 ] Q j. e9 A* d - }% L% ~! Z& |# _1 [! I9 H
- }
: y* f3 K$ x# F3 a0 O% ` - })
1 H& s8 p0 ?* ] - // 调用 setter, vm.name 和 vm.url 也会被对应更新
4 Y/ w3 l4 h, o8 H2 F - vm.site = '百度教程 http://www.baidu.com';
0 J, j5 ^& `" A# c, Z, W8 l - document.write('name: ' + vm.name);' R& n' h$ _; f; G7 |# H
- document.write('<br>');
6 U6 \! N8 A' r9 |2 s0 `% n& `$ T - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。' `" Q( j5 a, W3 ^7 v
* L7 B1 i2 T J* w
. Q7 e5 n, R3 U2 I0 E$ Q
% x: Y) I( H+ o X5 y, p
# c: A$ t2 P4 y( C) u1 y. x0 I
6 v5 T' c8 l4 H |