|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
; N4 H# G4 ] a+ U5 t( {2 g. B- <div id="app">
, O' E/ k7 a% a/ m: t - {{ message.split('').reverse().join('') }}
6 w# w u7 J8 f6 T5 ~6 z3 m4 Q - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2" x2 W7 j! i: b: G4 c0 @8 i! l E
- <div id="app">
, ` ~& ?( C6 q o - <p>原始字符串: {{ message }}</p>
. r: R; c* ^9 m* q3 x8 K# D; c, U+ g - <p>计算后反转字符串: {{ reversedMessage }}</p>
4 v6 Q3 v, X. _' S) e6 Q, O; `4 V - </div>( f' W0 t e7 w
- 1 |+ L8 s* x0 q: m g
- <script>$ o7 J8 R! `' z
- var vm = new Vue({; h: E! A5 D$ X$ }5 F* z: f& h
- el: '#app',: }7 ?, |, |% m; ?3 H
- data: {6 [) ?) j- f) O: ?- N. V7 ]
- message: 'Runoob!'
; C, ]7 Z$ i! w, ~$ ` - },& z2 [! P) o2 s" {; l
- computed: {9 y4 l9 G5 L% q# g3 x
- // 计算属性的 getter
' s5 f4 m) l! w$ x7 W" j/ v' z0 O - reversedMessage: function () {* ?* b* K/ M7 u8 V: x
- // `this` 指向 vm 实例
# |2 ~- Q# `% n# u" k( O4 K1 a - return this.message.split('').reverse().join('')
" H. D5 S: X0 W. p: ~1 d6 g - }
' f8 A/ a q+ y& F' r; z - }
* m- X/ R- o6 H& F - })
% _; R- c9 L: ]# c1 } X - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3: t8 }4 K8 _5 f
- methods: {4 P. K4 b6 o1 R. h# g
- reversedMessage2: function () {/ a7 }0 [$ P$ a; v0 }( N: Z; v
- return this.message.split('').reverse().join('')+ m& V/ m* g9 ], s
- }: W9 B5 T1 P; c5 [' o: e8 i
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 44 a/ H& H# C/ S( G% j* @
- var vm = new Vue({
; n$ f" R$ h$ r1 T - el: '#app',
" ~" U ]0 P2 x - data: {6 O$ P. a5 P9 Q+ D
- name: 'Google',( T3 z+ D# v z g5 S: o
- url: 'http://www.google.com'6 a4 G) [1 G) r3 o4 I
- },
. _2 r# e) q6 u' x" r- I - computed: {5 W9 n% z6 J: U/ f' d
- site: {
. q6 p$ [0 d; o0 G/ N& l' C - // getter- ]* j; K. s0 F* V4 R( d
- get: function () {
! Q" {- o0 F# K) s - return this.name + ' ' + this.url& B. D* |! ]& |) e7 J, Q2 W* v
- },2 X L; h9 \* q% K5 i
- // setter
4 r: u9 p% Y) @7 y. o, i - set: function (newValue) {* ^7 B+ j8 G c7 j; P; j7 t3 P
- var names = newValue.split(' ')
! L _: ?9 J' o' K# u- [ - this.name = names[0]9 M2 ]/ ~. }+ F% A; \. T" m% n% g
- this.url = names[names.length - 1]! N! p- U$ q# n3 v0 ?+ F( R$ }
- }* ]2 {/ L/ U0 I5 K( {
- }$ O" i- Q* B% a5 `) _
- }) @- ~4 O3 _, x0 x+ J
- })9 f6 [3 t' U( {; U
- // 调用 setter, vm.name 和 vm.url 也会被对应更新+ Q( o' G- m+ A- @& U* b
- vm.site = '百度教程 http://www.baidu.com';
; K) |" L1 v# F# f; O - document.write('name: ' + vm.name);! O" t g8 ?; |( z$ I' Z0 r- w
- document.write('<br>');
9 d2 G4 I O. m$ V, d' o3 U4 u - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。- u1 I3 w, X- U( G, X3 r( o
A$ V8 {4 | T, t: Y
D: x4 @8 Z, I' ?( ^0 B
: B1 [6 v7 u- j! l$ O& p
& G9 t5 m2 y& a& ~4 H* T# ^
9 c7 L5 d' y& k% i" E* [' I1 b |