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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
- p. a! }. [9 X0 \& w
  1. <div id="app">
    # C( z/ @' B/ d! s1 }5 S5 ^
  2.   {{ message.split('').reverse().join('') }}2 s1 \# L% d) `" U; W
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2) ]! n& m9 \6 i" V* C5 t
  1. <div id="app">
    6 S+ R, D! T$ h. ?# D3 d2 x
  2.   <p>原始字符串: {{ message }}</p>  j4 K& @6 a1 v
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    ! X  g7 |4 G" z! O7 e6 h
  4. </div>3 t! y2 ]6 t, z, L# ?" c4 x: }
  5. 7 C' B6 k8 g# m+ I' F3 A7 y- j8 q3 a
  6. <script>
    % r: ^# g& y" W/ o: `
  7. var vm = new Vue({
    ) e) p6 e$ B4 i1 X  G
  8.   el: '#app',
    4 `  q) e4 F" q  d2 T; q. M* c0 }
  9.   data: {
    ! D$ ?0 U( N; X
  10.     message: 'Runoob!'. c4 ]9 o9 Q: b" w8 a5 M
  11.   },
    3 K! U5 A1 D9 t% s3 ?
  12.   computed: {
    ; i  b& W1 J. g! j# ]8 W) J/ n% x
  13.     // 计算属性的 getter
    8 A* \# `9 g) R' P& }) t, N2 h8 A
  14.     reversedMessage: function () {. h- y# ?6 q; [$ U  \4 I2 J) ^
  15.       // `this` 指向 vm 实例1 i1 J! s4 x$ z, Y6 U
  16.       return this.message.split('').reverse().join('')9 k/ h1 k* d5 G: V
  17.     }# @- i) ?& u, x
  18.   }1 E& I, n8 q! w) D0 T
  19. }): m! B. A  a0 d0 S( v
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
6 L# `' Z' E. v0 `# a
  1. methods: {
    , r& J) s8 d8 \' i2 k
  2.   reversedMessage2: function () {$ f; Z+ p/ ?/ e0 c
  3.     return this.message.split('').reverse().join('')  j8 W1 y! i- I( X" i  O6 b' [" }2 t% {
  4.   }9 ^; o' K, A" Z9 R+ \
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
& W2 H3 ?3 W0 T  M: }+ g
  1. var vm = new Vue({
    3 s& D" S- _5 z. `8 \- X) M
  2.   el: '#app',
    8 R8 g' Q4 j6 y7 ], y- o8 K
  3.   data: {( J$ E. N3 ^* k6 U* O# M
  4.     name: 'Google',
    + o* d8 a, h$ z( x) O' M) q
  5.     url: 'http://www.google.com'
    2 u+ v, ~  w8 h$ H3 t1 X
  6.   },
    ) n* R2 E5 j* h4 t
  7.   computed: {
    ; T; t/ p! o: Q: \3 S
  8.     site: {
    $ [6 I3 M* ]" `, c/ H( W
  9.       // getter* A  Z' h) i& e( g: P4 ^
  10.       get: function () {
    ! @- N+ y3 J! L; t. W, v* I2 P
  11.         return this.name + ' ' + this.url3 a# }. b" H7 W$ ?3 n% ?, O
  12.       },
    6 V  i$ o# W7 Y% s
  13.       // setter" j% R7 e# W, W3 n
  14.       set: function (newValue) {& S' E1 F/ D- Y! W( Z7 m/ A9 s5 k0 w
  15.         var names = newValue.split(' ')7 e# o% [3 G( {3 Z1 j7 }
  16.         this.name = names[0]
    4 Z' V  G7 }. a: {0 I! B% n
  17.         this.url = names[names.length - 1]
    ! G! T8 v5 H. B$ J7 x0 x
  18.       }
    . o) `! u2 W% }6 @7 K
  19.     }
      U6 I; r" W8 H* _: O. _, X* P
  20.   }
    ; n" Z4 [$ O& B8 o
  21. })' I5 \3 c2 O, K1 x- q! Z
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新# ^# A' [: E9 V5 b
  23. vm.site = '百度教程 http://www.baidu.com';4 B9 E. N: w+ X; x- ?& f/ E
  24. document.write('name: ' + vm.name);& i; c" A- M& M% U4 l4 A- U
  25. document.write('<br>');
    7 {4 |0 M% p* w' P) i
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。% U9 m* z2 J/ Q( s

. U5 t1 r: F+ t' y" g1 a1 H1 u7 S) b3 |* u, D& [7 L
" m' A" ]- q% m# W, K, ?

. e  ?: Y1 L/ J2 {2 u! {/ z
' }2 T) Y8 ?& S! T6 h) A5 y6 X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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