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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
- h+ `4 h8 N- o  N5 k
  1. <div id="app">% I" E* t1 L' c8 {  B2 \
  2.   {{ message.split('').reverse().join('') }}( Y2 Q) P& x, W8 r3 S9 O: G
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 23 N% E) g0 m9 n; T" R( k
  1. <div id="app">: ^$ q. g  \1 `
  2.   <p>原始字符串: {{ message }}</p>$ s# L3 y, i$ W, m: h
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>. Y9 I8 p$ P5 r
  4. </div>
    6 P% [1 u9 C; A

  5. # l/ `) m5 o/ P4 z
  6. <script>8 D. I9 r! p5 ]
  7. var vm = new Vue({, v+ z7 x# K# ?6 N- B: o3 m
  8.   el: '#app',
    ! |: w2 v! c; J! s; S
  9.   data: {
    , b% r' B8 ]3 F! m2 L$ K/ `$ X
  10.     message: 'Runoob!'( D- F* H+ ]: o7 S# y8 t
  11.   },
    ) q* `- u/ [3 j- U" g  ?
  12.   computed: {
    6 w6 b5 u! M5 _# Y5 ~" u" T
  13.     // 计算属性的 getter7 g/ p) w0 S/ l' A7 G& w
  14.     reversedMessage: function () {
    ! {3 v! [1 @: W# O7 X/ p
  15.       // `this` 指向 vm 实例
    ( O; b& w/ ^* A  L+ W/ [
  16.       return this.message.split('').reverse().join('')
    , k) o; V9 u/ Q. f& a/ i1 G
  17.     }" n/ I8 d. b+ b2 a- p
  18.   }
    * x5 A! k$ J% a% |7 H
  19. })
    / O* ]- }# X; v" o. j: G
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3) @9 P! M3 B5 w* t5 F
  1. methods: {; k7 ?, k# h) `8 p1 {# k
  2.   reversedMessage2: function () {- x3 \9 W" M8 ~
  3.     return this.message.split('').reverse().join('')
    6 x9 Y+ t4 O0 G. J4 y
  4.   }
    % r2 V8 ~" a% C6 K! n8 X, v
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 49 O4 T+ Z, ~7 k+ s& s
  1. var vm = new Vue({
    ( Q: W0 k$ |8 \1 k
  2.   el: '#app',0 J5 q9 O9 `% D# [
  3.   data: {1 i! J: p4 S( E; F% P- i+ x
  4.     name: 'Google',
    * r1 I% {8 z8 |; Q7 K1 j# Q7 g
  5.     url: 'http://www.google.com'
    7 B% D* V! I1 h2 y# |
  6.   },- M# [  P8 S7 S' {) J3 X2 n
  7.   computed: {
    0 ?# F2 X& f7 r5 D; `3 z
  8.     site: {( X, U* W) z' J' D& k4 ]1 U* ~( c" u
  9.       // getter; a: O1 W6 Q' R7 e0 V
  10.       get: function () {& I$ g; x& Q- u0 @+ H/ Y; U
  11.         return this.name + ' ' + this.url
    ; X9 R3 V! P& ~* r, T
  12.       }," B, n3 a7 U2 U8 f  q9 M" h- Q* u
  13.       // setter/ }" }  Q" @; ^. b! G9 s
  14.       set: function (newValue) {* Y2 @% D, g4 E- ]
  15.         var names = newValue.split(' ')
    : y. j* D) D. b1 g: r) L
  16.         this.name = names[0]9 @) O4 m2 i9 C7 v- ~
  17.         this.url = names[names.length - 1]
    . Z# {& @9 c) |  D! Q( `% u- E
  18.       }
      w& J  d4 ^3 q5 P* a
  19.     }/ o% t1 B  ^: u4 E
  20.   }+ @, \# d) f% u+ Q
  21. })
    3 M1 h6 X) Q  ~" w, m
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    . @5 ^) q! P- T/ `0 g
  23. vm.site = '百度教程 http://www.baidu.com';
    4 n+ B* B$ L8 m/ `) M3 {, [2 E
  24. document.write('name: ' + vm.name);. I0 Q) u' \4 L2 m1 m  G
  25. document.write('<br>');. o2 A$ }6 {" F8 y7 D
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。: X5 x) _9 A" S
3 ?0 [0 H2 c6 L! d' }2 N

( ]. v0 }  H# b1 t+ I
0 @! }4 J( l" H7 i$ z/ ]. V  S9 |: E
$ q: e! v2 x- k! P0 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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