cncml手绘网
标题: Vue.js 计算属性 [打印本页]
作者: admin 时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1' J" d3 I4 z+ {/ }$ s/ ~& J0 ]( j
- <div id="app">
9 _" }; n, |3 r' i1 U: k, M - {{ message.split('').reverse().join('') }} R2 E" @# @- g6 c
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
9 z) ^( h$ F9 i- <div id="app">
9 m2 D$ n+ a% f5 v( t$ z6 F, X/ d - <p>原始字符串: {{ message }}</p> f* w# ~3 o7 X4 n4 S* i E1 m
- <p>计算后反转字符串: {{ reversedMessage }}</p>7 m( ^# r- [( X- a* b
- </div>( p6 U4 Q, H% B* [% X
-
) G. \$ t9 h7 A$ G! H/ M$ @" A8 M - <script>3 m. R0 h7 L& i3 F. ?
- var vm = new Vue({ U) N3 A* _9 S+ s) J- t' ]
- el: '#app',$ z+ H; G6 J. z- T8 B) R8 [
- data: {
/ q4 q1 Q% i9 P5 ]9 C) o4 | R - message: 'Runoob!'
% x Q+ j1 D: K: j( i - },' W! _( \: z* b4 \( ]0 Q0 }
- computed: {
9 ~9 Y) T% o+ i: h! p$ B - // 计算属性的 getter
2 D, u2 M3 G; |; g$ E - reversedMessage: function () {" Z: @& f' w0 E M
- // `this` 指向 vm 实例, u1 U$ ^: L3 x
- return this.message.split('').reverse().join('')1 V( u; c. O* ~6 Q5 B7 Q. c
- } v: N9 J! r/ o7 m# k; A
- }
. U3 _, a! v0 z% o) R5 ~7 P) g' l - })7 H' X4 d k, g
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3: b: L, B7 h: J6 ]
- methods: {1 A. P, x1 c, p- i3 b7 i
- reversedMessage2: function () {& x/ g2 S1 o# B7 }+ T# }
- return this.message.split('').reverse().join('')
& p* j& \8 i p' M2 y8 U- E+ y - }2 b: a; ]4 e9 P
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 46 b9 U) \4 a+ B
- var vm = new Vue({7 T8 D) |, P$ O5 H4 o. M
- el: '#app',
2 D1 z r2 V/ R1 ^ t - data: {2 w( @5 }1 Z, j4 s
- name: 'Google',! R1 P2 L5 D$ k* n# G
- url: 'http://www.google.com'9 S0 l7 n5 Z7 r9 Q* v
- },
& @& n8 w- B. _( v- n - computed: {8 F# _3 P1 v; g. w) l# P; x" _( r$ g8 ^
- site: {
# g- q/ T, X% h2 h - // getter
+ b2 ]( c- b3 I - get: function () {
! b$ p8 P5 [$ H) K, Q$ u% [9 ` - return this.name + ' ' + this.url1 h" M; O' Z$ X+ q& b
- },; g, L+ z3 K- l
- // setter$ P2 J" _' y% I. F
- set: function (newValue) {. v8 D! q; T z" D9 z0 [
- var names = newValue.split(' ')
' g- d' E7 g: C; x - this.name = names[0]8 V/ R4 \( @1 l w. ~. J
- this.url = names[names.length - 1]6 O( `) O. W+ J1 y; ]6 F7 G3 V
- }
5 O1 H ~) Y ~4 N' J1 O - }, s% \3 J4 L, H& o- U- W
- }+ f S' G% U" u& i- d
- })& a! I( H1 r) y! j, v t, [0 f
- // 调用 setter, vm.name 和 vm.url 也会被对应更新' J: Z& Q4 h8 A" l8 x
- vm.site = '百度教程 http://www.baidu.com';
/ j7 M; @) I8 ]3 Q9 W8 p - document.write('name: ' + vm.name);
( j: v& R p1 Q" S9 G( C. e+ ~ - document.write('<br>');
/ ^ F0 Z8 g8 O - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
, Z' S6 g1 C) l, J- v
, B$ |# {$ d3 _% C( K( h x
6 @0 M9 I& X$ H1 Z+ v
- I5 a6 r2 K0 K6 C; Z$ d" k# s
+ j, H% k/ v7 M! p& J% u
. }8 P% X' _. Q, G( w& h
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |