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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
( r# U/ \/ I: R. s* s& q$ B
  1. <div id="app">
    $ F# o$ ~4 g8 H( i
  2.   {{ message.split('').reverse().join('') }}
    / p1 X" q) ^) {3 n
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2( D5 G; L( D  v+ z/ Y
  1. <div id="app">  n$ W# B' {% e( o" S# o
  2.   <p>原始字符串: {{ message }}</p>
    / y4 v, K$ e1 T! X, o" C
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    , O( @0 t; M1 c2 G# f, i5 o0 j
  4. </div>; X4 y$ A. c& v: l3 S5 R( V

  5.   d1 b9 R2 O; N
  6. <script>
    7 @  K" q( y% Y, r* _5 s, z, B
  7. var vm = new Vue({# V, o# D, a  u- J* C7 g% n. `: r
  8.   el: '#app',
    % e, _7 a* L' C/ m0 M+ C
  9.   data: {2 ^( {% f( \* s/ h; g) s) Q# f6 V; u
  10.     message: 'Runoob!'
    9 u$ t9 i# R0 U: y6 d* @& y
  11.   },' J5 o' h3 Y9 o6 a
  12.   computed: {! F6 {% L% K9 _& B- H
  13.     // 计算属性的 getter
    & o3 h, y- w- M! Q
  14.     reversedMessage: function () {& _  n7 x/ t4 D8 M% m
  15.       // `this` 指向 vm 实例
    + a8 D; l: U# W* q+ U1 F
  16.       return this.message.split('').reverse().join('')$ k5 N1 s8 C; U
  17.     }- q; a0 y' J3 f7 u5 K2 Q
  18.   }
    4 w0 h" k# N# X; N
  19. })( Q9 d, |2 L) [; h8 m
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 32 }/ o3 H/ t" ^  H& Y  G
  1. methods: {
    ; L& N1 u- N: I1 h3 a
  2.   reversedMessage2: function () {
    6 W4 x& V8 z4 N# u' ]5 W: a
  3.     return this.message.split('').reverse().join('')1 t6 j+ u5 ?; ~6 t  ~: o+ {
  4.   }
    $ n& D5 [6 U3 k3 [
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4/ O. z  ~; M& l# ]% A
  1. var vm = new Vue({
    2 f) x" x% `! n' l4 ?% J" z+ O
  2.   el: '#app',
    3 E+ K. O% C4 |- j8 ?' ?
  3.   data: {
    ' U! a& h3 ]2 l! u# }
  4.     name: 'Google',) i! \4 ]; E; ?  ?3 i2 x$ x5 P# ~
  5.     url: 'http://www.google.com'7 w! Z* f3 |5 |2 ]* ~( p; c
  6.   },
    ( K4 @' l5 W  F4 ?2 `/ U
  7.   computed: {
    ) s0 M/ g# Q. ], v# U3 [  Q
  8.     site: {
    ' I; {0 `1 J0 y
  9.       // getter" X) N! A6 H8 n9 o; |
  10.       get: function () {. i6 M( m& ]  U8 t* F4 B/ L
  11.         return this.name + ' ' + this.url
    ! }+ x- i1 `4 ^7 j. A! G
  12.       },
    - C- ]# Q8 b6 V# J
  13.       // setter6 I2 M5 k! j6 p# \! G
  14.       set: function (newValue) {
    , T" h. w- N& T8 g: {; o! Y+ Z
  15.         var names = newValue.split(' ')
    6 ]3 a, O0 _$ M
  16.         this.name = names[0]
    ! S3 `% c# H" h
  17.         this.url = names[names.length - 1]8 e: o$ Q  r2 I) P8 }* k
  18.       }% {. t1 E& l2 R) R' b. C
  19.     }7 f/ i! X2 E  j9 z+ K
  20.   }2 H9 ]2 v: b( [) @( K9 I6 Y* Q
  21. })
    . [& |$ U0 a+ W+ f
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新( \& f1 B  V2 D8 b& d9 {, w5 g
  23. vm.site = '百度教程 http://www.baidu.com';: x& L7 z) ^2 c% F  S) X! G
  24. document.write('name: ' + vm.name);! f/ z( Z3 e" r% {
  25. document.write('<br>');
    , r  J" w3 ]9 A  O+ c7 L
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。; V; l  U$ W, K5 m, B

' F+ e+ n, \/ M4 j1 ]& s
7 k* H9 [  `% U' }  Q4 [& j4 p4 Z& y# p, @2 T3 @

4 H( J5 w/ g) l7 d7 c( z9 x% N4 C8 v4 I8 R' F, W! P! _! R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:05 , Processed in 0.081708 second(s), 22 queries .

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