|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
- h+ `4 h8 N- o N5 k- <div id="app">% I" E* t1 L' c8 { B2 \
- {{ message.split('').reverse().join('') }}( Y2 Q) P& x, W8 r3 S9 O: G
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 23 N% E) g0 m9 n; T" R( k
- <div id="app">: ^$ q. g \1 `
- <p>原始字符串: {{ message }}</p>$ s# L3 y, i$ W, m: h
- <p>计算后反转字符串: {{ reversedMessage }}</p>. Y9 I8 p$ P5 r
- </div>
6 P% [1 u9 C; A -
# l/ `) m5 o/ P4 z - <script>8 D. I9 r! p5 ]
- var vm = new Vue({, v+ z7 x# K# ?6 N- B: o3 m
- el: '#app',
! |: w2 v! c; J! s; S - data: {
, b% r' B8 ]3 F! m2 L$ K/ `$ X - message: 'Runoob!'( D- F* H+ ]: o7 S# y8 t
- },
) q* `- u/ [3 j- U" g ? - computed: {
6 w6 b5 u! M5 _# Y5 ~" u" T - // 计算属性的 getter7 g/ p) w0 S/ l' A7 G& w
- reversedMessage: function () {
! {3 v! [1 @: W# O7 X/ p - // `this` 指向 vm 实例
( O; b& w/ ^* A L+ W/ [ - return this.message.split('').reverse().join('')
, k) o; V9 u/ Q. f& a/ i1 G - }" n/ I8 d. b+ b2 a- p
- }
* x5 A! k$ J% a% |7 H - })
/ O* ]- }# X; v" o. j: G - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3) @9 P! M3 B5 w* t5 F
- methods: {; k7 ?, k# h) `8 p1 {# k
- reversedMessage2: function () {- x3 \9 W" M8 ~
- return this.message.split('').reverse().join('')
6 x9 Y+ t4 O0 G. J4 y - }
% r2 V8 ~" a% C6 K! n8 X, v - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 49 O4 T+ Z, ~7 k+ s& s
- var vm = new Vue({
( Q: W0 k$ |8 \1 k - el: '#app',0 J5 q9 O9 `% D# [
- data: {1 i! J: p4 S( E; F% P- i+ x
- name: 'Google',
* r1 I% {8 z8 |; Q7 K1 j# Q7 g - url: 'http://www.google.com'
7 B% D* V! I1 h2 y# | - },- M# [ P8 S7 S' {) J3 X2 n
- computed: {
0 ?# F2 X& f7 r5 D; `3 z - site: {( X, U* W) z' J' D& k4 ]1 U* ~( c" u
- // getter; a: O1 W6 Q' R7 e0 V
- get: function () {& I$ g; x& Q- u0 @+ H/ Y; U
- return this.name + ' ' + this.url
; X9 R3 V! P& ~* r, T - }," B, n3 a7 U2 U8 f q9 M" h- Q* u
- // setter/ }" } Q" @; ^. b! G9 s
- set: function (newValue) {* Y2 @% D, g4 E- ]
- var names = newValue.split(' ')
: y. j* D) D. b1 g: r) L - this.name = names[0]9 @) O4 m2 i9 C7 v- ~
- this.url = names[names.length - 1]
. Z# {& @9 c) | D! Q( `% u- E - }
w& J d4 ^3 q5 P* a - }/ o% t1 B ^: u4 E
- }+ @, \# d) f% u+ Q
- })
3 M1 h6 X) Q ~" w, m - // 调用 setter, vm.name 和 vm.url 也会被对应更新
. @5 ^) q! P- T/ `0 g - vm.site = '百度教程 http://www.baidu.com';
4 n+ B* B$ L8 m/ `) M3 {, [2 E - document.write('name: ' + vm.name);. I0 Q) u' \4 L2 m1 m G
- document.write('<br>');. o2 A$ }6 {" F8 y7 D
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。: X5 x) _9 A" S
3 ?0 [0 H2 c6 L! d' }2 N
( ]. v0 } H# b1 t+ I
0 @! }4 J( l" H7 i$ z/ ]. V S9 |: E
$ q: e! v2 x- k! P0 ^
|