|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
2 r$ u. l8 t$ h7 t1 B) O- <div id="app"> T# b9 A! M8 [# i' W
- {{ message.split('').reverse().join('') }}
9 C* c8 `+ P" V8 j( g - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2) v3 I& {& i6 o/ k* |' J8 Z
- <div id="app">% o, I( C/ p3 M$ P
- <p>原始字符串: {{ message }}</p>
9 q$ Y: j2 w% \ K% X - <p>计算后反转字符串: {{ reversedMessage }}</p>
( d. X4 g- F' f1 b2 C! w9 ^7 \ - </div>6 O |8 r2 b# B$ E
-
. @( i$ F/ S" D0 P% |7 \ - <script>
( Y( K: j1 c! S& l6 x1 c. Y; p - var vm = new Vue({0 _! c1 }0 w F3 B, Z) G+ T; b
- el: '#app',8 Q9 e. z$ q3 Z- f- o: J# `
- data: {
/ W1 X7 ?9 Z/ B1 V9 H6 q - message: 'Runoob!'9 z. l8 e4 J) U8 k; V2 V; |2 w; x" ^
- },
& W5 k& f2 w v0 c - computed: {" ]- e3 F7 i$ q {8 `' n( t
- // 计算属性的 getter
. g$ l* f$ ^3 D- j! q7 N - reversedMessage: function () {+ Q, M1 N1 I+ \" a% r% Y. L
- // `this` 指向 vm 实例( G8 E8 f, `0 P: _2 N
- return this.message.split('').reverse().join('')
7 P' C/ f9 y; [ - }
7 \, R2 [+ ^7 a; r& Z8 V - }4 W( e1 G; z! r* _7 p$ U5 l
- })
5 Y& I& L( x x) `' \ - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
$ |9 M, Q9 w' r' [ h) m- methods: {; l5 d! o2 t @7 K" {
- reversedMessage2: function () {
, ^$ @, W0 e5 I7 D, R6 r+ P$ P# Z - return this.message.split('').reverse().join('') ^( Z6 v: q$ J8 \, \7 d, B
- }
9 j* Q7 P; B9 j0 J" R( I - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
! S) W8 A1 Y& v$ x; V! ~- var vm = new Vue({+ G# @8 E" ~4 q; I
- el: '#app',
% P- S/ H6 o. q: S7 T: q$ K. o1 f - data: {
+ _/ Z( ]7 K9 t1 G - name: 'Google',
! J! X6 p8 `) _5 M( R$ z2 i7 u0 r1 E - url: 'http://www.google.com'$ \1 o) h% O$ B
- },: M1 R. |6 x. A
- computed: {
" d7 L7 U% U) o7 o" l - site: {, m) v, l4 u! a
- // getter* L* C: B! ]0 m" r+ P8 H; C
- get: function () {
" z- e; a4 Y% _; g - return this.name + ' ' + this.url+ W# \6 M: q1 K
- },
[. W) v" G! { i - // setter. y- Y6 {; W! \$ k
- set: function (newValue) {
- c H" B g. h6 t0 z6 f - var names = newValue.split(' ')9 R6 e2 }2 U6 V3 L5 S
- this.name = names[0]) p1 M+ C2 _0 h: u P' y$ a
- this.url = names[names.length - 1]& C" ~/ C5 D3 U) D. i2 \& A
- }
( o. H9 o" S8 k3 Z+ W - }
/ [1 p/ [+ z; N: r% o3 X - }
! D. Q# Q1 o |- e - })4 ]: s' O* ~5 d/ f5 y7 s @
- // 调用 setter, vm.name 和 vm.url 也会被对应更新, ~( u1 ]% u: s0 H. |
- vm.site = '百度教程 http://www.baidu.com';
D) x" |6 r1 n; u; z - document.write('name: ' + vm.name);4 J! K/ m- U* {) ]
- document.write('<br>');
% ~" b# x+ x6 | U9 x1 ~3 I$ ? - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
' {( v% S* y( [3 I
( \' |+ I, d' F3 x
0 K6 _! P$ K" m
5 c& f* a# D8 }& I
0 H, `2 w& n* c9 J. u a; R, ~! ?
|