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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
# a+ c& b( B/ \1 |8 t2 J1 ~: [- ]% }
  1. <div id="app">* l: e/ p. g; n* u& V0 r
  2.   {{ message.split('').reverse().join('') }}
    2 _4 c2 V$ a1 Y4 K
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2( ?( T7 Q3 M* V+ k1 b  `
  1. <div id="app">
    , ~+ e$ y& v9 m
  2.   <p>原始字符串: {{ message }}</p>
    ) f. f3 n& G" c' c5 r
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    9 m( Q9 E4 z* f
  4. </div># o8 I. z  W- v" z4 }
  5. 0 i3 f3 a9 w& }2 r
  6. <script>) b$ v" l2 J6 E2 J% z0 d" l
  7. var vm = new Vue({
    3 d9 r; e7 w0 a2 E5 Q# c& F0 p, `
  8.   el: '#app',0 t% q7 T( d  L! h
  9.   data: {# n% g: t, [2 {; c8 [4 Z
  10.     message: 'Runoob!'* E2 b% s# y- e; q* i8 k
  11.   },
    - A" [: M" c$ y- e  G' ]
  12.   computed: {& ?$ H1 ^& e! I8 a0 i& Y% |# d
  13.     // 计算属性的 getter
    7 F  Y9 z; L* u7 |$ y
  14.     reversedMessage: function () {
    ; ~2 r' e- T! Z( I  R$ j
  15.       // `this` 指向 vm 实例
    % N  Q8 T3 {2 G' Y" v6 S
  16.       return this.message.split('').reverse().join(''), c7 u+ f" i, @5 W8 g
  17.     }
    , j' r3 a/ K' c, h* B
  18.   }
      W! y( e* C# G6 U
  19. })9 {  K4 D) M5 _
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 37 e2 C1 S. g# ^- b9 m$ K8 M+ D
  1. methods: {8 U+ \# q# ^9 H) u) B, ^8 s; y
  2.   reversedMessage2: function () {/ X, _2 g& j: X5 ?( L
  3.     return this.message.split('').reverse().join('')
    2 r0 {% V+ ]; x
  4.   }) e, w( r2 F: E; V
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4  W8 t- n. t7 [% w! C
  1. var vm = new Vue({5 Z6 t$ J- n8 n2 ~
  2.   el: '#app',! k8 }& d% q. C% {
  3.   data: {
    ; k* m( u9 d, Q1 P9 C1 A- d
  4.     name: 'Google'," ]0 _; [' O5 b) K5 A" ~
  5.     url: 'http://www.google.com'( Q7 j7 e/ W7 i
  6.   },+ U$ z9 g; u  F4 T& S1 ?1 F6 T
  7.   computed: {
    + r' H+ n  s. A" @+ r# {/ n
  8.     site: {/ I7 t4 N$ y/ p
  9.       // getter4 f/ ]8 T: \* M* b
  10.       get: function () {
    : X; F6 @5 Z- a$ r/ I
  11.         return this.name + ' ' + this.url
    . X6 r" K( I; P
  12.       },- a5 i& S4 `) A# O0 s) q+ a
  13.       // setter' v6 ~6 g# R+ }7 U
  14.       set: function (newValue) {
    $ V$ |- b( g: T. J2 D: }9 |
  15.         var names = newValue.split(' ')9 N' y$ ~8 B! C9 F) R* m
  16.         this.name = names[0]
    - t& s& ~6 G2 {) ?* w) Y% Y
  17.         this.url = names[names.length - 1]4 a5 p- W& F! ~
  18.       }0 C4 W$ r, y3 l" ?
  19.     }
    6 u+ ~1 B9 {& O
  20.   }
    / l4 ?% k3 K8 Q5 b, q
  21. })
    ( t$ ~( ^1 a# P9 @4 J6 d# Z6 o+ \; u
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新3 f! z6 l; C; [* W! R
  23. vm.site = '百度教程 http://www.baidu.com';
    3 S& q/ x; o+ n4 Y4 F$ }9 m
  24. document.write('name: ' + vm.name);
    , ?: d3 U, c% W1 d* z6 b6 y. K
  25. document.write('<br>');  H: B- H4 ?7 I: R- z8 C
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。2 n: `& p. ~- x9 X

% D7 X+ G8 J- S; C+ |4 E8 |9 k) X; C. S

  j2 [. X7 t7 Z; B/ H' G. |8 A0 U5 h. N

# ^+ R* Z- J$ ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:09 , Processed in 0.057694 second(s), 22 queries .

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