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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
6 J- @' U# g2 {& I
  1. <div id="app">6 \' {5 H9 t0 y; o$ B! Q) Y/ H! c
  2.   {{ message.split('').reverse().join('') }}3 X( V0 p- }- }
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
  A* v4 {4 \2 `$ T4 z
  1. <div id="app"># R# x' m, f/ }7 O& g* D! \7 ?
  2.   <p>原始字符串: {{ message }}</p>2 {" S) ?& t* |- E
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    9 U3 |0 q6 x+ H* T+ @. |( c
  4. </div>
    . o' M% f4 B) F. w+ i
  5. 5 \* l9 h) B1 v: e& W
  6. <script>
    0 T7 f( D5 }% H  ^& G& j
  7. var vm = new Vue({0 Z4 @1 A* R: {8 }
  8.   el: '#app',
    : B0 L1 g- n8 [5 R( a
  9.   data: {
    , j2 d: p, s7 @
  10.     message: 'Runoob!'! N- O3 S3 \# b6 f' ~0 R) {
  11.   },
    6 V# w, n4 l+ R* j8 Z, L
  12.   computed: {9 j8 ^: s* A' \+ Y8 Z
  13.     // 计算属性的 getter; P  _8 F& [0 ~! f  {) Y
  14.     reversedMessage: function () {0 F5 u" v6 y: O% G$ X. |% \
  15.       // `this` 指向 vm 实例/ ]0 ^. V7 c+ [5 S0 Z
  16.       return this.message.split('').reverse().join('')- ]0 l, l; s2 r
  17.     }
    ' D/ s, s$ G7 H8 Q% t( }$ d& _
  18.   }
    # ]* g9 [7 C! P, o: y* N7 Q
  19. })# m6 R/ l% f& ^+ r* j  G  D9 g
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3. o8 q% T% c7 X$ G& M' [
  1. methods: {
    : o# Q5 \" `5 \% R
  2.   reversedMessage2: function () {1 A6 J/ n: T4 E8 P% o
  3.     return this.message.split('').reverse().join('')0 s6 s1 Z" R2 J, t
  4.   }
    9 t5 q5 b- P2 h  |# M
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
# f9 I- U: F3 D
  1. var vm = new Vue({
      I. E6 z4 w+ L( g
  2.   el: '#app',
    $ d6 \' u% J$ `3 t6 h8 [
  3.   data: {, [$ j9 \2 z1 ~0 G; d
  4.     name: 'Google',* b7 Y. i# g) V' W1 H
  5.     url: 'http://www.google.com'
    / {8 u5 X; f2 d
  6.   },( Q: i; I. s1 Q8 a3 Q
  7.   computed: {3 |! v' w) K0 P: W, w
  8.     site: {
    ' ]5 ~! H% ^. p& W; R6 P2 _
  9.       // getter4 Q% b. g, u5 l
  10.       get: function () {
    6 Y4 R7 \) Y6 n0 l: O
  11.         return this.name + ' ' + this.url
    ; ~' H1 e& v# z6 b6 i
  12.       },
    5 m" d9 B( I) a/ a5 E* ?& h
  13.       // setter8 b& @% ~% i6 q$ W7 P$ [
  14.       set: function (newValue) {! y: L1 o; [: F' f4 q+ \9 _& ?  {
  15.         var names = newValue.split(' ')  Y# D# A. s# T' ?% N: x4 N
  16.         this.name = names[0]
    6 y, t. a  m. B3 n* X
  17.         this.url = names[names.length - 1]
    ' j  v  |" T$ j
  18.       }
    " u: f; A& e& v/ s+ m: Z
  19.     }# T  p# }: \5 A; }# A8 c
  20.   }* G0 i: ~$ M8 s+ [* y9 [8 u
  21. })
    # G, A2 A" h* J2 J  l' r$ n+ R( L
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新# ~" F" s4 A* _$ x% v" c
  23. vm.site = '百度教程 http://www.baidu.com';
    ( B9 V& Z0 R" J& x- _& o# O
  24. document.write('name: ' + vm.name);9 i* u& \) P1 R4 Y3 a- A9 u! T4 A; G! ?
  25. document.write('<br>');
    $ m; v- g) x" y, w" X# I" x
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。* U7 ~) W( q& Z! l, F. p# r5 K5 t

2 _" B4 T+ ^8 w( d8 H5 g* }0 c  ^# w

: Q1 f* P- n* i; N! K+ i8 ]. B" V4 Y3 }7 K' e6 d3 s; B
3 w" T. T8 K) g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:12 , Processed in 0.065803 second(s), 22 queries .

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