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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
- l8 r& y- S0 q8 }7 U3 v
  1. <div id="app">& V( z! R$ J# M
  2.   {{ message.split('').reverse().join('') }}
    0 T7 f- f; K( f& D9 X/ ~5 m
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 22 w$ L) S+ n: |1 {5 O9 b7 P
  1. <div id="app">
    - ?3 w6 Q1 h2 z
  2.   <p>原始字符串: {{ message }}</p>, a. W% J% L+ y
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>3 `# x$ q- B% h! r
  4. </div>
    3 D8 D3 A9 C1 Q; e0 }6 a  `5 B  V! U

  5. 6 n  `! I/ J  Y/ p- w
  6. <script>4 _; u, P, `( P! b/ D" J
  7. var vm = new Vue({
    " P. X, K$ a) _8 H, C
  8.   el: '#app',; K4 s) A# e, U" ~  B
  9.   data: {) I, z3 }; s: ?, F- |4 i, \+ M
  10.     message: 'Runoob!'
    . V: x" T( |& w; J- R  u6 S/ B
  11.   },
    ! O* w# [( f5 K$ H( X
  12.   computed: {
    / V% c4 G) c" ?  R9 ?9 M9 K5 G+ V
  13.     // 计算属性的 getter1 h9 l6 Q1 X& d' O# V: p
  14.     reversedMessage: function () {& L8 q' }! z. \: p2 k0 u9 P3 @
  15.       // `this` 指向 vm 实例: h) r' ~; K. c9 J
  16.       return this.message.split('').reverse().join('')7 t, B. E1 ^/ Q( m3 l
  17.     }
    8 n3 C* u( H3 l9 d' ~
  18.   }
    ! l( Q  D% j. `
  19. })
    3 D, g; {* Z/ Q; j+ W
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3) m$ e6 V$ K3 r* v, d& Y  Z& `
  1. methods: {
    . n! O/ ]$ ~, f. o2 `8 A
  2.   reversedMessage2: function () {
    4 f/ E1 v) ~* M( q+ r. ?
  3.     return this.message.split('').reverse().join('')
    ( R9 y: s6 A+ e4 ~' i
  4.   }, w, ?# N0 \: M6 i7 R9 K
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4, U  W) W. X" K3 x6 H
  1. var vm = new Vue({
    " {# j( L( U- S
  2.   el: '#app',
    ' r9 y- x) g$ f; E; M
  3.   data: {
    6 c4 s- K4 D( Z8 `
  4.     name: 'Google',
    ) e7 T* l/ k; L
  5.     url: 'http://www.google.com'
    / R! Y, s+ I6 E" N4 b
  6.   },4 J! R) ^* N# t) J7 W
  7.   computed: {" U2 s1 g0 `% V9 ?
  8.     site: {9 @: S1 f8 D: D3 q7 i" x
  9.       // getter" o! o" C$ s1 N1 n/ v
  10.       get: function () {, K1 x4 a2 `( ~$ ]0 \/ X/ l
  11.         return this.name + ' ' + this.url7 ]( ~* P" I% W- n$ J; `
  12.       },
    7 W0 D- O# Q# d" B' e, Y  u
  13.       // setter
      c( K4 m+ ^$ d! ^0 M) g
  14.       set: function (newValue) {
    , D; o" \$ Z9 B+ }" A3 e
  15.         var names = newValue.split(' ')
    , X5 {6 h+ U, y; e& J  v7 Q
  16.         this.name = names[0]8 ]' w& B. h  \3 ?' k
  17.         this.url = names[names.length - 1]
    - A! u2 T* X" m1 s
  18.       }
    9 D) _2 Z- Y, C
  19.     }
    , t. D; ?- m: E# t! `# w
  20.   }
    2 F3 ^* W* ~9 |, I
  21. }), [5 C# M8 n8 r
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新7 h1 g7 b; b3 h$ t4 m
  23. vm.site = '百度教程 http://www.baidu.com';
    ! G  x+ U7 \7 N* u# w0 l
  24. document.write('name: ' + vm.name);
    * }; G; J0 c3 p  G
  25. document.write('<br>');* s- _/ _  P# k6 U
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
6 h: w/ R6 l5 Z/ u, S$ X8 L2 W * y/ @1 A7 G8 k  }
! N" G5 C' l% e+ t. V

6 I) U; t- J3 P3 |
" G: t) A, t; H( T$ y# M+ c% G9 Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-4 15:52 , Processed in 0.064328 second(s), 26 queries .

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