|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
# a+ c& b( B/ \1 |8 t2 J1 ~: [- ]% }- <div id="app">* l: e/ p. g; n* u& V0 r
- {{ message.split('').reverse().join('') }}
2 _4 c2 V$ a1 Y4 K - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2( ?( T7 Q3 M* V+ k1 b `
- <div id="app">
, ~+ e$ y& v9 m - <p>原始字符串: {{ message }}</p>
) f. f3 n& G" c' c5 r - <p>计算后反转字符串: {{ reversedMessage }}</p>
9 m( Q9 E4 z* f - </div># o8 I. z W- v" z4 }
- 0 i3 f3 a9 w& }2 r
- <script>) b$ v" l2 J6 E2 J% z0 d" l
- var vm = new Vue({
3 d9 r; e7 w0 a2 E5 Q# c& F0 p, ` - el: '#app',0 t% q7 T( d L! h
- data: {# n% g: t, [2 {; c8 [4 Z
- message: 'Runoob!'* E2 b% s# y- e; q* i8 k
- },
- A" [: M" c$ y- e G' ] - computed: {& ?$ H1 ^& e! I8 a0 i& Y% |# d
- // 计算属性的 getter
7 F Y9 z; L* u7 |$ y - reversedMessage: function () {
; ~2 r' e- T! Z( I R$ j - // `this` 指向 vm 实例
% N Q8 T3 {2 G' Y" v6 S - return this.message.split('').reverse().join(''), c7 u+ f" i, @5 W8 g
- }
, j' r3 a/ K' c, h* B - }
W! y( e* C# G6 U - })9 { K4 D) M5 _
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 37 e2 C1 S. g# ^- b9 m$ K8 M+ D
- methods: {8 U+ \# q# ^9 H) u) B, ^8 s; y
- reversedMessage2: function () {/ X, _2 g& j: X5 ?( L
- return this.message.split('').reverse().join('')
2 r0 {% V+ ]; x - }) e, w( r2 F: E; V
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4 W8 t- n. t7 [% w! C
- var vm = new Vue({5 Z6 t$ J- n8 n2 ~
- el: '#app',! k8 }& d% q. C% {
- data: {
; k* m( u9 d, Q1 P9 C1 A- d - name: 'Google'," ]0 _; [' O5 b) K5 A" ~
- url: 'http://www.google.com'( Q7 j7 e/ W7 i
- },+ U$ z9 g; u F4 T& S1 ?1 F6 T
- computed: {
+ r' H+ n s. A" @+ r# {/ n - site: {/ I7 t4 N$ y/ p
- // getter4 f/ ]8 T: \* M* b
- get: function () {
: X; F6 @5 Z- a$ r/ I - return this.name + ' ' + this.url
. X6 r" K( I; P - },- a5 i& S4 `) A# O0 s) q+ a
- // setter' v6 ~6 g# R+ }7 U
- set: function (newValue) {
$ V$ |- b( g: T. J2 D: }9 | - var names = newValue.split(' ')9 N' y$ ~8 B! C9 F) R* m
- this.name = names[0]
- t& s& ~6 G2 {) ?* w) Y% Y - this.url = names[names.length - 1]4 a5 p- W& F! ~
- }0 C4 W$ r, y3 l" ?
- }
6 u+ ~1 B9 {& O - }
/ l4 ?% k3 K8 Q5 b, q - })
( t$ ~( ^1 a# P9 @4 J6 d# Z6 o+ \; u - // 调用 setter, vm.name 和 vm.url 也会被对应更新3 f! z6 l; C; [* W! R
- vm.site = '百度教程 http://www.baidu.com';
3 S& q/ x; o+ n4 Y4 F$ }9 m - document.write('name: ' + vm.name);
, ?: d3 U, c% W1 d* z6 b6 y. K - document.write('<br>'); H: B- H4 ?7 I: R- z8 C
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。2 n: `& p. ~- x9 X
% D7 X+ G8 J- S; C+ |4 E8 |9 k) X; C. S
j2 [. X7 t7 Z; B/ H' G. |8 A0 U5 h. N
# ^+ R* Z- J$ ^ |