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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
/ V5 {; X# ^, _$ p3 Q+ P  s( V
  1. <div id="app">1 t6 Z1 u/ N" Q5 ?5 A
  2.   {{ message.split('').reverse().join('') }}# e6 k) ^5 U7 z, `$ \
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 27 p# ]  M) g& @* f- v6 N3 j& O3 Y
  1. <div id="app">
    6 \' }$ i0 e% D* F
  2.   <p>原始字符串: {{ message }}</p>. Z' t! A3 n$ g" L1 P9 |
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>2 i& k* ?; |( D* j$ A8 \! k
  4. </div>
    $ S3 I1 g$ e5 ^5 \) y4 i9 Y" T
  5. 6 C9 d$ O: B- H4 z. p
  6. <script>
    ' d; k8 @, y: g  ^: Q0 g! ~2 V: ?* G
  7. var vm = new Vue({
    . K* O, i; K+ k, d6 b3 g2 s
  8.   el: '#app',
    5 f0 R, O3 J3 l5 @) a
  9.   data: {' L2 s# _' _" i+ Q1 t5 M7 U4 J
  10.     message: 'Runoob!'
    3 T5 y5 v% G+ K/ h8 ^
  11.   },# e3 i7 L' l! X/ z: y
  12.   computed: {
    1 i2 }  \  e' m8 x- j$ }
  13.     // 计算属性的 getter
    5 Z) y9 C  j) d. V( x  p9 ^4 L
  14.     reversedMessage: function () {
    2 S/ P- N: _" _$ ^: L
  15.       // `this` 指向 vm 实例
    / w% K" o; g, k- f( t" s; f
  16.       return this.message.split('').reverse().join('')
    , s  h6 p& @9 N5 G7 `: G4 l
  17.     }
    * e7 C% p4 j: l6 x$ E
  18.   }' i! }- `) X+ i3 T
  19. })* B" f( W- W$ V! [# C) z
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
) g  E! H( W2 D; D) X; P. v
  1. methods: {$ a% e/ C9 t: Q1 C- G
  2.   reversedMessage2: function () {' F% H- |2 V9 j' [# ^: s8 \
  3.     return this.message.split('').reverse().join('')3 S& l0 Q& ^$ Q8 J1 I4 t
  4.   }
    % t  ~! L! q  b4 o; \
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 46 K; Z0 c& D( t. g7 O
  1. var vm = new Vue({# b2 L1 X: a4 x: P/ V5 S1 [
  2.   el: '#app',& R( @6 S8 i3 I. \) {. t
  3.   data: {. R) `  G; m: T1 d
  4.     name: 'Google',
    ! X/ R" n, F4 ^; B4 Y% t8 q+ \
  5.     url: 'http://www.google.com'1 F0 B! ^/ H1 X" S, s% I
  6.   },
    7 r% R- u% W8 K9 q5 V8 f
  7.   computed: {
    # C2 P$ ?5 ~5 O7 k, M
  8.     site: {0 `! z  D; F8 g7 x
  9.       // getter4 t1 M* f: S4 @2 p; d6 S
  10.       get: function () {" @+ q* ~, {4 e; ^
  11.         return this.name + ' ' + this.url
    7 ^# q9 y- g3 E1 i
  12.       },
    6 Z7 F4 d) T0 _, a0 j
  13.       // setter2 w1 q) I5 T5 K! G
  14.       set: function (newValue) {
    $ W5 [! e2 }4 I: c, x* ?7 S% H& V
  15.         var names = newValue.split(' ')
    0 A# r5 |; R/ @1 J) A- {3 @1 t) E
  16.         this.name = names[0]" {8 F8 ~! @: `) N& G
  17.         this.url = names[names.length - 1]
    ! H$ v4 l' R, ^
  18.       }
    2 `/ Y) Y7 V. i6 c, [
  19.     }
    # R$ s- _1 h  f  M
  20.   }
    # Q. \+ ~% S3 J
  21. }): V7 D4 s$ ]$ L; _" w
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    $ ^! e$ A9 K2 t8 a, B4 R6 X& z
  23. vm.site = '百度教程 http://www.baidu.com';$ M: ~7 Y/ q& f, h1 C
  24. document.write('name: ' + vm.name);
    ) d. E$ y# _; C" ^. Z, J
  25. document.write('<br>');
    ; t5 i7 j) G4 {: x
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
- m4 {$ B# E/ c# N8 v
. Q- P9 Z, w) x  Z) d$ A9 k2 h/ m2 d0 u6 q
( T1 s! L* A! q+ ^7 |) N9 v  X

1 ~7 L3 t$ J: a; X2 ~5 |$ d+ l2 \8 ~9 J1 X5 ^8 ~% F; u' E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:40 , Processed in 0.063284 second(s), 22 queries .

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