|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
6 J- @' U# g2 {& I- <div id="app">6 \' {5 H9 t0 y; o$ B! Q) Y/ H! c
- {{ message.split('').reverse().join('') }}3 X( V0 p- }- }
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2
A* v4 {4 \2 `$ T4 z- <div id="app"># R# x' m, f/ }7 O& g* D! \7 ?
- <p>原始字符串: {{ message }}</p>2 {" S) ?& t* |- E
- <p>计算后反转字符串: {{ reversedMessage }}</p>
9 U3 |0 q6 x+ H* T+ @. |( c - </div>
. o' M% f4 B) F. w+ i - 5 \* l9 h) B1 v: e& W
- <script>
0 T7 f( D5 }% H ^& G& j - var vm = new Vue({0 Z4 @1 A* R: {8 }
- el: '#app',
: B0 L1 g- n8 [5 R( a - data: {
, j2 d: p, s7 @ - message: 'Runoob!'! N- O3 S3 \# b6 f' ~0 R) {
- },
6 V# w, n4 l+ R* j8 Z, L - computed: {9 j8 ^: s* A' \+ Y8 Z
- // 计算属性的 getter; P _8 F& [0 ~! f {) Y
- reversedMessage: function () {0 F5 u" v6 y: O% G$ X. |% \
- // `this` 指向 vm 实例/ ]0 ^. V7 c+ [5 S0 Z
- return this.message.split('').reverse().join('')- ]0 l, l; s2 r
- }
' D/ s, s$ G7 H8 Q% t( }$ d& _ - }
# ]* g9 [7 C! P, o: y* N7 Q - })# m6 R/ l% f& ^+ r* j G D9 g
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3. o8 q% T% c7 X$ G& M' [
- methods: {
: o# Q5 \" `5 \% R - reversedMessage2: function () {1 A6 J/ n: T4 E8 P% o
- return this.message.split('').reverse().join('')0 s6 s1 Z" R2 J, t
- }
9 t5 q5 b- P2 h |# M - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4
# f9 I- U: F3 D- var vm = new Vue({
I. E6 z4 w+ L( g - el: '#app',
$ d6 \' u% J$ `3 t6 h8 [ - data: {, [$ j9 \2 z1 ~0 G; d
- name: 'Google',* b7 Y. i# g) V' W1 H
- url: 'http://www.google.com'
/ {8 u5 X; f2 d - },( Q: i; I. s1 Q8 a3 Q
- computed: {3 |! v' w) K0 P: W, w
- site: {
' ]5 ~! H% ^. p& W; R6 P2 _ - // getter4 Q% b. g, u5 l
- get: function () {
6 Y4 R7 \) Y6 n0 l: O - return this.name + ' ' + this.url
; ~' H1 e& v# z6 b6 i - },
5 m" d9 B( I) a/ a5 E* ?& h - // setter8 b& @% ~% i6 q$ W7 P$ [
- set: function (newValue) {! y: L1 o; [: F' f4 q+ \9 _& ? {
- var names = newValue.split(' ') Y# D# A. s# T' ?% N: x4 N
- this.name = names[0]
6 y, t. a m. B3 n* X - this.url = names[names.length - 1]
' j v |" T$ j - }
" u: f; A& e& v/ s+ m: Z - }# T p# }: \5 A; }# A8 c
- }* G0 i: ~$ M8 s+ [* y9 [8 u
- })
# G, A2 A" h* J2 J l' r$ n+ R( L - // 调用 setter, vm.name 和 vm.url 也会被对应更新# ~" F" s4 A* _$ x% v" c
- vm.site = '百度教程 http://www.baidu.com';
( B9 V& Z0 R" J& x- _& o# O - document.write('name: ' + vm.name);9 i* u& \) P1 R4 Y3 a- A9 u! T4 A; G! ?
- document.write('<br>');
$ m; v- g) x" y, w" X# I" x - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。* U7 ~) W( q& Z! l, F. p# r5 K5 t
2 _" B4 T+ ^8 w( d8 H5 g* }0 c ^# w
: Q1 f* P- n* i; N! K+ i8 ]. B" V4 Y3 }7 K' e6 d3 s; B
3 w" T. T8 K) g
|