|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
% N7 K w* a6 A# Z5 M8 @- <div id="app">
* j2 _: b5 F& q - {{ message.split('').reverse().join('') }}/ j1 f% I8 e2 f& J. D8 W
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
( h% r K4 S, N: a; z- <div id="app">0 f, ]. ], v% n2 T3 _+ a5 p
- <p>原始字符串: {{ message }}</p>9 c9 P' K$ n0 ?1 z
- <p>计算后反转字符串: {{ reversedMessage }}</p>% ]% `; ?, B% e; |
- </div>* F' a7 f6 x- z7 o1 F! |$ k
-
. F5 u. k: {3 } - <script>' g4 u1 h: x T* I
- var vm = new Vue({8 I. p. p& T, M* u, R. [
- el: '#app',
1 @' R( f7 \& |& L* m& g0 k5 o - data: {! p9 k! x( v; k/ W
- message: 'Runoob!'
7 p( f1 ]/ q! x3 r8 S5 v/ `. ~ - }, s2 S% o; _$ n. R7 H
- computed: {/ J& N' c7 n* k9 m3 F
- // 计算属性的 getter
" @ X! n N/ V7 F) p, O& l0 m - reversedMessage: function () {
) t. b& k" _4 n+ H6 E# @9 [6 V M - // `this` 指向 vm 实例% N0 K7 O$ `. f+ x. H8 P$ w
- return this.message.split('').reverse().join('')/ n) a6 T) a: X" n1 j! Y: @+ [& l
- }2 `) h7 o0 p! m& I0 L! W8 y, R. {+ I
- }- q% A8 w- @/ L t
- })' m6 q T. B4 k4 x' i
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3
5 Z5 h# G' e3 M: m: O- methods: {
1 ?6 h0 B+ {1 _1 Z6 m/ ^+ Q - reversedMessage2: function () {: H7 M8 N; L4 `& Y$ Q3 L
- return this.message.split('').reverse().join('')) D7 R- W) H3 ^5 R3 E7 U
- }
; J* b7 x5 a4 j2 s5 G ^8 w - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 41 E( v6 f0 d* R) t7 y9 h% H
- var vm = new Vue({
S; e1 U/ g' w6 q - el: '#app',* K0 l* }+ i% C2 p8 b: F. w" T; h
- data: {7 G3 ]2 ?! y% `' w, I& P
- name: 'Google',) n/ k* Z: X: u" L+ H
- url: 'http://www.google.com'9 W# [% h9 j& u1 s
- },
6 R$ s7 c, B; e5 o8 k. A - computed: {0 o% L, d G% L# {7 U2 t
- site: {) N) s) Q X' ~" |3 ^
- // getter1 h6 a e4 V6 Q+ H. u: P4 a
- get: function () {+ [$ c! h1 n- \" g1 l9 g9 T
- return this.name + ' ' + this.url
8 p F6 E6 ~3 s( n1 |. o - },
% n9 ?6 |" w: G - // setter, X* _. y. T2 L5 C& l0 R' [/ V
- set: function (newValue) {
" a% u- ?/ }+ l& p) {7 }& p2 S) O - var names = newValue.split(' ')
, G* O* I3 e# V2 D - this.name = names[0]- s$ b. `* [& G! G
- this.url = names[names.length - 1]
1 r2 V( [7 [2 F* W L+ v8 E! O1 r - }# s+ M% a) X T& X: R
- }5 c0 e$ K2 D) y4 F$ o$ S6 `6 A5 L4 }
- }0 b' l' _$ ^( J8 L, E7 A: s& W6 W
- })/ x$ ]% k+ j3 ^. k; w# D# s3 _
- // 调用 setter, vm.name 和 vm.url 也会被对应更新/ W9 ^& L6 L- x; q
- vm.site = '百度教程 http://www.baidu.com';; e% y& q, \& z+ f. e# i" L8 ~' S
- document.write('name: ' + vm.name);
7 e- Z+ A9 w. v5 n2 f4 c$ P$ e - document.write('<br>');
1 J: ?2 A# z& c: L+ k3 W - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。7 F0 A t4 @# i& L: T
( k6 j& Q b( `
4 j- Y# ~+ _+ G; X6 H: w/ ]
0 i; j/ `, u* O3 T9 y; M# P0 l: t% k( ?
3 G+ {9 n. B; D* x% l |