|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1$ N4 f6 g9 P+ n* Z( ^# h# z. |
- <div id="app">+ c j( H) q0 E0 A0 r
- {{ message.split('').reverse().join('') }}5 a1 c& q$ i8 {
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2- f! q, r9 a R$ _0 c a2 o" k# Z
- <div id="app">
/ f. l7 ]' j ~1 p! l b1 \0 g - <p>原始字符串: {{ message }}</p>
9 B: Q7 F* D6 s" k% _+ q$ \ - <p>计算后反转字符串: {{ reversedMessage }}</p>
5 u Q, G4 k; m, Q' k - </div># y" n$ G6 Y+ S9 W$ G Q
- + g/ i/ f1 u8 r0 G
- <script>
1 k4 w& a! A! f- {: {/ w - var vm = new Vue({& n; Y F, p5 p4 }3 {
- el: '#app',
3 y' b4 A1 J' u8 S& `) {! L9 N. F - data: {( J1 U9 b2 f( d' W
- message: 'Runoob!'; r# m: Z9 w3 p) k3 v6 e
- },
3 u0 |- L* T9 M5 F$ m1 @% D - computed: {' J9 I* h, N) C. m! w+ @
- // 计算属性的 getter
7 a( R# }$ w% N+ [- k& [1 m - reversedMessage: function () {
3 \" E6 s$ [6 G( O - // `this` 指向 vm 实例) L) T% v( c8 j' P% M7 ^5 W# H
- return this.message.split('').reverse().join(''): h$ y3 e( B, O& c5 i2 W
- }
% ~; H: o1 m) D! P* @ - }/ w. h" E/ S. r: Y
- })
; ]2 j* u- [/ r4 Y# L - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3% I; w) \4 d+ x
- methods: {; Z5 Y q: @) w0 f2 E. ~+ q
- reversedMessage2: function () {
5 |- v6 m# [5 i - return this.message.split('').reverse().join('')
# G. k) E( E& @3 s/ z - }
' U, {! D4 E4 u1 Z9 c1 ]) L. B5 Q: P - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4 C7 k4 l8 {: M
- var vm = new Vue({3 ]6 n _# |; U _
- el: '#app',
" D3 l4 D4 ~! S$ t6 A - data: {
8 ^3 N5 F! c6 @" C# ]: x - name: 'Google',* G- p& I; L- q: @+ r0 g4 Q; v
- url: 'http://www.google.com' O8 a' B$ a( s$ e( c/ X
- },
5 e# q; Y5 v) T# g. S4 F$ d! e8 Z - computed: {
+ Z, F% m1 B( w6 X - site: {
( K' \* Y2 z. v! B - // getter& g" p9 T2 ?( M C. ?: I9 D! P
- get: function () {( O2 F; s) D F; i4 o, G
- return this.name + ' ' + this.url
/ y0 A, F# E: \( ? - }," \! B( D0 y( F2 M/ i& V0 |
- // setter1 v& `% k- R% o" T
- set: function (newValue) {- | i2 s! `, o( ?1 g
- var names = newValue.split(' '); L2 t5 m9 g# x
- this.name = names[0]
) R; `4 \- K9 `3 k7 G - this.url = names[names.length - 1]5 U! {# I# }+ n
- }! e/ Z3 [4 W& V/ T2 s
- }% @2 j- a8 P7 i+ g
- }9 e* v' y& O% m
- })
8 Y0 A4 C n) e2 ^ - // 调用 setter, vm.name 和 vm.url 也会被对应更新
5 h4 e& `7 W' Y/ w R - vm.site = '百度教程 http://www.baidu.com';
' J9 n1 A) l1 x8 r - document.write('name: ' + vm.name);
8 ?* u6 \) k: x$ x8 G5 v - document.write('<br>');9 b' C: m1 `7 W( Q+ d; ^
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。$ W9 Q# R. O% O8 X S$ O( d9 u7 f5 q% m
% p' N- b' K' y. R: s2 e8 R
: o" r/ t+ c; t+ U' d( z5 i
4 Y% k, x9 d1 G; d: \5 T2 o& v% F/ H' Q9 G
6 O5 j+ Y4 C2 u2 G |