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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
6 h1 L! Z* O" X: b
  1. <div id="app">' @) ]% u) L( J# ]/ u
  2.   {{ message.split('').reverse().join('') }}
    , L  K* X! [7 ]1 Q1 B) u: w2 S
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2/ E! p# g; X! }. _  s
  1. <div id="app">
    . ?$ _- O. |. q: u5 G+ r" N
  2.   <p>原始字符串: {{ message }}</p>
    + M7 P1 X. T9 \& W) {  w0 N; i
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    ( u9 y3 W% D: z! R3 [; K, k. F
  4. </div>
    " _* W" F  k5 h" ^) ]4 @2 n$ F+ l
  5. ' Q" X) d' J8 y5 j4 S2 `- v
  6. <script># g( u3 P8 F; ~( H' O: A8 D
  7. var vm = new Vue({$ }) }4 ?' Q9 R; [( B6 D1 @
  8.   el: '#app',+ F: w- d2 X! |6 B% h/ K. J/ `
  9.   data: {# I* u( T  n9 S
  10.     message: 'Runoob!'
    9 ]; g  P( x+ g$ i2 F
  11.   },
    9 g, q3 \( N- R2 ]* f) V
  12.   computed: {
    2 v$ x) n/ F1 q* A2 h7 i
  13.     // 计算属性的 getter3 s. o* z% U% g, D
  14.     reversedMessage: function () {
    % l( @# m' E- p* C# Y  `0 D$ p
  15.       // `this` 指向 vm 实例/ s* }& u& @. N. U+ g
  16.       return this.message.split('').reverse().join('')
    + [+ g1 u6 p" s3 u
  17.     }- s! U7 t( N/ U( K. D3 X- n* x
  18.   }) Z9 E- X# u9 v9 L2 V$ ]
  19. })& I" @' Y7 o2 I( Q. i2 [
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3. c" i* V3 C4 I/ M6 g
  1. methods: {
    1 `9 ]7 f' G/ O
  2.   reversedMessage2: function () {7 Z) d5 U- X9 B
  3.     return this.message.split('').reverse().join('')
    ) B8 r. R0 {$ R+ _$ P% s
  4.   }
    8 A- g# m2 m$ z3 g' R2 P; T+ A' Z
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4+ n% D- z2 Y$ R" i3 P
  1. var vm = new Vue({3 `: _- U: L3 T* e3 [
  2.   el: '#app',
    $ m7 X2 o2 B: E$ X/ j, q
  3.   data: {
    * [3 e. G. ?3 s2 r. \
  4.     name: 'Google',: s7 B5 t* i/ v& h# C3 W
  5.     url: 'http://www.google.com'' o4 O- j0 v" s" h' l6 y
  6.   },
    , g7 P$ w. J" Z7 K
  7.   computed: {
    6 \" H. Z3 [: p
  8.     site: {# U5 t  z" |* m9 \
  9.       // getter6 ]8 R1 X+ \  w: ~' K6 j7 e
  10.       get: function () {: M. P9 J" {+ H* F3 e/ y6 w
  11.         return this.name + ' ' + this.url9 S, L% ]$ P- w0 |' K/ V
  12.       },& }9 y3 M2 `5 m! O1 x/ T
  13.       // setter, e% ~" o& ~5 f* `; p
  14.       set: function (newValue) {
    4 T2 z+ n7 J# X2 X' v
  15.         var names = newValue.split(' ')
    , a" I3 J0 }) }9 K
  16.         this.name = names[0]8 J6 T6 V2 j( v- S  [; d
  17.         this.url = names[names.length - 1]7 F0 L% o; i* F6 ~$ \: O  c- a' F
  18.       }
    * G4 Z- S  D  @
  19.     }
    2 P9 Y; S' C$ `' a1 s3 z" L- g
  20.   }
    " n5 u- J4 T' O% X6 @! I  C! O7 ^
  21. })
    5 J( H* c. ?: K% p- @7 a
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新; Z2 W, d+ d" Y( l4 S; O1 D$ K7 \% l/ y
  23. vm.site = '百度教程 http://www.baidu.com';
    6 s! C* Q* g. M7 e3 A# Q
  24. document.write('name: ' + vm.name);
    . x& C6 b4 w7 J% H' @5 ^
  25. document.write('<br>');
    & l0 R  x0 O2 _& w$ x7 d1 h
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
" m& x1 x& i; S& ]( \ 0 r  P( C0 l* L1 s
3 p3 h# b+ i6 Y6 s
2 l8 I) I8 V8 H; a
, ~& M( ^% b5 `$ v; c
0 W, E+ o* _* Z7 t6 d, \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 23:59 , Processed in 0.073788 second(s), 22 queries .

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