|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
- p. a! }. [9 X0 \& w- <div id="app">
# C( z/ @' B/ d! s1 }5 S5 ^ - {{ message.split('').reverse().join('') }}2 s1 \# L% d) `" U; W
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2) ]! n& m9 \6 i" V* C5 t
- <div id="app">
6 S+ R, D! T$ h. ?# D3 d2 x - <p>原始字符串: {{ message }}</p> j4 K& @6 a1 v
- <p>计算后反转字符串: {{ reversedMessage }}</p>
! X g7 |4 G" z! O7 e6 h - </div>3 t! y2 ]6 t, z, L# ?" c4 x: }
- 7 C' B6 k8 g# m+ I' F3 A7 y- j8 q3 a
- <script>
% r: ^# g& y" W/ o: ` - var vm = new Vue({
) e) p6 e$ B4 i1 X G - el: '#app',
4 ` q) e4 F" q d2 T; q. M* c0 } - data: {
! D$ ?0 U( N; X - message: 'Runoob!'. c4 ]9 o9 Q: b" w8 a5 M
- },
3 K! U5 A1 D9 t% s3 ? - computed: {
; i b& W1 J. g! j# ]8 W) J/ n% x - // 计算属性的 getter
8 A* \# `9 g) R' P& }) t, N2 h8 A - reversedMessage: function () {. h- y# ?6 q; [$ U \4 I2 J) ^
- // `this` 指向 vm 实例1 i1 J! s4 x$ z, Y6 U
- return this.message.split('').reverse().join('')9 k/ h1 k* d5 G: V
- }# @- i) ?& u, x
- }1 E& I, n8 q! w) D0 T
- }): m! B. A a0 d0 S( v
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
6 L# `' Z' E. v0 `# a- methods: {
, r& J) s8 d8 \' i2 k - reversedMessage2: function () {$ f; Z+ p/ ?/ e0 c
- return this.message.split('').reverse().join('') j8 W1 y! i- I( X" i O6 b' [" }2 t% {
- }9 ^; o' K, A" Z9 R+ \
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
& W2 H3 ?3 W0 T M: }+ g- var vm = new Vue({
3 s& D" S- _5 z. `8 \- X) M - el: '#app',
8 R8 g' Q4 j6 y7 ], y- o8 K - data: {( J$ E. N3 ^* k6 U* O# M
- name: 'Google',
+ o* d8 a, h$ z( x) O' M) q - url: 'http://www.google.com'
2 u+ v, ~ w8 h$ H3 t1 X - },
) n* R2 E5 j* h4 t - computed: {
; T; t/ p! o: Q: \3 S - site: {
$ [6 I3 M* ]" `, c/ H( W - // getter* A Z' h) i& e( g: P4 ^
- get: function () {
! @- N+ y3 J! L; t. W, v* I2 P - return this.name + ' ' + this.url3 a# }. b" H7 W$ ?3 n% ?, O
- },
6 V i$ o# W7 Y% s - // setter" j% R7 e# W, W3 n
- set: function (newValue) {& S' E1 F/ D- Y! W( Z7 m/ A9 s5 k0 w
- var names = newValue.split(' ')7 e# o% [3 G( {3 Z1 j7 }
- this.name = names[0]
4 Z' V G7 }. a: {0 I! B% n - this.url = names[names.length - 1]
! G! T8 v5 H. B$ J7 x0 x - }
. o) `! u2 W% }6 @7 K - }
U6 I; r" W8 H* _: O. _, X* P - }
; n" Z4 [$ O& B8 o - })' I5 \3 c2 O, K1 x- q! Z
- // 调用 setter, vm.name 和 vm.url 也会被对应更新# ^# A' [: E9 V5 b
- vm.site = '百度教程 http://www.baidu.com';4 B9 E. N: w+ X; x- ?& f/ E
- document.write('name: ' + vm.name);& i; c" A- M& M% U4 l4 A- U
- document.write('<br>');
7 {4 |0 M% p* w' P) i - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。% U9 m* z2 J/ Q( s
. U5 t1 r: F+ t' y" g1 a1 H1 u7 S) b3 |* u, D& [7 L
" m' A" ]- q% m# W, K, ?
. e ?: Y1 L/ J2 {2 u! {/ z
' }2 T) Y8 ?& S! T6 h) A5 y6 X |