cncml手绘网
标题: Vue.js 计算属性 [打印本页]
作者: admin 时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1$ W4 h$ H4 v( T# P v
- <div id="app">
$ j+ S! }8 z: o - {{ message.split('').reverse().join('') }}
; R" A! S, @" h% J - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
4 ?6 u1 o9 O2 z3 a' E- <div id="app">' ?' o: D h% r6 j0 e
- <p>原始字符串: {{ message }}</p>& m d9 B( g! x' g
- <p>计算后反转字符串: {{ reversedMessage }}</p>
, P5 g, H, w; |3 z$ [ - </div>
3 ?, |+ ^# ~6 ], E -
) A, Z8 e( k* n2 n y( }# t - <script>
* d5 t! M* D5 r% z& M# E3 J - var vm = new Vue({! o% W4 j" Y. N' ^: Q
- el: '#app',
* N/ h' w: A' _: }, V$ ? - data: {6 }- R$ J7 l2 w
- message: 'Runoob!'
# i$ ]* Z1 x6 T) O - },
" r( n; p( J! K2 [. w; ]5 {2 e7 N - computed: {
s( J, l& ?) k( O! e( h - // 计算属性的 getter
K. A& l* d* U9 o+ U - reversedMessage: function () {
) J9 B" `- o. @ j - // `this` 指向 vm 实例9 Q9 l+ A8 u; G4 s( `0 D
- return this.message.split('').reverse().join('')
% L: L) F! |& g2 N; }* ^# I% @) k - }
* i2 k: x4 ]& Q' h# I: n - }
" h8 p! H* v$ r( Z - })
. J: S8 V; b5 Z3 ~% l - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
) g+ C" r! V% [9 u- methods: {) R& `1 T; D: @( ^' Y5 {# R
- reversedMessage2: function () {. D- x0 c. q$ V- v
- return this.message.split('').reverse().join('')
5 O! U7 F' D, C/ v) ` - }
. I3 q0 G2 ?. s1 i+ }2 E - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
" G' f+ X: C7 Q- w1 C- var vm = new Vue({- P1 q5 U, z* y+ Z9 K' w4 s
- el: '#app',
2 x1 H- i$ D& c* @' s7 q T* N) p - data: {
X5 S% c1 F, t! b6 r6 | - name: 'Google',
2 Y' Y" m8 Z+ f- Z - url: 'http://www.google.com'7 F8 ]6 o7 ?7 x$ Q
- },
/ p& C' Z; \# ~/ x - computed: {
, P% o5 Q5 i% V e& F; } - site: {
5 \7 U) S7 V1 G6 m - // getter
6 a7 a8 K# z2 h/ M - get: function () {
* p$ u5 s3 _. I5 |. G3 q0 I6 n - return this.name + ' ' + this.url
1 i8 A0 [" p4 d: \9 ?! K - },
+ s( c9 s) ~% V4 k g* n; t - // setter m& H) V+ E# z \8 a& \0 T& Q
- set: function (newValue) {
' b4 w# D4 I" {) B2 F- l0 ^ - var names = newValue.split(' ')1 z" O% W# M7 v: L3 c% X8 F5 R
- this.name = names[0]. j& }9 g+ u) b# I( f1 u7 u: }
- this.url = names[names.length - 1]
. w7 ^3 b! ]- w# _" Y/ u. `; l - }
8 _/ x) F+ Q* y9 m) p4 A6 {! G - }! a8 i* l: e( d5 Y7 p m2 Q' ^( u
- }8 |- i5 w5 [# ~% z
- })% k6 h9 D) L) s/ y
- // 调用 setter, vm.name 和 vm.url 也会被对应更新5 y6 x: w: S5 k7 ~
- vm.site = '百度教程 http://www.baidu.com';
9 j( E3 C! \( m4 r. ?; X - document.write('name: ' + vm.name);3 K9 D4 C# r0 N) {
- document.write('<br>');
5 ?; s' b5 L. M2 K1 ^5 a - document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。4 ^) ~" U$ [: x4 M9 I
E- P' ~5 E0 d/ r! Z- m
: w0 I8 z+ o9 b/ @
* j$ t2 H3 {2 u8 B z! w
- H- Z: F; N( T( g3 Q) c
4 d6 Q3 }0 W7 d) J! a$ P
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |