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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
. G: Z/ D' {! g/ `
  1. <div id="app">" N! T5 _- F* J
  2.   {{ message.split('').reverse().join('') }}
    & r+ l! A+ Q3 j
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
  U  W) O7 h8 @2 u: Y
  1. <div id="app">
    8 |2 o( f% M0 A) S) [* N
  2.   <p>原始字符串: {{ message }}</p>
    4 d) J+ a- A& [/ F- W! |- Q8 \1 @
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
      B! ?* ?9 s6 u! O
  4. </div>
    0 m6 a( u/ b# t, B

  5.   c7 S1 b0 f! V; A
  6. <script>
      ~2 L( u0 x! N: y) o3 E
  7. var vm = new Vue({
    * b2 V/ F3 @- ^* Q5 ?' l
  8.   el: '#app',4 D7 P" Q" ^* J) H
  9.   data: {
    5 o( x. }* U* o, w( l4 y5 J
  10.     message: 'Runoob!'
    7 g" |, l# |6 Q5 }' u, v
  11.   },
    / |: m" `: P3 l  a8 E5 F
  12.   computed: {1 z; H* j" k# `! |
  13.     // 计算属性的 getter
    , q, R: r) m  o+ l$ w; }
  14.     reversedMessage: function () {
    # b/ g2 P  y- y* j1 q
  15.       // `this` 指向 vm 实例* p9 r; \" l0 K6 R/ w/ \' k' [
  16.       return this.message.split('').reverse().join('')% H1 }+ X: `( C* X2 j# c
  17.     }
    + H2 }! I9 k0 I9 d! A
  18.   }
    0 f/ a) d" t4 X+ g" A) M6 M
  19. })
    3 T9 X# l1 }2 m2 L$ s6 A
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
# C) z- T& b# ^) W: x3 U+ w
  1. methods: {' c3 y5 G: l( {2 Z
  2.   reversedMessage2: function () {
    % U6 U& Q% W. Q/ u  @
  3.     return this.message.split('').reverse().join('')# E0 h: r! y5 ~/ a$ N: P1 v
  4.   }
    % k, z. Q% W" J3 w1 y$ ~
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4  v* G+ n6 x6 B& \5 `! u1 o- F
  1. var vm = new Vue({& C  S* ~; y/ O
  2.   el: '#app',6 _/ G+ y- j1 r( J* c1 v# ^7 h
  3.   data: {
    & J* z+ L0 B. _  c+ h: h. b% t
  4.     name: 'Google',* P; J7 f0 B3 {: n
  5.     url: 'http://www.google.com'
    4 G4 N, D, @% R# \. r
  6.   },
    4 x6 V2 ?: t$ U- [# k7 C3 A' d5 Z
  7.   computed: {3 U0 z, z" s( W9 F  o
  8.     site: {8 @( J: A! t9 H. |8 H# \( m5 N
  9.       // getter
    0 k: |2 X* A+ Z! n
  10.       get: function () {
    ' e4 E) \2 R% }3 N
  11.         return this.name + ' ' + this.url
    & x! w( _( }7 `0 j/ ^- j3 U
  12.       },
    : \' P- v  q+ ~+ L* u; y/ J+ [7 S
  13.       // setter. Z+ r0 v8 \; a; B0 t+ Q) i/ f7 a
  14.       set: function (newValue) {' E* z1 t$ p  r; ^' I+ f6 c( w
  15.         var names = newValue.split(' ')
    ; C- w7 z# A6 L9 W9 V3 }  x' O
  16.         this.name = names[0]% i# \4 L6 o- H; w! S4 F
  17.         this.url = names[names.length - 1]
    . u9 F9 z- S4 d  c" ]* z% ?
  18.       }  t7 u+ C' k' |/ W: m8 t
  19.     }8 M; Y8 ?" d5 M1 K, [
  20.   }% |, f% ^" V1 z" C: c
  21. })
    8 M" P, f  M2 f' r/ q
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新8 s8 o# V6 C& H; y; R6 |; a2 `
  23. vm.site = '百度教程 http://www.baidu.com';
    % U7 g& A5 M( t+ z
  24. document.write('name: ' + vm.name);
    2 n+ @, b( x: S) o8 r3 y9 B
  25. document.write('<br>');
    9 _$ t/ v$ s& F, E
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。- G% \' N; I& u7 Q2 q# f
5 }+ s# t* ]9 |, W7 |! I" M
$ O7 ~( N% R9 \0 Y8 K4 u
! F; \/ G8 Y. d9 \& e

4 U$ V0 m3 c  v, x% Y' U1 w0 h' k! z2 r5 m* e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 12:43 , Processed in 0.052899 second(s), 22 queries .

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