计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
9 f% N7 c/ D2 _% F. R- <div id="app">7 e, N+ {+ `) _, N
- {{ message.split('').reverse().join('') }}
# v9 c5 Z" U- {6 z3 g - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
/ p& J, D3 P; H8 T' v5 b1 N- <div id="app">
) W T7 r6 b! v; U# g; i, } - <p>原始字符串: {{ message }}</p>; p8 P; c0 I9 l y
- <p>计算后反转字符串: {{ reversedMessage }}</p>
0 I; {# Q' W8 R, N. `# O - </div>
' N( k% J; W" b4 U" {1 c -
5 w d) v5 G$ B2 f& I - <script>0 l* ^2 f+ }' K8 R# T% `
- var vm = new Vue({7 ~# ]- |* Y+ U8 c' \
- el: '#app',
4 l: z# g4 G3 i( K! s, Q' Q - data: {, O& H# |: V. p% F& x
- message: 'Runoob!'
" x& m3 c' T5 D3 h - },
8 Q) Y) z! k3 \; F - computed: {
V7 `; K* q' G. g; { - // 计算属性的 getter
5 e# a3 j7 X M; F3 j - reversedMessage: function () {/ T6 ?% W) I0 p0 p+ Y
- // `this` 指向 vm 实例& T* w+ X5 w' s2 m1 l# v" Q
- return this.message.split('').reverse().join('')2 P& R% h- I# V1 m6 {9 ~
- }* c+ n$ L/ U. s7 ?( f( c
- }
1 a s" N( [% E% H# m. O - })
" b7 D( ^0 N7 K; c* f9 V - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 34 W- T |& l8 \7 ^( J: k+ P# }
- methods: {
]5 |1 U& a9 q% g3 J8 g- z - reversedMessage2: function () {
/ S& w4 U5 @/ `- V6 F; c# s' G8 k - return this.message.split('').reverse().join('')
6 {" U3 k4 s% a" G- F - }
& L8 W3 s9 b, R9 \, o9 V2 a - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
" u. r3 L5 L" j- var vm = new Vue({# l+ q: C4 r/ U8 ~0 B
- el: '#app',3 z' C; P9 K, H: d6 y* m# |" Q. z
- data: {+ y6 _5 ^1 R, R+ R
- name: 'Google',1 h3 o7 W' e( p. Z4 s8 ^" d4 j" I. x
- url: 'http://www.google.com'3 i7 P b* @4 o8 H" f {8 d. Z
- },) K& k8 M1 x k/ r, R5 g4 G" Q
- computed: {
3 r0 @7 I6 W- @ - site: {
+ n! g7 `4 z T6 H6 P# K5 q - // getter# K4 c `7 u' |' M
- get: function () {
S, D* b) h9 k/ I - return this.name + ' ' + this.url7 W7 G! j% X4 c% G, t
- },' h% v* a! G! a5 o; v. G
- // setter
. X& @$ E* J+ Q v2 l. n - set: function (newValue) {) K# k2 N, P4 _( `
- var names = newValue.split(' ')
3 J$ A0 {& W' x' \$ S - this.name = names[0]
2 F" Y/ ?' Z( j - this.url = names[names.length - 1]
3 m, F# x6 ]) Z4 l2 Q - }1 W1 O6 M* ^7 C% B4 w& h
- }
1 O% A, s% W8 n2 O - }
0 o% b: n- ~9 g- T9 ]$ E9 E, [& A( u7 G - })
+ r$ [: v8 a( |' i/ A M - // 调用 setter, vm.name 和 vm.url 也会被对应更新5 \0 x F W, ^! a3 m6 e
- vm.site = '百度教程 http://www.baidu.com';
1 L9 y% I) d7 p - document.write('name: ' + vm.name);9 O7 F) y' y% x A
- document.write('<br>');, x2 m, J7 C) Z& y% p+ [5 I& p& V
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。0 L" @$ `8 b1 o# [
0 b1 i& a, |4 M& Z9 q1 s
7 ]# e5 M7 q( c6 O' m
( |% i! U; I$ L* s4 s4 M3 ~
0 q* ?, n2 R9 ^7 b1 j
0 P% a$ W, t) ]1 x; m* I. f |