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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
; S3 R" W0 w% b0 S
  1. <div id="app">" x; C* U1 Q2 L! o# @
  2.   {{ message.split('').reverse().join('') }}
    * P& X2 e) j8 o8 L4 R3 s% J4 x
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 27 k1 t$ ^' f9 Y$ b; M9 a4 h5 e( r
  1. <div id="app">8 V  |: C. D' R9 B, N* K
  2.   <p>原始字符串: {{ message }}</p># D% Z# q: l5 q2 S$ ^
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>0 d  R% b  a9 Z" p; B& @; {: D
  4. </div>* j) q. f  A  E2 S: M! a) s

  5. , X, ]+ _' w- U" ~; J4 E0 {; W
  6. <script>7 x5 M  U' m  p+ ^8 Y/ `, `  W$ s
  7. var vm = new Vue({
    7 v! Z6 r! o" @, v0 d7 b
  8.   el: '#app',
    2 `, f) K6 C9 p7 K
  9.   data: {& R. k% y/ A+ t  ~* ~: L0 Y9 @
  10.     message: 'Runoob!'
      k+ x# d, C* Z8 I$ ?) x5 _4 [
  11.   },
    , @! v. E% `: ]6 y; ]
  12.   computed: {4 ~! T% B, `1 _0 B
  13.     // 计算属性的 getter% v  D& `! P4 J9 v  Q
  14.     reversedMessage: function () {
    8 W6 u1 v  g  h! \& i% A- M
  15.       // `this` 指向 vm 实例
    / d' \) |% y& ?" L
  16.       return this.message.split('').reverse().join('')! i, N+ A- O9 i' E1 q
  17.     }
    3 G+ S) a# r& C+ b8 O- n! C: c
  18.   }
    - U, C6 B( G) ]$ n+ A$ g
  19. })
    4 r! W( L8 U+ f* @( a
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 34 M( x" I/ I5 d& R) q# [. P) B
  1. methods: {
    . n+ T- h5 v* ^( c0 a$ X
  2.   reversedMessage2: function () {
    4 m* w' k  ?) \3 o$ I! D
  3.     return this.message.split('').reverse().join('')
    9 s5 r9 \3 U4 @: _2 `$ I% p2 s
  4.   }  d% U* Q- B) y( z* K6 Q$ |
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 42 m: z7 \2 [, Q
  1. var vm = new Vue({
    " e; C1 B5 z, r. z
  2.   el: '#app',
    ) Q  G# q0 |6 l
  3.   data: {
    + H" f  D  U1 a# T% K
  4.     name: 'Google',
    # p% l1 I3 x. x8 C3 w( O9 g9 O
  5.     url: 'http://www.google.com'
    ( p9 a+ d) m4 h1 J. e
  6.   },
      o4 _& i" Z4 _# i! l4 `
  7.   computed: {
    ( C9 l" B% \8 P# C) i/ N5 t( v
  8.     site: {! z; \. _: \* l1 r# ~2 |
  9.       // getter
    " R5 @% b/ N2 i# Z5 @, Y
  10.       get: function () {
    ( l% T8 ~% n$ w+ r
  11.         return this.name + ' ' + this.url
    3 }: `) M6 m( e( {  T1 P  G4 O! ~
  12.       },* ^0 W1 x9 q" [& I4 G4 P  v" m& `
  13.       // setter8 b& M, Y* b2 n8 s5 U  I5 w9 \  d
  14.       set: function (newValue) {
    ) l7 I1 Z8 G' Q% ~" s
  15.         var names = newValue.split(' ')( s8 a& B* |2 Y+ o) R! W0 h; t
  16.         this.name = names[0]% s$ e3 u' y( ]* b  v6 s' U4 L
  17.         this.url = names[names.length - 1]
      q( B; d. K. V' h6 W; I
  18.       }
    & p* n8 @$ }0 `( n* @
  19.     }  m( F* L7 B( @
  20.   }  w. H2 x, G2 A# J* A  f
  21. })( M2 C  Y8 Y3 @. s7 a% S
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    5 I$ X  `' S; E* `
  23. vm.site = '百度教程 http://www.baidu.com';2 p7 I) U( W6 G4 N
  24. document.write('name: ' + vm.name);: N# G5 H0 U3 L4 M
  25. document.write('<br>');
    7 V( K6 Z; T# C* u0 T" i
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
0 c$ \0 ?. F8 J; v 1 r& `. q" r/ a- o  c
2 [5 ]9 p# ^! B) O7 f( L& P

/ N1 D1 q% y- S; T' J& ?! m# @) I3 _) B+ l' R1 h
3 R# N. y) Q% S! E6 E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:55 , Processed in 0.098978 second(s), 23 queries .

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