|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
% n/ j+ d. F' v- <div id="app">+ H* f& H+ h) _' o4 d4 O
- {{ message.split('').reverse().join('') }}
& k4 T# ~- ?1 Z - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
" @& g9 h1 _3 ]+ y5 }3 F( J, v- <div id="app">
: j1 t2 `5 B8 _. K) Q" X* Z - <p>原始字符串: {{ message }}</p>
5 D. W# T4 J+ T! T* ~3 Y* q - <p>计算后反转字符串: {{ reversedMessage }}</p>' e0 R4 o$ X0 i( C. d" ? U
- </div>
m c# g3 q ?( d/ v! q -
5 l) `7 a/ C7 d. Q - <script>7 A& k: f9 S1 X
- var vm = new Vue({+ L( w. @& r6 U& Q7 f
- el: '#app',
1 M/ _5 h/ ]# v - data: {) k9 ?4 M+ q" a" P$ I% N, l
- message: 'Runoob!'
0 H+ r, Y% c2 y - }, U: U, ~% v! K7 n4 C
- computed: {, l! m% X+ T" }( M+ \4 G3 A' p# h
- // 计算属性的 getter2 t9 @0 Y$ d2 ^" T+ V1 O6 m
- reversedMessage: function () {5 a w1 D" Y/ t3 n' G# h
- // `this` 指向 vm 实例
' R( C* v; M3 \2 U, X, n - return this.message.split('').reverse().join('')
& _# Q- w0 ?4 g' Y2 x2 r* { - }# ^: O: R; y5 f; Q' a. l0 S8 G% ]
- }/ }/ I3 _, L q/ s
- })
2 i/ ?7 M9 N! b6 A7 b( d - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3; w/ C: R5 u+ G* _
- methods: {
2 S _ F6 T4 J1 y3 f - reversedMessage2: function () {
9 h7 N _1 X' A# d5 \ - return this.message.split('').reverse().join('')
) _" y3 A* o) H$ Q - }% g F% w# _* t9 R, V7 i# p
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
( v8 Z% _( ?6 Y8 t+ [- var vm = new Vue({# |6 M2 E' X, a
- el: '#app',
' k8 L3 L# ^. s, F( d- z/ c' F - data: {
& g: s, e& V& |' D0 a& _ - name: 'Google',( v9 H) r n- ]( m, N' B: Z
- url: 'http://www.google.com' x! g2 {4 H, e( s
- },) s# _! I7 {8 l* J6 d9 O
- computed: {/ i! V. O' r$ K4 t8 k
- site: {
Z3 ]. ]) c! v5 h- A- ]' G3 f - // getter
. h' h6 M3 q8 T7 l7 Y* N% B - get: function () {
) o0 a) U; e: q& q3 t& A - return this.name + ' ' + this.url- R5 l+ v4 k4 w7 h# ?
- },
& k, n& ?0 ]. w - // setter# C8 W, c; {4 Z" J$ G7 S
- set: function (newValue) {
& P9 v+ M* l6 z9 U8 E* O4 r - var names = newValue.split(' ')
7 A x+ v* L) d @3 T - this.name = names[0]+ ^+ C0 i- F7 i8 F% a
- this.url = names[names.length - 1]: q( A+ U& o. N- y
- }( `: @" V& h! y. k& G/ |
- }
) h1 y( p3 f; I( r - }. u" X' x- | b1 m
- })
4 Y7 \8 x- E' z Q1 s - // 调用 setter, vm.name 和 vm.url 也会被对应更新
# T' R) Y4 D! L4 m. E - vm.site = '百度教程 http://www.baidu.com';
2 P7 |' v, t' A% U' Q - document.write('name: ' + vm.name);2 u1 L" d" w5 A/ Y0 G
- document.write('<br>');/ Q. P4 X' @. F4 ^
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
7 X7 P {- Y3 X; q/ e$ q
( t Y; \9 G# ~. e$ `
3 D5 b |3 ^ ?0 p+ h* a0 J: t
4 L" v, h/ @1 o$ w
( i- i0 h4 k% b' f1 m0 u0 M5 m
$ c5 R* h/ R9 m" \; i& d
|