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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1& t1 J* s6 d. b# s, R; y
  1. <div id="app">/ r) _  U" E" _/ `# I
  2.   {{ message.split('').reverse().join('') }}
    6 j8 i. l1 j% Z
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
9 Q! Z0 |3 j" `$ X+ A6 _, ?
  1. <div id="app">- l6 M# y7 C+ I8 e6 q
  2.   <p>原始字符串: {{ message }}</p>! s: l& `' D" ~3 l
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    4 Y! j; v. g2 Z5 F7 ^! w
  4. </div>7 b  X. y- A: t, r3 r

  5. * z# ^( w& Q) c
  6. <script>% ~7 E+ c, {, j8 i- P+ T
  7. var vm = new Vue({
    / H) D3 J3 x; p6 ?5 n* L9 Z
  8.   el: '#app',
    9 y( C9 ?% B! H/ a3 m/ E) Z  t
  9.   data: {
    : r( i7 K  a4 Y+ ^' [9 R
  10.     message: 'Runoob!'
    , U. u3 F. z& G- {) o- N
  11.   },
    " c  E, F8 s: w$ n- s' m0 K- B) P
  12.   computed: {+ p' ?3 s7 i4 j& `9 k# V
  13.     // 计算属性的 getter! A- l( _. m8 \6 m& W
  14.     reversedMessage: function () {9 }! d2 [, X0 H$ C' ?% Q# h5 W) M
  15.       // `this` 指向 vm 实例) `9 o* \( d* r7 _: \( U
  16.       return this.message.split('').reverse().join('')
    ) A# ?/ r# `2 E( S' }: V
  17.     }
    ) g' [$ _6 V* ]3 t; |0 e
  18.   }: G: t  ?, l# {3 F7 ^6 v3 r9 g
  19. })1 b1 G% V7 D8 G* e7 x7 k, U8 x
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3  L' @- F, A0 \% q$ N
  1. methods: {0 i# h6 g5 g/ ^* A
  2.   reversedMessage2: function () {9 C) F8 }9 Q% Y; X" w8 V0 h4 V& v: y
  3.     return this.message.split('').reverse().join('')
    % O, c; I& e8 i4 R+ J9 i4 O
  4.   }6 y" ~  J8 H. p7 G# k- l
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 49 A3 Z5 S! H  s6 b
  1. var vm = new Vue({+ R( U- C( C# R/ a
  2.   el: '#app',. S8 ]$ B1 L4 ~0 A7 L$ O
  3.   data: {- h$ E- F7 W0 W( _
  4.     name: 'Google',( V3 D: _/ S0 Y  w: O
  5.     url: 'http://www.google.com'
    $ e6 M; D; }/ d+ r& M
  6.   },
      `. l# _5 X! m! m& m5 B6 v
  7.   computed: {. B8 V4 K# N0 R! j, y" @$ k
  8.     site: {
    , _1 \$ i5 r' B& b( p% U. [
  9.       // getter
    & w( v4 v1 P: y( a+ a" }* W
  10.       get: function () {
    $ c2 t2 g* j# X8 i
  11.         return this.name + ' ' + this.url
    6 M  G% x& n  e9 C  c; T0 p
  12.       },0 c( {) k) a( W2 A" O
  13.       // setter8 W, m! U' ?5 Y0 S+ ?9 g
  14.       set: function (newValue) {
    , O) v9 Y. F5 `* _
  15.         var names = newValue.split(' ')7 E/ L9 W5 G8 [" ^& Q9 f
  16.         this.name = names[0]) j, S# f" Y3 d3 ~: n
  17.         this.url = names[names.length - 1]4 v( X6 Q4 K: G+ f, Z* T4 t# x$ U  U
  18.       }
    " e* O% s1 _& s/ m8 Q, N
  19.     }
    7 e7 _& H5 V. h) F  c  w* M1 Z
  20.   }
    9 W1 [' z" N* @- Z1 H
  21. })
    - b# F! \( K  {( ^6 V+ q
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新6 @( N) N/ h9 p4 D- B/ F
  23. vm.site = '百度教程 http://www.baidu.com';
    8 o  C. _  O. q( ]
  24. document.write('name: ' + vm.name);/ f2 W% b! u4 f) I- P0 b7 V
  25. document.write('<br>');
    , W0 g( K8 v0 e' y( L
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。5 O6 B* C' w% v: q( S( ?  V

& }/ A8 z- L3 |  [* j* W; {' X2 Q% A: x+ [! u
) \4 X* ?$ \  b0 F/ |" m2 K8 Q

" g) c* y% Z- _( ~% y& O
/ _  V, \/ w/ V  w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-15 13:13 , Processed in 0.166511 second(s), 24 queries .

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