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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
( [. K# k- E- S* L5 `3 y
  1. <div id="app">
    * j: o* ^( b. g0 l/ |# d
  2.   {{ message.split('').reverse().join('') }}! B4 u) D* o7 l9 A
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 20 Z) l1 ^  A/ l) z  u
  1. <div id="app">/ `+ m" F) a+ P6 y
  2.   <p>原始字符串: {{ message }}</p>9 M' r) w* G, K( f$ j
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
      c6 B" {- \# z, N8 t
  4. </div>1 T3 x* {$ P3 }; o/ ~, j" a- W$ k

  5. ! c+ u' V: h! E4 x* b
  6. <script>9 g. S5 z% F4 l0 T! j/ h& `
  7. var vm = new Vue({3 J) O! ]7 ]' S" t. j! ?
  8.   el: '#app',
    8 ?6 l: W. m1 x8 s
  9.   data: {) t" Q% _9 _7 v
  10.     message: 'Runoob!': z2 L' p) |8 o7 s+ M# g" q2 O
  11.   },
    0 g  I( b. N' t' J. I2 A& f- V/ Q
  12.   computed: {
    1 F2 J8 p  n8 V$ [
  13.     // 计算属性的 getter
    " N* e* J- }# O: R( g
  14.     reversedMessage: function () {" v5 d6 t8 k; C' g. U9 q3 M
  15.       // `this` 指向 vm 实例+ P' u) r6 S3 r, i4 R- B7 Z
  16.       return this.message.split('').reverse().join('')
    % z5 s/ [: V$ {- Z  I; w$ n
  17.     }6 I4 K. C5 z+ \. U
  18.   }5 Z. O2 D2 [& }
  19. })
    $ b, ?: c% O& t
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
. z+ e7 q. f! o1 v3 y$ O
  1. methods: {7 g8 h2 y' b! W8 n8 P
  2.   reversedMessage2: function () {5 [) v- r5 f7 P8 U
  3.     return this.message.split('').reverse().join('')' {% N' R2 [; u& K& Z# S
  4.   }
    / C4 w, ~" z# g/ k1 q9 L
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4& Q3 [( R- D& ~9 p, R
  1. var vm = new Vue({
    . j9 J4 f& ?0 f
  2.   el: '#app',
    6 @) t4 I8 C3 i  J# A9 C
  3.   data: {
    + j6 y4 V; p2 s/ T
  4.     name: 'Google',
    $ A' B/ n# g9 P) I4 q
  5.     url: 'http://www.google.com'
    $ ^' ?+ K2 k- }+ X( K
  6.   },
    7 t! T- t8 r& p7 K7 N
  7.   computed: {/ @0 T4 B! ]/ v# C
  8.     site: {5 f. a  |0 O" }% j( ?) _
  9.       // getter# T$ Y$ e/ U# X  ]( x& l! w
  10.       get: function () {% Q$ P9 y5 ]( k# d6 U8 h
  11.         return this.name + ' ' + this.url/ E4 j# f+ D% t! y* L  l) t
  12.       },
    9 ]( O- _( t& B/ g: O
  13.       // setter
    ' ^+ H; U  J- y% }- h& A4 [( o
  14.       set: function (newValue) {& V- j; G/ [% L/ }- L
  15.         var names = newValue.split(' ')) U9 h& ~! C' ]" ]0 @; v
  16.         this.name = names[0]1 D4 [7 I& r% f7 t9 s; {
  17.         this.url = names[names.length - 1]1 Y1 V+ x& m7 p& D0 B* }2 |9 |
  18.       }/ `& b( ^2 T6 `: w0 @% t
  19.     }
    ! C, Y6 S- B+ D" ]
  20.   }" q5 L, |3 \! t( Z5 m9 a
  21. })& q1 a( {9 s2 D: F5 Q
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新% \. o1 g2 l) j( C
  23. vm.site = '百度教程 http://www.baidu.com';
    ) T# y/ h: o" z5 O
  24. document.write('name: ' + vm.name);
    - M7 q1 W8 E- }6 `. z3 h
  25. document.write('<br>');
    1 m7 H- A, B  u, m* k* S0 F' [
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
: J8 Z+ N' I' v( \' h: }! ?' W7 | # c5 b. s2 L  o
& ^& g4 o" {/ `" W4 Y6 K' i5 ]9 R
* b4 w" R0 c& s& m- f- L; a( H: V9 D
1 i" y. s' K0 r( F+ ~

0 v# m/ y% {* i! c7 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-4 16:16 , Processed in 0.063628 second(s), 24 queries .

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