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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
0 @1 o& R9 h5 U0 b! h9 l  E9 y
  1. <div id="app">
    $ z3 U- o8 C* C' O$ a/ r3 d9 O
  2.   {{ message.split('').reverse().join('') }}
    ' l; X* @0 E! M6 r$ E5 @! a+ R
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2% D! B& V9 Z9 m) n8 z" x" s- s
  1. <div id="app">
    5 }* J* a6 Q* G4 q+ i) P; @8 ^2 E
  2.   <p>原始字符串: {{ message }}</p>
    - ?; G' ?9 Q* N0 F- U* Q0 Y; z
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>: F' |6 D& P2 w' D
  4. </div>; D) k) }( X' z  V

  5. 1 C/ f( C" v- f- a3 s
  6. <script>
    ' R. k+ L. k6 v# ?) p  p4 A2 K$ b
  7. var vm = new Vue({- o* I6 E& f; ^9 W
  8.   el: '#app',
    " S- {# X$ e/ j. e4 B; C# u
  9.   data: {0 }  C- B' A) B5 ^
  10.     message: 'Runoob!'$ w2 s% E0 m. l' B! A5 _
  11.   },1 `6 M2 E3 q- _/ y  S2 E: S; G  E
  12.   computed: {
    & @4 O5 [1 ^* i1 b: {
  13.     // 计算属性的 getter
    ) u5 X/ X6 X) O9 e$ f  U7 ]& D$ T
  14.     reversedMessage: function () {5 [& e- H) c' J' r0 U( t3 \
  15.       // `this` 指向 vm 实例. z- e+ a8 T* h
  16.       return this.message.split('').reverse().join('')
    7 v! [/ U# H% |, w
  17.     }; j0 t+ V, L, y
  18.   }
    3 x) V+ H* O* A" ^) H
  19. })! u+ n& |; t9 `0 m3 D4 @
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 39 q. F; G% J2 y, r
  1. methods: {9 D2 O- Z1 h0 J( @, L2 g2 i
  2.   reversedMessage2: function () {
    ' f& f7 L' J( t
  3.     return this.message.split('').reverse().join('')
    + U% V! y: H! z. P
  4.   }, r/ z' x/ m% U: H3 G
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
3 W  S# A' E) L% v
  1. var vm = new Vue({
    % S2 F; O* s0 a. |
  2.   el: '#app',
    " w9 o, a0 o0 @! T5 l( C, U
  3.   data: {
    9 m+ |( M0 u- J
  4.     name: 'Google',
    + d; A5 J1 r1 y1 \! Z+ U# e+ ?
  5.     url: 'http://www.google.com'
    ' m9 _. w3 q% E
  6.   },
    / x  F9 k4 P; D3 a$ a9 Q1 @5 w& C
  7.   computed: {2 n" m6 D+ z6 r# e8 v5 b# n) o
  8.     site: {6 S9 N. c/ m% h6 g9 s
  9.       // getter! ?+ ?6 j* e+ C6 K, Q
  10.       get: function () {( ]$ ~# i4 _! L; F+ n* |+ s
  11.         return this.name + ' ' + this.url, o! k2 m- q$ v% L; Y
  12.       },
    2 ?% Y. E8 A7 X: l0 Z' v$ S1 [1 m6 |
  13.       // setter. l& J6 L; w: d/ s& j
  14.       set: function (newValue) {: |% ^8 k. H8 @# d& x
  15.         var names = newValue.split(' ')2 L; ]' ^' e9 g8 N' X8 E, b7 s* e
  16.         this.name = names[0]
    7 r$ v% z6 V; ?5 H; \; E
  17.         this.url = names[names.length - 1]
    * K0 q+ [# |2 s7 e$ p7 @& k( q
  18.       }2 r4 z1 Y* c6 s! N) B, Z1 W  }6 @
  19.     }) I7 c7 P2 {* q0 d  n% C
  20.   }& Z1 i* b! x0 L1 T2 W0 Z. E
  21. }); R; l7 g9 j. t, V& ]; U. O0 @
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新, M! V) T+ K# q8 ~  F+ J9 t
  23. vm.site = '百度教程 http://www.baidu.com';2 T# [7 V& K4 X# x/ C/ }' n1 X
  24. document.write('name: ' + vm.name);
    ; G3 P/ d' d" ^, N  c" h
  25. document.write('<br>');% y( N( ~% u" Y& t0 L& Y6 g: Y
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。8 R1 F( v- X9 f/ R7 E0 C8 O7 n9 t

( E* N, n& f- ?2 [) T" [; K* K* W( h- T  K4 o
; z" U5 W4 x7 b' a: H- y: g+ l( m6 U+ J! B

' R$ Q9 D7 G8 i- m" E+ P( y# L' ?/ W' h$ t' m5 J1 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:31 , Processed in 0.052015 second(s), 22 queries .

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