|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 18 R- [' v8 N" I- ], f
- <div id="app">: T7 R8 `' P$ _
- {{ message.split('').reverse().join('') }}" N, n+ K; r a. h; V
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 25 p6 V& b/ f# ^
- <div id="app">" Y* O7 B0 L! _
- <p>原始字符串: {{ message }}</p>
- H' A, @! h8 U- N - <p>计算后反转字符串: {{ reversedMessage }}</p>9 `4 u! D5 ]; _ \ K
- </div>6 R- a# U% Z4 W, G1 n- z. j
- 8 l* Y/ {. G- m/ h- Y
- <script>, f* H$ Y0 Q/ R$ Z9 g+ o- F; o; X
- var vm = new Vue({
9 q* }1 T( l# x7 V# L# \ - el: '#app',# R6 h7 ^3 D/ J& v5 c. F/ \
- data: {5 [3 I5 Z5 w! l# C% J
- message: 'Runoob!') a' C, i8 @. q: W9 y2 s4 P# }2 Q# r
- },8 H D+ ~ O8 s9 E
- computed: {
# X' z1 X4 }5 w# }6 K8 @ - // 计算属性的 getter3 @3 e6 Y0 o$ ]1 U0 V! L
- reversedMessage: function () {7 P. G" V, ]( i8 `' }4 B, E: I# U
- // `this` 指向 vm 实例! a0 e% Z m+ X' i
- return this.message.split('').reverse().join('')' x2 z, z M. I0 L' M6 {
- }6 n- u7 {; I" C8 \
- }9 m N h" ?! W4 L9 o% Y
- })
3 o# d9 b# y8 ]9 Z: N+ ] - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
7 m) H, Y& x5 f1 C8 v! b1 E- methods: {7 d- L: M8 a( V( l8 _ `( F9 h
- reversedMessage2: function () {
" Y: v" e7 l- Y+ J' V# K6 e( j - return this.message.split('').reverse().join('')
" B! q- L6 a8 {: a- H - }
j* ?+ c- _; v9 O - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 47 z# B R) j1 y# C6 s( G T# I$ I9 N m
- var vm = new Vue({, _, Y# s/ B/ K8 H4 J- B( u
- el: '#app',
8 \6 U8 { d, ]( @4 S" O& A* o - data: {
( m; |3 N! h" ~7 ?: {6 j - name: 'Google',
6 z* U% I% U; c/ U8 y - url: 'http://www.google.com'+ D- t3 `: l: a# a2 G$ L% s
- },
0 U) u" T( \( ^. O8 P - computed: {4 b( d3 I1 @& X' g }5 W5 i. L
- site: {: q7 R! x _( e3 i
- // getter
- T8 ~' J' @- h0 D. _! |- b# d - get: function () {
3 r$ |2 E+ M* R/ z - return this.name + ' ' + this.url# g8 `0 o* \+ m- E6 ~+ q1 }& X4 v: O
- },
; T2 i" H/ \! l! d6 y - // setter; s" J N6 z0 _+ o9 s* z! P
- set: function (newValue) {
9 x6 e, s2 _4 M" K - var names = newValue.split(' ')' J0 E( V& l/ e( b7 x k; C7 i
- this.name = names[0]( E: x. K+ Y1 |6 _' F
- this.url = names[names.length - 1]
7 ]/ B# _' c1 B - }/ e% y, T% d0 N. i
- }
" x- ~+ L. J8 y9 x2 U' E; J - }0 w6 j- j! v1 K. g
- })4 Y4 ]: ^" j" I/ A3 w- t" I
- // 调用 setter, vm.name 和 vm.url 也会被对应更新5 c4 E5 b9 Q( H: f9 R9 r7 @
- vm.site = '百度教程 http://www.baidu.com';3 O( _$ |2 W, \4 c
- document.write('name: ' + vm.name);
* `. X9 v* D: D: ~2 P2 h( A - document.write('<br>');# j; p* [8 u |9 g, @3 k
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
: A! e! M7 {# `9 F# N0 ]) v" X
* s' C5 L. o. y8 Y! U7 W" S# P$ C+ R8 C9 ~9 m- V! W
' x9 ^) ~5 R7 }
2 X# w: o) ?9 _# ^) c" j/ j8 P. A: F- d2 Y: R- N
|