cncml手绘网
标题: Vue.js 计算属性 [打印本页]
作者: admin 时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1) m' Q3 ?2 V6 k& w9 |! x
- <div id="app">2 s( G) ?" P$ d7 Q8 w' \0 \
- {{ message.split('').reverse().join('') }}: {$ l. ]9 e. N5 u* w9 T
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2& g) |* U* C/ y* t' D) k' |6 l
- <div id="app">! f2 T% B. e% U, G7 K) j7 F- l; N
- <p>原始字符串: {{ message }}</p>
0 Q8 A% Q/ H! I F! w2 y* y) M - <p>计算后反转字符串: {{ reversedMessage }}</p>
1 a ?6 O& h% J H8 H4 w' s8 I; u; Y - </div>
: X6 Z/ \! n, M- j, ~" p* N1 w; \ - % P/ _6 j3 W- y8 t* G k
- <script>- a' T2 V1 b9 f2 s7 e. z
- var vm = new Vue({
$ w0 `. v G# s: | - el: '#app',8 Y0 x3 W" u" m) b: p( A
- data: {
3 F$ q2 Y& Y2 x7 _' K - message: 'Runoob!'
3 u. z. R% u. |( S7 u - },
, \1 V Q" L5 n. A& Y+ } - computed: {
6 I! I9 ~/ h) R; O - // 计算属性的 getter7 M; B h5 i- a! F" T' J% |
- reversedMessage: function () {! d9 X& ~- p" b/ p8 Q
- // `this` 指向 vm 实例) k- r7 B' [. [5 g
- return this.message.split('').reverse().join('')) o2 F- I s9 x& L; o) n3 J) ^+ x
- }
( v4 _- y' C$ e# B+ R5 l4 E. @ - }8 p r5 M5 j% I! X) |
- })0 Y( ^8 w% L/ p3 V1 `
- </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
3 w, U6 y! s2 i) p- methods: {$ D5 e' i* R1 ?8 }5 |# t) S+ h
- reversedMessage2: function () {$ ~% H5 ^) [, U4 I' k& K0 z0 Z9 b$ n
- return this.message.split('').reverse().join('')( D" }3 y" D6 s% v2 L- \
- }* Z+ M7 z* v8 `# U+ ^# @
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4. o3 m* B, a: c6 o* \; K& D
- var vm = new Vue({
J F( ^; ?! D d# e% L {3 M1 w V - el: '#app',
) v0 H. ~) |8 c' P; o A+ U! ` - data: {
+ c+ E ~" e0 _* { [5 k9 _" K - name: 'Google',
% P# O$ j& ]# R7 B# G- M7 Z8 c5 x: `$ h - url: 'http://www.google.com'
3 N4 {) O- E1 h7 {, R% f - },
8 Z- ]% b* E8 ?) |, |( R - computed: {
) B! u4 @( Y; A2 D1 I - site: {6 {; Y( G" G' I. z- n4 v
- // getter
8 t& u# d+ K/ S3 P4 k* t) Y - get: function () {
1 D/ T1 e' l8 Q8 X+ S( \8 s - return this.name + ' ' + this.url9 q" b" ?4 X# H3 ?- n8 [) [
- },7 F% x+ t/ c4 W
- // setter% N n. s" t$ }8 d0 T
- set: function (newValue) {
2 @" ]/ F, [5 S9 p6 M - var names = newValue.split(' ')
, d \! l3 ~( Z* Q - this.name = names[0]
l3 ^+ ~% n! \ - this.url = names[names.length - 1]
4 p: o" W& Q& w - }; r: i6 N: ^3 M& q1 L
- }
/ i, ^/ v% I, i8 Y+ K7 V, Y/ \' Q - }+ o; d3 }9 ~7 I. u( X% ^0 B$ T
- })( ]1 A) w7 ^7 N+ |
- // 调用 setter, vm.name 和 vm.url 也会被对应更新
, a- m; C' \$ [4 k+ g- K0 G$ H - vm.site = '百度教程 http://www.baidu.com';
; |& }- e6 M& |# @ - document.write('name: ' + vm.name);
# Z3 c0 _5 p9 y. F0 E - document.write('<br>');. H- ?) q) @" K( W. W
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。9 E! E0 N5 i) ?4 T" J2 ]/ N
7 o! s3 y1 i1 y, O% } D# l* p$ ]/ J+ A+ o, V3 O% @$ D
+ @. l; i6 L8 b1 R, Q; \& t4 T( s
% }! }1 q8 y1 x4 Z* u) n% ]
4 x5 J" N. F0 J- w: V
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |