您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15621|回复: 0
打印 上一主题 下一主题

[Vue.js] Vue.js 计算属性

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 19 k+ f2 Q# O5 a
  1. <div id="app">$ Y( P7 H+ U* {! r1 X
  2.   {{ message.split('').reverse().join('') }}5 D1 v; g5 p2 r' g) x" l
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
0 M1 c: {6 D2 R1 b0 T0 Y+ S
  1. <div id="app">
    - Q& e( t8 _* I; H2 c9 p8 C. v' v
  2.   <p>原始字符串: {{ message }}</p>
    ! [+ c2 `0 i- B8 V+ _; t
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>+ i5 z4 R+ Z6 i- h5 q  t& |
  4. </div>! g2 i/ X, |3 A* D# b8 D: ]

  5.   K0 A; B% c9 Q' q0 ^% h
  6. <script>$ B0 W* G6 p) t+ A
  7. var vm = new Vue({
    0 ?1 R/ ^$ g1 ?7 M+ s6 a* W
  8.   el: '#app',
    ( ~7 o# ]2 q0 e; S8 Z# h
  9.   data: {
    6 `9 p9 K) p, X( X
  10.     message: 'Runoob!'
    3 t0 Z7 O& T8 i: I! c1 Q' _$ E
  11.   },
    4 V& x8 |( X2 m& {8 g0 G
  12.   computed: {
    5 o+ G+ t6 j/ p0 N, `. H
  13.     // 计算属性的 getter
    ; [3 [5 I) Q- `6 z6 \
  14.     reversedMessage: function () {
    ( d4 u3 Y# p9 i  O% P) R4 y
  15.       // `this` 指向 vm 实例4 L- t! x' V' g# c8 ^, n
  16.       return this.message.split('').reverse().join(''): B3 h3 h3 M5 e7 k  x  E$ }
  17.     }7 g8 e' i, H: Z( e1 A4 z
  18.   }
    # U+ |6 e, g# K2 e% u% v! F
  19. })  D0 x2 w! n8 d
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
% ]$ p) ?4 O! K/ |! Y
  1. methods: {  v5 k$ a) }- o0 w% W/ g. P
  2.   reversedMessage2: function () {5 }9 ~$ `% t! e
  3.     return this.message.split('').reverse().join('')" ?( t. |* L; _; e
  4.   }! E+ x. }, F# r4 B4 Z/ h
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4, c6 O" p" R" f% c+ Z/ P. R
  1. var vm = new Vue({
    + Z6 J# I+ o% Z! A8 @
  2.   el: '#app',
    & `$ F3 p4 S7 k8 X$ m/ d
  3.   data: {1 U6 F0 h. [  f* p
  4.     name: 'Google',% F; g  ~) D1 r$ B$ c/ D
  5.     url: 'http://www.google.com'
    + U- S2 Q* {; p* g
  6.   },4 S( R* U8 L9 v
  7.   computed: {# u$ ?5 e1 Q9 d' x! ^
  8.     site: {
    ) j3 i3 ?/ l& A! T
  9.       // getter
    5 b+ j. O+ I9 d- E; i. w" n1 w# n
  10.       get: function () {  M8 N/ \+ l$ O( I, I8 R+ D) o; s
  11.         return this.name + ' ' + this.url: q& @- `+ O( l3 s/ }
  12.       },
    6 s1 B* y  S( _+ p
  13.       // setter
    ) u" L' g* W$ E, W% A! ?
  14.       set: function (newValue) {+ Z9 L1 V6 z' l1 [0 n; v8 k
  15.         var names = newValue.split(' ')- V, B/ j3 x  ?* z6 K. V
  16.         this.name = names[0]5 W# j6 z3 a( o+ \
  17.         this.url = names[names.length - 1]
    ; @- s) X* F0 {' q6 K5 a# t6 E
  18.       }2 v- B, J0 b1 F, T; ~* y
  19.     }& X. P7 @' `$ X7 A0 d
  20.   }
    - h) u+ U# @& C* S
  21. })
    % |9 A' C4 k$ y3 ]
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    : ^/ d9 ~1 _# `9 r; ]/ H8 G- m
  23. vm.site = '百度教程 http://www.baidu.com';
    ; |6 N8 W7 ~+ {1 F
  24. document.write('name: ' + vm.name);1 P% y0 s- Q0 e3 p# l
  25. document.write('<br>');* z5 W5 {8 m# g0 h4 G
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
) v! X( o; t  W0 {0 V* M & ]; d: b6 L: v( y, L
: |8 O) A* B2 R' Q# Q, x4 [
' z/ N: B3 T4 J

: G! l% [6 A. D. @" F( x7 O; T0 c6 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 17:34 , Processed in 0.059944 second(s), 22 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!