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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 13 e- s. j. p( Z) x4 ]% O" W
  1. <div id="app">) N1 H7 E; M2 d* X1 b' S) G
  2.   {{ message.split('').reverse().join('') }}
    3 Y( i2 l: P! \4 f, T
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 26 e- G. N+ {4 g+ k- [0 d
  1. <div id="app">
    & F" |, Y. V" X! a) y
  2.   <p>原始字符串: {{ message }}</p>7 }. z$ O8 M/ ^! |4 T* k# h" u
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>; G' n# `8 v8 O0 L2 P" V. w
  4. </div>" D3 {0 e1 G; q

  5. 0 ~" \0 Z/ W6 y0 ^* W+ m; G
  6. <script>$ F# _9 E: b/ q, _6 f* O4 W
  7. var vm = new Vue({
    8 r: k7 R$ g2 W: L) W3 Y( p5 N
  8.   el: '#app',
    3 i+ E& G) A* v4 B7 r+ d7 M. b
  9.   data: {
    3 l1 m& \( w7 b' }$ x
  10.     message: 'Runoob!'9 n. {8 j1 L  g+ R0 X8 Y3 u% l, ~
  11.   },
    * k1 A5 e; w0 @, z* P4 t  x
  12.   computed: {" s0 U6 P3 ]% \* ^
  13.     // 计算属性的 getter
    : N0 W  U5 V8 q. m' a5 F/ k! }( _
  14.     reversedMessage: function () {3 Y; Z/ v; o- k, q! e5 n& s4 \% w
  15.       // `this` 指向 vm 实例
    3 w/ L' B. n7 i" X9 Y: z
  16.       return this.message.split('').reverse().join('')6 a9 a" i8 e7 L+ ]1 V0 f' N, M8 r4 W
  17.     }
    0 {5 X( ?( x2 U" m, l
  18.   }
    ; G5 S, b+ ^! K- C/ @
  19. })
      O- B- U( {( h* y# R# _
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3! H6 ]$ H' I; h# D, t
  1. methods: {1 ?  c& w! m' s, N$ S
  2.   reversedMessage2: function () {
    . K% x# ~9 B8 L5 z2 `0 U1 X  E  {; q( g
  3.     return this.message.split('').reverse().join('')
    8 k! c1 I( I- f1 A
  4.   }6 |: ?6 s. S5 m
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
& C( x- h% T. }# M
  1. var vm = new Vue({
    ( L5 C( k2 z1 G) b
  2.   el: '#app',
    9 i! n; O3 w. }2 v7 z  Q; z8 p$ Y" q
  3.   data: {8 X! ?9 d# T1 {" A
  4.     name: 'Google',
    , ~" |: ?* U* }- K+ j
  5.     url: 'http://www.google.com'
    ' y9 B2 C# w3 N2 A$ h$ G5 W+ S( L
  6.   },( ^2 A: O9 q* B1 {; `
  7.   computed: {& a  q, z6 ~  r; U# x
  8.     site: {* B4 h6 ^& M+ O' `) m
  9.       // getter  d; G3 @" m% X, w5 f" i) r. Z
  10.       get: function () {
    ! F3 K. F. ]. e3 n
  11.         return this.name + ' ' + this.url
    , L. _" i- `( w& o
  12.       },
    3 M8 I1 Z$ @2 o5 v' o/ N
  13.       // setter
    - K" o( d. T6 C7 ?
  14.       set: function (newValue) {; }! `6 H, U( I) g, J
  15.         var names = newValue.split(' ')# |8 M! V/ w  O+ ]+ ~0 v3 u( c
  16.         this.name = names[0]0 y7 Q$ C. S1 Y1 a0 E. R7 ?8 e
  17.         this.url = names[names.length - 1]
    : L  b% B$ n7 L
  18.       }
    - @6 y) w+ D' r' ~7 E: x
  19.     }
    ! z, q% A- I8 F
  20.   }
    0 C. e, f0 g5 R$ R
  21. })) B3 N  l$ b( x! M, \. H+ W
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新' X/ h0 m5 T* O
  23. vm.site = '百度教程 http://www.baidu.com';/ X) I1 S% y* O' Q) J1 M2 _1 r/ _
  24. document.write('name: ' + vm.name);
    ! U6 k% ]! X* a* ?: u# G9 P
  25. document.write('<br>');
    1 D$ b2 d7 ^9 R
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
; y, T7 J( Q5 \! ] 4 J9 c$ ~& }  h2 E7 G2 O1 [

" I3 q. u0 v' T9 C
8 U+ V1 [; C- c
3 V+ k5 m7 C3 n4 S
1 b' J  v- k6 {/ v( w/ b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 13:37 , Processed in 0.061754 second(s), 24 queries .

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