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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
1 G) M& r. ^( {% A8 L1 O
  1. <div id="app">( r! c/ p8 E4 q9 j9 v/ n7 R
  2.   {{ message.split('').reverse().join('') }}
    $ [8 N* n: O/ ^
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2: Y" S4 W3 z. ?4 k
  1. <div id="app">
    & W1 V: _1 u3 v- B2 m# R
  2.   <p>原始字符串: {{ message }}</p>% b8 Q8 L4 b5 i+ p9 m
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>3 m4 d! F7 q6 K7 Y# f
  4. </div>; {9 \/ o7 i& v+ u
  5. 0 c) t" G& C( x; [7 m( |/ z
  6. <script>
    ! `) Y5 s5 Q9 a! O) Q( h
  7. var vm = new Vue({
    9 S' O3 f$ q# i, h
  8.   el: '#app',
    # Z  `* Q7 s( j0 a5 `+ U
  9.   data: {
    * b! j% Q( G: a' z$ m3 T9 p
  10.     message: 'Runoob!', `0 H) @- \" M0 U/ [' N/ y
  11.   },+ V5 O6 V3 [+ K" w
  12.   computed: {
    5 Z' F) `" x% A2 M6 \( H
  13.     // 计算属性的 getter" G5 ~, i3 n! P
  14.     reversedMessage: function () {2 f7 M, {0 G7 H, g% s2 j# [# |
  15.       // `this` 指向 vm 实例
    ; p, o, L7 b, R# m8 Z& z/ e% \
  16.       return this.message.split('').reverse().join('')
    5 X9 m3 P/ Z& y$ o3 W
  17.     }
    # Y5 g' p( h% R/ G1 C& S) r) Q
  18.   }* C( {# d: W; m" W. x, ?  q
  19. })9 [/ ~$ o( V) L+ `, {5 q, u* W4 ^
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
- G+ y" @! S4 [
  1. methods: {
    6 w2 ]0 q7 l2 ~% a% T" E# F
  2.   reversedMessage2: function () {+ I! [$ O1 v5 [- g( f" d$ Q
  3.     return this.message.split('').reverse().join('')/ K% B4 e5 I9 r
  4.   }
    $ X6 |7 z) D+ h% p7 n
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
$ p, B) H0 ^4 w$ ^8 d: e$ c
  1. var vm = new Vue({8 B/ S6 m( m. N0 |3 ^9 p+ h
  2.   el: '#app',; {/ c; W4 \, |/ j9 ]# \
  3.   data: {
    : v- s- y3 f* L4 ^! B( W/ u: D: x
  4.     name: 'Google',
    & U. o; Y5 _/ P  W6 r8 L
  5.     url: 'http://www.google.com'
    ) H5 U; j& c+ U
  6.   },
    5 F4 ~+ ]- b! f6 y, j1 q- P2 C
  7.   computed: {4 k, q5 n* L+ H# J1 n7 x' b
  8.     site: {
    3 o$ p, B; v, W/ E4 c  f) a$ b" K
  9.       // getter) M* \) q8 d5 w9 c1 n: T& f
  10.       get: function () {
    3 q! x* Z, W- b4 h
  11.         return this.name + ' ' + this.url
    ! }1 C  K( s) r
  12.       },
    0 l5 f4 G; `5 e
  13.       // setter* S# v. a* e1 m
  14.       set: function (newValue) {4 h8 h. H, j! L, P6 O
  15.         var names = newValue.split(' ')
    4 b9 P. f! j9 c, _5 I8 {* N! m7 a9 r
  16.         this.name = names[0]
    6 \  B8 e* a5 Q/ q1 g) m' s! n
  17.         this.url = names[names.length - 1]
    " L/ S+ M% L: Y7 d. g; u+ u6 K
  18.       }
    / N5 E/ Z4 L# L
  19.     }
    0 V1 ]' D6 N- k8 _# A
  20.   }% M& V, @+ X1 k8 p6 x- X
  21. })7 H0 }" Z! U8 |7 b7 R4 `* k1 R
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新. p2 b% c2 A$ T; {  j
  23. vm.site = '百度教程 http://www.baidu.com';
    6 Z. M# X; x# s1 {( F/ o1 o7 A
  24. document.write('name: ' + vm.name);
    * N5 p/ ~" }+ n/ A
  25. document.write('<br>');+ E5 N0 o% E! I, C1 f4 n
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。4 l- S  [( m' K( `6 @5 C

% t$ n' k( ~* M) i% H& E
# \- N* [) [5 ]& m5 a6 z2 X: B, J+ }+ _

, B2 Q$ Q. D1 P& b7 b4 z4 C6 z1 |3 R. l) ?* Y9 T  e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 18:22 , Processed in 0.054796 second(s), 22 queries .

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