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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 13 I! w( l6 V  A- m% ]5 n
  1. <div id="app">
    9 G: E+ v  z; y8 W6 E6 Y# a
  2.   {{ message.split('').reverse().join('') }}& H4 A. _! `( N5 L3 W
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
8 l) p7 l6 M. k  |( y0 S0 P
  1. <div id="app">
    1 \* t7 |. G7 _7 D: `9 D5 C# G# p
  2.   <p>原始字符串: {{ message }}</p>
    4 g$ [4 e- n' R( Z: m
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    7 N% c: R( c; f$ V
  4. </div>
    9 n) i6 H, ]4 ~9 g! v3 U& U$ d
  5. 3 {% L& R0 K( V! W$ q+ g0 S0 R
  6. <script>0 P4 ^  e4 X! Q0 w
  7. var vm = new Vue({. H; f0 A5 D" m) r9 r4 O" L; {
  8.   el: '#app',
    ' r: {& ?' h3 x
  9.   data: {
    1 |8 \! V1 o. }$ ~% z# W7 r9 X
  10.     message: 'Runoob!'
    ' b( M. m% z: H2 m
  11.   },
    9 {! C2 ]* w$ f1 |
  12.   computed: {
    6 B) z6 i) U8 }) U% M: ]' Y
  13.     // 计算属性的 getter& l9 D: G0 S, V8 O
  14.     reversedMessage: function () {  K0 K2 N6 ]& k. Y
  15.       // `this` 指向 vm 实例. q( o+ Q: r# ?+ H9 P
  16.       return this.message.split('').reverse().join('')
    * S. f! d0 ]9 U. G0 U
  17.     }' L- p& |- Y1 `2 u0 d5 f
  18.   }; E( o; u4 H" _3 T
  19. })! ]+ A/ `( M# P  {: V7 f. K
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
! x. e: J$ m; ^# h0 l- Z" ]; S8 T" U& L
  1. methods: {" M+ X$ N3 j1 l7 a  j( m, N8 E3 B- ?
  2.   reversedMessage2: function () {
    0 C4 N9 Q/ {; W1 [, S+ G9 [( h
  3.     return this.message.split('').reverse().join('')
    + ~5 j8 c8 M, n5 d) t9 V
  4.   }
    : H7 u3 W4 v: U; m; k( u
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 47 I) j. ]8 Y7 C0 ~3 i
  1. var vm = new Vue({
    % v7 j" r6 c# ]9 f. o2 S
  2.   el: '#app',6 s' }! {0 c% h. J! U6 S# B% K$ f8 h
  3.   data: {# C; b% D2 e' L
  4.     name: 'Google',
    4 Y8 a- V* X) n# g4 ?, [/ y
  5.     url: 'http://www.google.com'  z/ x$ g, z7 Y- g
  6.   },( x" T3 D% T! V$ x
  7.   computed: {% B1 n- V" O: |/ x, Y6 ?7 j
  8.     site: {" ^' c! |+ |" e: ~
  9.       // getter
    ; \2 R1 T0 ~/ N1 S$ K1 q+ a4 G
  10.       get: function () {
    7 C% R9 A6 Q9 M5 z$ j
  11.         return this.name + ' ' + this.url7 s" p( a6 \" _/ y
  12.       },
    % F( ?) B0 b' I) @( M/ ?0 Z
  13.       // setter  R8 ?  I8 ~9 l" Z  f4 x& x
  14.       set: function (newValue) {2 U, s3 X% ]; ~, p2 ^7 H# q+ a5 B
  15.         var names = newValue.split(' ')5 Y( W1 N, {7 y2 s. T' U
  16.         this.name = names[0]. v+ s" B3 _; U! ?1 Q/ g2 e: h
  17.         this.url = names[names.length - 1]- X9 a7 t% ^: }) \* @$ {" U
  18.       }# I5 O( ?5 E5 O' C
  19.     }
    5 l0 x# l, n- \( M
  20.   }) L1 v! i- F, n& [# H
  21. })5 A6 u5 [) N  `4 f; q) O/ {
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新# q6 |' W8 L9 c" G; g  h3 Q% @% e
  23. vm.site = '百度教程 http://www.baidu.com';
    2 M" b1 |9 k8 X6 R3 t' P
  24. document.write('name: ' + vm.name);
    - P! _0 u$ w* f% l- L2 @1 W
  25. document.write('<br>');1 _/ o" X& K+ X
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。1 p1 Y% B6 C; K3 b7 y

( s6 T4 J  [8 p
: ^: Y* q" ~: ]. l2 l% u$ S, a0 B& h; M- @# x* R7 F) L. Q+ k6 x

# X! m0 y; v+ w0 J& Z/ P+ [, M% B8 I7 X; z: _; [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 05:17 , Processed in 0.061307 second(s), 22 queries .

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