|
计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1
, C: S- Z8 K, v' ?- k6 u- <div id="app">
% y1 Y" o0 i' u1 a7 n) @$ `( c0 [6 ^ - {{ message.split('').reverse().join('') }}/ U$ B" n* [- K" A
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2( B9 I& w, |' j- Q1 C3 F+ k8 d P9 o
- <div id="app">3 p' C$ B6 t; h1 d
- <p>原始字符串: {{ message }}</p>/ f7 I0 s' v; x( Z* ^
- <p>计算后反转字符串: {{ reversedMessage }}</p>
& h3 G6 A* ?# C" e, o1 ? - </div>
5 o7 v* Y0 g/ ]; ?0 B9 a3 j/ P - 1 [ I7 @' t3 b6 i2 ^
- <script>
% E' B9 o! C$ n, z( a) M - var vm = new Vue({
& _% V3 ^5 ^7 Z% | - el: '#app'," J7 t: d4 d/ p- b/ w
- data: {$ w, s3 F3 [. U8 [0 V* K. v5 |5 ^
- message: 'Runoob!'4 ~* K3 J8 `6 w5 m: J" h
- },
6 p0 S5 m( b- I2 A' a8 I6 p - computed: {
% r3 S) I9 U! Z9 r - // 计算属性的 getter4 u' ?" d" U- T8 h8 g0 H
- reversedMessage: function () {
9 h ^5 i. U- c0 a, r - // `this` 指向 vm 实例
: ?2 J2 Y0 E* t- X - return this.message.split('').reverse().join(''), V# X# _8 @) s. Q0 a
- }
. i3 v* {1 }$ z3 W7 {' ~, w. y - }
5 W4 M K, k7 \7 ]. h - })' O& @' d1 v, C
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。 提供的函数将用作属性 vm.reversedMessage 的 getter 。 vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。 computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。 实例 3* o! J$ r( P: q" i
- methods: {4 z. D) g1 B. K/ o
- reversedMessage2: function () {, K1 ^+ W0 j4 k6 K
- return this.message.split('').reverse().join('')
3 S% d& I. j j; B- ` - }; A7 i1 I- L: k' i. E( _) |
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。 computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter : 实例 4) y6 y' U+ C( g b: C7 ~- z
- var vm = new Vue({
( l! u& Z; W. V2 s: u/ R - el: '#app',
/ V a/ t& u/ z9 U! E+ w - data: {& T: R1 Q. i* v) |% L9 R
- name: 'Google', \/ K( l/ A) r' i" ?' N8 T
- url: 'http://www.google.com'
: T, O+ W/ J2 r" } - },
$ S, a6 f# s) s* D6 i - computed: {8 X0 p% g; g! s1 G
- site: {0 \5 Q6 u; F/ ]" R% s5 j* {
- // getter. z4 p; c S$ X- u* X
- get: function () {7 ?4 A: A* H. ]* |1 \
- return this.name + ' ' + this.url
- f# U! {1 b" A9 u; O$ Z - },3 F! l" }$ l [+ O5 M
- // setter4 E2 t, }$ e% c* G2 _
- set: function (newValue) {: ~; K. L/ _0 L2 V# q
- var names = newValue.split(' ')
, O+ z- a U+ e7 e0 S8 C - this.name = names[0]
8 i, A& H2 @2 q5 e0 w - this.url = names[names.length - 1]/ v$ G+ f5 @3 H9 w3 X! w
- }' o8 x5 {( Z: H4 @ |3 C% i
- }. U e% u& C s1 H# G7 `
- } K @* k! Q. M: X2 L2 @
- })
8 K% X9 R9 h! U& H - // 调用 setter, vm.name 和 vm.url 也会被对应更新
# }1 L4 F$ [3 z0 _" { - vm.site = '百度教程 http://www.baidu.com';9 E$ f+ U! E6 x/ G
- document.write('name: ' + vm.name);& x( [+ B/ b3 W# [7 Z
- document.write('<br>');$ d) q$ Z' i4 i" v6 @) A
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
- O/ e0 S% R% I c
* g' m) w& |. a# `" y) y
% S+ O( V8 e4 j5 d3 N8 U
. k% `- q- q6 G$ H* f0 m
- h. H- `; n+ ]7 N' n& Y5 o: m4 F/ b6 k- H$ V i7 o9 Q" {
|