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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
- |, V8 U( s7 I/ v; y  D
  1. <div id="app">
    # [$ W+ ?- D" w. A% F- O
  2.   {{ message.split('').reverse().join('') }}
    # ^9 P; Y+ N5 }6 D
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2( i% x( h. B: D' ]2 `
  1. <div id="app">
    5 Y+ G9 _. \# M  u
  2.   <p>原始字符串: {{ message }}</p>* M6 Z" H( x* P. @* O* a
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>: @5 i4 t/ _& [$ w/ h
  4. </div>2 A1 Q7 x, K, m! [" `
  5. 4 p/ z# d0 I3 N& @+ q: N- ]
  6. <script>
    7 k6 Q4 X3 S$ C$ r7 C
  7. var vm = new Vue({! ?" b! B3 H$ F+ ~; {! g- @
  8.   el: '#app',
    , G1 }* K8 t7 x
  9.   data: {
    2 q0 D7 k+ L: a- V) \( D5 t, s
  10.     message: 'Runoob!'
    % z: v& f/ t  T
  11.   },0 d/ d8 v& Z3 k6 u: N. H
  12.   computed: {
    # M# l4 B" P3 _3 j- a
  13.     // 计算属性的 getter
    3 k: }4 U, Z- ^# D8 U0 ]
  14.     reversedMessage: function () {
    " ]! s3 z- e$ l% h& k
  15.       // `this` 指向 vm 实例
    6 r9 O8 y* t2 P6 O" E3 i
  16.       return this.message.split('').reverse().join('')/ ?) v' \- E" p& @+ b" l, b0 x0 E
  17.     }7 X6 x7 B0 H9 w4 L6 z
  18.   }- e0 z% d$ B1 b1 H3 Z
  19. })
    6 c4 H# ~4 c, }
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
- g9 t- g0 I2 x/ ?6 g  D6 ], J
  1. methods: {
    2 j" b4 O5 d( W8 S
  2.   reversedMessage2: function () {
    0 g+ Z& P6 h. {! w) |, D+ c- z8 `
  3.     return this.message.split('').reverse().join('')) o3 Z, X( |" p' X$ w5 V
  4.   }7 \& x1 u4 f+ p& T6 f
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
/ H/ G6 T' {" [: h; J  ^) ^
  1. var vm = new Vue({* o2 ~1 J( b/ z8 x. `8 q' H% }
  2.   el: '#app',
    # J+ ?+ A8 ~2 M! t6 q
  3.   data: {. L; g2 c" c/ J
  4.     name: 'Google',
    5 c, M3 z+ Q/ Z0 P" ^3 ?5 @
  5.     url: 'http://www.google.com'3 Z5 e- H- v! p, N1 V
  6.   },+ V6 g/ E  H) x- z, K
  7.   computed: {& @& M2 l4 H5 o/ ]) ~* |
  8.     site: {
    + Q2 U( G; G' L$ A; f
  9.       // getter. A3 X: R& Y# [2 N2 i, I% u# `
  10.       get: function () {7 `% S' A% W) z% V( y- G3 g
  11.         return this.name + ' ' + this.url
    % Q4 ]# _! M$ g* I. ?7 l
  12.       },
    8 U& j! z; n3 c8 Q
  13.       // setter6 `/ m+ z: C  g* n
  14.       set: function (newValue) {+ B9 j0 x8 N/ r3 A
  15.         var names = newValue.split(' ')
      u* q( u! n+ n1 h* y" L
  16.         this.name = names[0]
    3 v: ~/ d2 l; h- ?
  17.         this.url = names[names.length - 1]
    + u: V* B4 Y: Y. n+ O. Y
  18.       }
    / k$ J5 j. o: D. M  [" k* I
  19.     }
    & T6 u) U1 E. [; ]0 U9 j
  20.   }
    % }) z$ a) Z, k2 h$ l
  21. })
    7 p$ i3 `& P" e8 F  m- y. P4 `( ?
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新2 T# F1 j. p6 J# s
  23. vm.site = '百度教程 http://www.baidu.com';' H: y/ [; _" `, d9 x1 H
  24. document.write('name: ' + vm.name);3 _0 E, ?9 s, S+ E& ]1 H8 e
  25. document.write('<br>');9 R  R" r) f- n8 q5 o8 f0 S
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
  F" N8 Y3 x' u9 \
3 w" \# t# L# q' Z7 g) v9 x& h& B6 n, |
; ?( x- u2 X! F* v( J2 e8 x7 g) y
: |& e. s; j: U( t2 e

$ }" z0 ~& a! H1 Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 11:36 , Processed in 0.058031 second(s), 22 queries .

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