计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
+ {5 Q7 y0 T6 J: M4 k: A$ |- <div id="app">
: u: c7 b( p9 ?0 i! z - {{ message.split('').reverse().join('') }}
; F+ Q+ q& S# q: n& E. b) t! q1 h0 ] - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
0 `( }, [2 Y0 a" `, \9 u- <div id="app">
7 N. v- v5 D7 o; E0 P3 ]. T - <p>原始字符串: {{ message }}</p>
! a6 K2 ^# S0 z9 e - <p>计算后反转字符串: {{ reversedMessage }}</p>
% Q" F1 p3 T* O# M- i% a6 z. p - </div>
2 i; H7 {. Y" O$ Y0 \3 R+ b. ]3 L/ s -
( c* P2 q) F% S" m F, g/ O - <script>
. ` o( U7 ~- c9 j! ], d* D - var vm = new Vue({
' f$ k$ I4 O. \( d g* ^2 E0 U7 v J - el: '#app',
, T9 S Y, t' x! y9 e% g: | - data: {
6 f4 _* }8 g/ S2 o# d. U - message: 'Runoob!' F+ _+ ?! \) K4 v! A
- },# O& U+ |# D i. a% I
- computed: {
% q6 V2 K v7 ~# |7 E1 W! w5 P/ }' x8 b - // 计算属性的 getter, |) R4 S; ?9 H2 H( h* a4 d
- reversedMessage: function () {4 |: u2 t9 C, h0 U; ^
- // `this` 指向 vm 实例
) U3 u. { o* \, r - return this.message.split('').reverse().join('')
4 L$ `+ Y/ u$ @4 S% u. V2 Y7 j - }) `6 u/ a( C. Q/ u. p8 ?
- }
" {8 R1 b- J( G9 M6 m - })
3 c0 }% o4 L! D2 q6 P - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
) n9 C+ |( @5 q4 N, E- methods: { Z# _- [) s& {$ W
- reversedMessage2: function () {
3 ]1 I4 I- V# d - return this.message.split('').reverse().join('')
* O2 ?9 k6 ^. Y" S4 U. q. D - }/ `( B2 O4 y; u* g& y; H
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4# z& o+ H* B Z5 f0 ]7 h
- var vm = new Vue({. r7 p. F q8 e6 P/ ~- n
- el: '#app',
* A; {/ P6 Q. g4 Q+ {5 o% a2 W - data: {; w- v7 |. n$ z! l7 H7 ]# _
- name: 'Google',2 q. c# ~% G n1 ^& U1 \% O# W
- url: 'http://www.google.com'$ J& c _6 L; W0 j: E+ ?
- },, h i3 X( @0 V
- computed: {9 |+ `* O; }/ ^3 N5 @, s% D# S/ E
- site: {; t! N8 ~# `& \. V0 A$ U
- // getter4 W, |) n4 g+ b& ?2 r! }, Z
- get: function () {0 a8 Y9 D; @. C3 M. U, k! w$ j: C
- return this.name + ' ' + this.url
" M: [, \! H E - },& {' a1 j, i6 K* u: a, u
- // setter
# e) U( P/ Z5 a, ~. | - set: function (newValue) {
" N" i" @% [; X - var names = newValue.split(' ')5 F" G6 u1 _9 ]( n
- this.name = names[0]
2 v6 [6 k3 r# J" D, C - this.url = names[names.length - 1]# q, S7 c% t* ]7 g
- }0 ^+ f: @4 @8 s8 ~& U- \; \
- }4 ~; Z6 @2 e7 ]$ N
- }
3 G! U. O2 \2 E2 M3 F - })' E' ]9 r. ~: d' U) E# B. {% H6 n
- // 调用 setter, vm.name 和 vm.url 也会被对应更新
! c, c0 b- l0 S - vm.site = '百度教程 http://www.baidu.com';
6 w7 l S# `' a# L$ B- x/ ?$ c - document.write('name: ' + vm.name);, Z- v2 ~) ~# M; N& {& W3 R# F! \
- document.write('<br>');1 C k Q9 r) u4 j
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
6 S! O1 u# E+ Z" {6 e8 S
7 ]4 `( F) [ E9 f& ^
0 p) O2 v& ^* F# @0 f7 ^
: I7 I6 z+ r0 m( B+ y+ {9 G6 ~8 a1 E* O; Z: X; U
6 o# d. X1 N% H2 D3 g |