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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
9 f% N7 c/ D2 _% F. R
  1. <div id="app">7 e, N+ {+ `) _, N
  2.   {{ message.split('').reverse().join('') }}
    # v9 c5 Z" U- {6 z3 g
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
/ p& J, D3 P; H8 T' v5 b1 N
  1. <div id="app">
    ) W  T7 r6 b! v; U# g; i, }
  2.   <p>原始字符串: {{ message }}</p>; p8 P; c0 I9 l  y
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    0 I; {# Q' W8 R, N. `# O
  4. </div>
    ' N( k% J; W" b4 U" {1 c

  5. 5 w  d) v5 G$ B2 f& I
  6. <script>0 l* ^2 f+ }' K8 R# T% `
  7. var vm = new Vue({7 ~# ]- |* Y+ U8 c' \
  8.   el: '#app',
    4 l: z# g4 G3 i( K! s, Q' Q
  9.   data: {, O& H# |: V. p% F& x
  10.     message: 'Runoob!'
    " x& m3 c' T5 D3 h
  11.   },
    8 Q) Y) z! k3 \; F
  12.   computed: {
      V7 `; K* q' G. g; {
  13.     // 计算属性的 getter
    5 e# a3 j7 X  M; F3 j
  14.     reversedMessage: function () {/ T6 ?% W) I0 p0 p+ Y
  15.       // `this` 指向 vm 实例& T* w+ X5 w' s2 m1 l# v" Q
  16.       return this.message.split('').reverse().join('')2 P& R% h- I# V1 m6 {9 ~
  17.     }* c+ n$ L/ U. s7 ?( f( c
  18.   }
    1 a  s" N( [% E% H# m. O
  19. })
    " b7 D( ^0 N7 K; c* f9 V
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 34 W- T  |& l8 \7 ^( J: k+ P# }
  1. methods: {
      ]5 |1 U& a9 q% g3 J8 g- z
  2.   reversedMessage2: function () {
    / S& w4 U5 @/ `- V6 F; c# s' G8 k
  3.     return this.message.split('').reverse().join('')
    6 {" U3 k4 s% a" G- F
  4.   }
    & L8 W3 s9 b, R9 \, o9 V2 a
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
" u. r3 L5 L" j
  1. var vm = new Vue({# l+ q: C4 r/ U8 ~0 B
  2.   el: '#app',3 z' C; P9 K, H: d6 y* m# |" Q. z
  3.   data: {+ y6 _5 ^1 R, R+ R
  4.     name: 'Google',1 h3 o7 W' e( p. Z4 s8 ^" d4 j" I. x
  5.     url: 'http://www.google.com'3 i7 P  b* @4 o8 H" f  {8 d. Z
  6.   },) K& k8 M1 x  k/ r, R5 g4 G" Q
  7.   computed: {
    3 r0 @7 I6 W- @
  8.     site: {
    + n! g7 `4 z  T6 H6 P# K5 q
  9.       // getter# K4 c  `7 u' |' M
  10.       get: function () {
      S, D* b) h9 k/ I
  11.         return this.name + ' ' + this.url7 W7 G! j% X4 c% G, t
  12.       },' h% v* a! G! a5 o; v. G
  13.       // setter
    . X& @$ E* J+ Q  v2 l. n
  14.       set: function (newValue) {) K# k2 N, P4 _( `
  15.         var names = newValue.split(' ')
    3 J$ A0 {& W' x' \$ S
  16.         this.name = names[0]
    2 F" Y/ ?' Z( j
  17.         this.url = names[names.length - 1]
    3 m, F# x6 ]) Z4 l2 Q
  18.       }1 W1 O6 M* ^7 C% B4 w& h
  19.     }
    1 O% A, s% W8 n2 O
  20.   }
    0 o% b: n- ~9 g- T9 ]$ E9 E, [& A( u7 G
  21. })
    + r$ [: v8 a( |' i/ A  M
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新5 \0 x  F  W, ^! a3 m6 e
  23. vm.site = '百度教程 http://www.baidu.com';
    1 L9 y% I) d7 p
  24. document.write('name: ' + vm.name);9 O7 F) y' y% x  A
  25. document.write('<br>');, x2 m, J7 C) Z& y% p+ [5 I& p& V
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。0 L" @$ `8 b1 o# [
0 b1 i& a, |4 M& Z9 q1 s

7 ]# e5 M7 q( c6 O' m
( |% i! U; I$ L* s4 s4 M3 ~
0 q* ?, n2 R9 ^7 b1 j
0 P% a$ W, t) ]1 x; m* I. f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:10 , Processed in 0.128362 second(s), 23 queries .

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