|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
- |, V8 U( s7 I/ v; y D- <div id="app">
# [$ W+ ?- D" w. A% F- O - {{ message.split('').reverse().join('') }}
# ^9 P; Y+ N5 }6 D - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2( i% x( h. B: D' ]2 `
- <div id="app">
5 Y+ G9 _. \# M u - <p>原始字符串: {{ message }}</p>* M6 Z" H( x* P. @* O* a
- <p>计算后反转字符串: {{ reversedMessage }}</p>: @5 i4 t/ _& [$ w/ h
- </div>2 A1 Q7 x, K, m! [" `
- 4 p/ z# d0 I3 N& @+ q: N- ]
- <script>
7 k6 Q4 X3 S$ C$ r7 C - var vm = new Vue({! ?" b! B3 H$ F+ ~; {! g- @
- el: '#app',
, G1 }* K8 t7 x - data: {
2 q0 D7 k+ L: a- V) \( D5 t, s - message: 'Runoob!'
% z: v& f/ t T - },0 d/ d8 v& Z3 k6 u: N. H
- computed: {
# M# l4 B" P3 _3 j- a - // 计算属性的 getter
3 k: }4 U, Z- ^# D8 U0 ] - reversedMessage: function () {
" ]! s3 z- e$ l% h& k - // `this` 指向 vm 实例
6 r9 O8 y* t2 P6 O" E3 i - return this.message.split('').reverse().join('')/ ?) v' \- E" p& @+ b" l, b0 x0 E
- }7 X6 x7 B0 H9 w4 L6 z
- }- e0 z% d$ B1 b1 H3 Z
- })
6 c4 H# ~4 c, } - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
- g9 t- g0 I2 x/ ?6 g D6 ], J- methods: {
2 j" b4 O5 d( W8 S - reversedMessage2: function () {
0 g+ Z& P6 h. {! w) |, D+ c- z8 ` - return this.message.split('').reverse().join('')) o3 Z, X( |" p' X$ w5 V
- }7 \& x1 u4 f+ p& T6 f
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
/ H/ G6 T' {" [: h; J ^) ^- var vm = new Vue({* o2 ~1 J( b/ z8 x. `8 q' H% }
- el: '#app',
# J+ ?+ A8 ~2 M! t6 q - data: {. L; g2 c" c/ J
- name: 'Google',
5 c, M3 z+ Q/ Z0 P" ^3 ?5 @ - url: 'http://www.google.com'3 Z5 e- H- v! p, N1 V
- },+ V6 g/ E H) x- z, K
- computed: {& @& M2 l4 H5 o/ ]) ~* |
- site: {
+ Q2 U( G; G' L$ A; f - // getter. A3 X: R& Y# [2 N2 i, I% u# `
- get: function () {7 `% S' A% W) z% V( y- G3 g
- return this.name + ' ' + this.url
% Q4 ]# _! M$ g* I. ?7 l - },
8 U& j! z; n3 c8 Q - // setter6 `/ m+ z: C g* n
- set: function (newValue) {+ B9 j0 x8 N/ r3 A
- var names = newValue.split(' ')
u* q( u! n+ n1 h* y" L - this.name = names[0]
3 v: ~/ d2 l; h- ? - this.url = names[names.length - 1]
+ u: V* B4 Y: Y. n+ O. Y - }
/ k$ J5 j. o: D. M [" k* I - }
& T6 u) U1 E. [; ]0 U9 j - }
% }) z$ a) Z, k2 h$ l - })
7 p$ i3 `& P" e8 F m- y. P4 `( ? - // 调用 setter, vm.name 和 vm.url 也会被对应更新2 T# F1 j. p6 J# s
- vm.site = '百度教程 http://www.baidu.com';' H: y/ [; _" `, d9 x1 H
- document.write('name: ' + vm.name);3 _0 E, ?9 s, S+ E& ]1 H8 e
- document.write('<br>');9 R R" r) f- n8 q5 o8 f0 S
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
F" N8 Y3 x' u9 \
3 w" \# t# L# q' Z7 g) v9 x& h& B6 n, |
; ?( x- u2 X! F* v( J2 e8 x7 g) y
: |& e. s; j: U( t2 e
$ }" z0 ~& a! H1 Q |