cncml手绘网
标题: Vue.js 计算属性 [打印本页]
作者: admin 时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1- X2 h/ S4 n6 K
- <div id="app">
/ g2 n$ H. y y, K+ R8 Q2 R - {{ message.split('').reverse().join('') }}
7 u% d. z- F% A7 A0 e" \0 P9 H8 g - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2+ e2 O% s+ \6 ~" |
- <div id="app">
" C* Q) y+ Z+ ] - <p>原始字符串: {{ message }}</p> G& [6 P! ~3 R: K: O- P' F
- <p>计算后反转字符串: {{ reversedMessage }}</p>
( }; H; {, Z# P" W0 _3 n) Q, ?; p - </div>$ m/ ]! Z- N$ N* H
-
' a. t5 b7 s/ h$ a w - <script>
F. s! ^9 R* u5 n5 d: \ - var vm = new Vue({
' ~$ j! V. E0 ] - el: '#app',
# u1 Y0 B9 R( Q9 c - data: {
' s, n* x- k( n! @' K5 S - message: 'Runoob!'
! W' n0 Z9 U- S3 a3 I2 Q - },& }! F) a; _9 V
- computed: {
" }1 Z8 J8 N* n - // 计算属性的 getter
; c7 m2 M' O5 } - reversedMessage: function () {
e3 c- J2 l7 M - // `this` 指向 vm 实例1 } [! o# H6 H
- return this.message.split('').reverse().join('')/ T0 y. n8 z* d3 q
- }
' t. _- _+ H# w1 S! Q" A - }- \1 { u$ D- I, h$ g( n5 z
- })6 B* q5 M. ~. I& r
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
4 F8 J+ y4 _' H% ^- methods: {
1 i9 j( J7 |" c& Y- U0 } - reversedMessage2: function () {" X9 ]# b( P$ n' I0 @
- return this.message.split('').reverse().join('')
' E6 H% m6 G0 i% T - }1 n8 R+ k6 V; b9 l- J! l! [8 W4 ?
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
: A7 D: _; \# q, P$ K4 i- var vm = new Vue({. P& ~. ]. {( c% @8 N
- el: '#app',/ Y; T ~$ H! R! ^5 }! s9 j, {1 ?( e
- data: {* T1 w2 @1 D3 G( N
- name: 'Google',# l( u% n0 k0 y) z- J0 F; p& Z* P
- url: 'http://www.google.com'
* B# r+ s; S. L( k% M* u - },6 o% C G6 y. p k# y% i
- computed: {; c- l2 D* _, N/ M6 U6 M
- site: {
+ `( E4 @& f! m L4 L; Z - // getter
2 o% d3 l2 o* l5 W- j- p - get: function () {! x+ J9 z9 |4 {" u5 \/ G
- return this.name + ' ' + this.url W& N& |, I% g) l* e3 {" ]7 v
- },% M$ m7 x4 b' \% b1 F/ T) ^
- // setter7 D2 w2 w- K+ q8 o
- set: function (newValue) {: ?% \4 {0 C$ E7 ]0 f
- var names = newValue.split(' ')
7 c; ?/ {. y3 i. `/ h' g2 t - this.name = names[0]
9 ^9 l* n- K* [, K) ^# r! L - this.url = names[names.length - 1]( l3 `- Y1 ]' u# e3 T
- }
9 I9 ?" @# u# W, N- V - }
5 i4 w1 O$ ?1 S+ v) U0 t, i) ? - }; M0 Q: x3 q9 e: N" W( r6 c9 C
- })) Y& ]* T1 R! d, r6 l
- // 调用 setter, vm.name 和 vm.url 也会被对应更新7 q, _! J+ F8 b* X6 i6 l8 v0 N
- vm.site = '百度教程 http://www.baidu.com';
' Q3 i+ S6 d0 j( G - document.write('name: ' + vm.name);7 a% U# e4 `% }. S+ h
- document.write('<br>');$ B7 l& \7 F1 z8 Y
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
% B: F, ~4 R+ Q. W. r% C
) u0 O5 r) d5 b1 k% a, _
" n( a& P# I1 Q" \( O4 f1 _8 q3 ?# n( c# H, r4 K) ~0 D
6 V4 m; o' R" J9 S" Z% h* h
& [# B9 K; o8 ^ b4 g
欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |