|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
1 G) M& r. ^( {% A8 L1 O- <div id="app">( r! c/ p8 E4 q9 j9 v/ n7 R
- {{ message.split('').reverse().join('') }}
$ [8 N* n: O/ ^ - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2: Y" S4 W3 z. ?4 k
- <div id="app">
& W1 V: _1 u3 v- B2 m# R - <p>原始字符串: {{ message }}</p>% b8 Q8 L4 b5 i+ p9 m
- <p>计算后反转字符串: {{ reversedMessage }}</p>3 m4 d! F7 q6 K7 Y# f
- </div>; {9 \/ o7 i& v+ u
- 0 c) t" G& C( x; [7 m( |/ z
- <script>
! `) Y5 s5 Q9 a! O) Q( h - var vm = new Vue({
9 S' O3 f$ q# i, h - el: '#app',
# Z `* Q7 s( j0 a5 `+ U - data: {
* b! j% Q( G: a' z$ m3 T9 p - message: 'Runoob!', `0 H) @- \" M0 U/ [' N/ y
- },+ V5 O6 V3 [+ K" w
- computed: {
5 Z' F) `" x% A2 M6 \( H - // 计算属性的 getter" G5 ~, i3 n! P
- reversedMessage: function () {2 f7 M, {0 G7 H, g% s2 j# [# |
- // `this` 指向 vm 实例
; p, o, L7 b, R# m8 Z& z/ e% \ - return this.message.split('').reverse().join('')
5 X9 m3 P/ Z& y$ o3 W - }
# Y5 g' p( h% R/ G1 C& S) r) Q - }* C( {# d: W; m" W. x, ? q
- })9 [/ ~$ o( V) L+ `, {5 q, u* W4 ^
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
- G+ y" @! S4 [- methods: {
6 w2 ]0 q7 l2 ~% a% T" E# F - reversedMessage2: function () {+ I! [$ O1 v5 [- g( f" d$ Q
- return this.message.split('').reverse().join('')/ K% B4 e5 I9 r
- }
$ X6 |7 z) D+ h% p7 n - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
$ p, B) H0 ^4 w$ ^8 d: e$ c- var vm = new Vue({8 B/ S6 m( m. N0 |3 ^9 p+ h
- el: '#app',; {/ c; W4 \, |/ j9 ]# \
- data: {
: v- s- y3 f* L4 ^! B( W/ u: D: x - name: 'Google',
& U. o; Y5 _/ P W6 r8 L - url: 'http://www.google.com'
) H5 U; j& c+ U - },
5 F4 ~+ ]- b! f6 y, j1 q- P2 C - computed: {4 k, q5 n* L+ H# J1 n7 x' b
- site: {
3 o$ p, B; v, W/ E4 c f) a$ b" K - // getter) M* \) q8 d5 w9 c1 n: T& f
- get: function () {
3 q! x* Z, W- b4 h - return this.name + ' ' + this.url
! }1 C K( s) r - },
0 l5 f4 G; `5 e - // setter* S# v. a* e1 m
- set: function (newValue) {4 h8 h. H, j! L, P6 O
- var names = newValue.split(' ')
4 b9 P. f! j9 c, _5 I8 {* N! m7 a9 r - this.name = names[0]
6 \ B8 e* a5 Q/ q1 g) m' s! n - this.url = names[names.length - 1]
" L/ S+ M% L: Y7 d. g; u+ u6 K - }
/ N5 E/ Z4 L# L - }
0 V1 ]' D6 N- k8 _# A - }% M& V, @+ X1 k8 p6 x- X
- })7 H0 }" Z! U8 |7 b7 R4 `* k1 R
- // 调用 setter, vm.name 和 vm.url 也会被对应更新. p2 b% c2 A$ T; { j
- vm.site = '百度教程 http://www.baidu.com';
6 Z. M# X; x# s1 {( F/ o1 o7 A - document.write('name: ' + vm.name);
* N5 p/ ~" }+ n/ A - document.write('<br>');+ E5 N0 o% E! I, C1 f4 n
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。4 l- S [( m' K( `6 @5 C
% t$ n' k( ~* M) i% H& E
# \- N* [) [5 ]& m5 a6 z2 X: B, J+ }+ _
, B2 Q$ Q. D1 P& b7 b4 z4 C6 z1 |3 R. l) ?* Y9 T e
|