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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
2 R+ \/ S6 ?+ Z! e
  1. <div id="app">
    , ]: a0 L/ ]' O  j& \- J
  2.   {{ message.split('').reverse().join('') }}& U+ U& F$ A$ D  @
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2' Z* f4 K" I" O0 x- u/ F6 v
  1. <div id="app"># `, W6 O& r( ]5 x- v( ^+ M
  2.   <p>原始字符串: {{ message }}</p>& t2 L0 ]4 l% O7 _
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>5 G4 n4 r! \, ~& p8 S" g
  4. </div>
    6 ]1 t8 t; F" t# g, h- w

  5. ' B+ l3 W  F8 d% }5 t
  6. <script>
      j; r! w8 ~* D' N6 J3 X! K
  7. var vm = new Vue({# A1 M, I! o7 [/ v. _/ @; s
  8.   el: '#app',: L4 ]* F3 w/ O# g" D& }
  9.   data: {
    - C6 t4 ?2 k$ x; P" I
  10.     message: 'Runoob!'7 J' O0 j( r: V% K. _4 ]
  11.   },, S2 Y. S, d" M/ X4 f
  12.   computed: {
    ( M$ G; M- ~3 W
  13.     // 计算属性的 getter( R4 |* Z3 s! `3 {8 K4 K
  14.     reversedMessage: function () {
    & i. E/ K1 P) B0 {( V/ P2 K* }8 m
  15.       // `this` 指向 vm 实例
    / U) I: b. d: z! G
  16.       return this.message.split('').reverse().join('')
    3 i/ j+ s6 {+ c8 w7 R) e  n" N
  17.     }% v; Y% ^  Q* R, ^
  18.   }( p; h: I" N$ ]) d- ]
  19. })$ z8 Q. l' u" ^" L, ^) y
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
  ^8 T6 t1 J% T% A8 h2 i& x
  1. methods: {8 d! V7 C9 B3 B4 v9 ~
  2.   reversedMessage2: function () {
    ' Q/ h, V+ Z3 z4 D! B% @( s
  3.     return this.message.split('').reverse().join('')+ _' l/ r; k8 ~/ r
  4.   }
    3 _% t% m, {. T2 b. e# A9 a
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
! ~( V. _. c9 h9 Z* a0 K( R
  1. var vm = new Vue({: j1 Y' O0 A/ o# C0 P# P
  2.   el: '#app',
    + N3 \# o, e( \
  3.   data: {4 w% o  w; A/ @4 _& q' O7 C) u
  4.     name: 'Google',
      I" h% z9 y2 }9 q* n" Y; V% e
  5.     url: 'http://www.google.com'
    6 y' D2 }, {! e# I" U  ]
  6.   },
    8 a  G$ b/ N# m+ B8 ?1 C% x1 {
  7.   computed: {
    - c9 Z' V* A% ~  ^
  8.     site: {' m; ?5 k3 Q9 k: c  v4 d* {
  9.       // getter
    0 J# L& c3 Q% G: }+ u
  10.       get: function () {2 K0 ?0 U! h. S  c7 C, A( W
  11.         return this.name + ' ' + this.url# q6 Y6 ^, {1 {  B4 _
  12.       },# X, ]' \: v) ^8 Q
  13.       // setter
    + w! s9 t) `' I. f' b  r
  14.       set: function (newValue) {
    % l- P) W2 G- X6 }% J$ e
  15.         var names = newValue.split(' ')
    3 p2 Q% i# L  }
  16.         this.name = names[0]
    : i9 E; B2 S# M7 r1 I1 h+ h: n* s
  17.         this.url = names[names.length - 1]3 ^1 n4 g3 a  e3 R% f& e) W
  18.       }& |5 \5 g1 \5 h
  19.     }
    % p/ T) q) @# a# o* y2 J
  20.   }
    . B5 [* ^$ J# O' u" O/ O/ O- w
  21. })
    6 P  h* c& S2 w* ]. {2 Z
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新% i4 v' `( K# i+ m
  23. vm.site = '百度教程 http://www.baidu.com';2 z4 w' R( o+ d+ n- A" G- U+ S
  24. document.write('name: ' + vm.name);1 |, }+ I4 s# Q  M; r
  25. document.write('<br>');
    2 Z3 F: X: E$ N* A7 D, A
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
: i. @/ b1 ]! r; n, ]+ g5 s
8 W3 c% N. P; @( P/ N1 Y, x
/ s9 W1 V- j( u; E: i/ o' L0 y: k' [% |+ Q

/ d. E1 n2 T6 i# s, @  X1 p$ ~6 Y) Z) m! ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 21:42 , Processed in 0.125893 second(s), 22 queries .

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