计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 14 O% h3 u1 [$ w) q
- <div id="app">
; R6 k! m) B4 }+ `' |1 N9 Z - {{ message.split('').reverse().join('') }}
, z1 O2 ?4 G' z) j - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
3 _% i# }3 }8 Z2 Q- <div id="app">. ]" b2 u+ ~/ G( c2 ]
- <p>原始字符串: {{ message }}</p>/ z; d* o/ r' n8 |1 b3 f9 ?6 H; Y( E
- <p>计算后反转字符串: {{ reversedMessage }}</p>4 N: l: g, e) ^8 Y3 K" l6 {
- </div>/ c& |' l( h; ^5 h3 i
-
* W8 q0 ^8 z. M: X7 S9 E - <script>$ ~5 M {% x) c9 \, V* \# Q- f/ X
- var vm = new Vue({7 u* s! A {# d9 r/ c
- el: '#app',8 w# J& p1 v% U7 O$ @
- data: {
$ |6 i7 F W# ]& w6 H3 _ - message: 'Runoob!'5 ~, k3 g( i+ l {& e: j* Z3 [/ j
- },
; K) a& G# K3 [8 O& N d( J& R - computed: {
, N# ?: ?6 m! W* \+ g0 W3 K8 d - // 计算属性的 getter, h' y- R/ Q k; ?% p/ p6 c7 O
- reversedMessage: function () {
, K+ k: ]& g! \( ? - // `this` 指向 vm 实例/ j$ u7 h5 ?! R' f
- return this.message.split('').reverse().join('')6 l" |. [1 B. A/ F P
- }
$ G: Y; U3 U# |+ w+ Y - }& q3 m$ i0 s- g, ?2 R
- })2 u/ M! u! j. A2 `; k
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
7 H7 S8 L- D2 c* @. `/ o% M- methods: {
+ X3 d. R) b5 Y7 A) D- X- ~: Q - reversedMessage2: function () {4 C$ ?! z$ ^5 B. D5 y) v
- return this.message.split('').reverse().join('')
; R/ R4 e. Y0 c. Q - }
5 M( y4 Z/ j0 m4 o0 N7 C - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 43 O; H* p. ^+ B4 n
- var vm = new Vue({# M. P/ S2 X' ?$ M
- el: '#app',$ J: s6 N }9 R7 k7 g% Z4 ]5 _
- data: {2 Q" q; G: k6 i' W/ |& [: }1 h
- name: 'Google',
9 h; f5 s( a$ P: H - url: 'http://www.google.com'
! e7 n. i; p1 j: z9 R& `6 v - },% y& m6 f0 s1 ^9 U+ @2 n
- computed: {
! o$ V4 A7 Y0 O! w! I - site: { Q ^1 C2 J! [9 h7 ?0 q
- // getter: w9 L- @$ X3 D$ _
- get: function () {$ a$ V- |7 R8 v( y4 Q7 x) t
- return this.name + ' ' + this.url
; O% _/ M( T& M" Q8 z6 w* i. p - },! y4 A$ d' T4 P7 B! r
- // setter3 `, c* F2 `! A+ K& }2 X
- set: function (newValue) {
3 k7 h! k0 C5 a& U7 F - var names = newValue.split(' ')
$ k/ a3 n1 u0 W, P1 z# ]4 s* z# V - this.name = names[0]
- D/ _5 t' t) c& |0 d4 l' b' d - this.url = names[names.length - 1]* p4 u8 k9 W* e# d
- }6 S$ l4 X- s" G/ ~5 ^# O9 j& R$ H# z' F
- }
' x9 P5 Y0 ?5 W - }
% W d. g$ e! }2 d6 }% P - })" M+ ^) T2 H( O6 d9 x2 o0 |4 {5 A
- // 调用 setter, vm.name 和 vm.url 也会被对应更新
7 I7 v' h& L; b- l/ l0 w - vm.site = '百度教程 http://www.baidu.com';
+ D- z J3 D( o B0 ~" |; Y# ` - document.write('name: ' + vm.name);* f. K0 f3 B( e4 V" y- ]
- document.write('<br>');
6 ~0 x! B K. k0 f - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
. b7 m# L% s( u2 m
& p6 f: Y( `9 R3 n4 l; r7 z: i# |. W. A9 w
+ Q ?" z* ?' b5 n2 x0 ]$ r9 f4 x2 B9 C. y3 I
% f# I; r; ]- I) O |