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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 17 _' x7 h- P8 ^' v2 X. L; k: o
  1. <div id="app">6 p3 K7 {( E& v) W4 E
  2.   {{ message.split('').reverse().join('') }}
    8 q$ d& G7 v" e( \
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
$ d* m9 F* ~/ T0 `/ n* `
  1. <div id="app">. \3 d& m5 U0 L5 Y4 z8 B
  2.   <p>原始字符串: {{ message }}</p>+ y1 r9 T' v- i: k9 X( W6 ~  o
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>' @2 u  w! z4 L& i% R1 m
  4. </div>, b$ O( y  F$ h; N

  5. 5 }% v7 O1 x4 I! t; L, X5 O
  6. <script>
    3 S: w; i/ g4 V
  7. var vm = new Vue({" e  Y/ E4 l. ?
  8.   el: '#app',1 n+ U6 P$ \& w( T
  9.   data: {9 u  I$ r" d$ R/ X
  10.     message: 'Runoob!'
    6 g! Z5 N& w5 q; _( ?# f
  11.   },
    2 k+ d, v8 C, }8 x7 }# P) s$ e
  12.   computed: {7 H! D. R( w8 u3 U( i4 G5 q3 l3 R
  13.     // 计算属性的 getter
    , l; z; Z  v9 x/ a
  14.     reversedMessage: function () {; m6 |  j/ L" S- l
  15.       // `this` 指向 vm 实例
    * q5 _, _! h* ~  k
  16.       return this.message.split('').reverse().join('')9 j' i8 Y+ l" J* b3 J
  17.     }
    # H! l$ w& t2 G0 f* s
  18.   }. m, R% g! L7 u& ^% n  w2 S0 a; k6 D+ b
  19. })4 t: d: r3 x( F* `0 s
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
3 i' L4 i" a4 W+ y( S. I$ E
  1. methods: {
    0 u3 y2 D7 R+ ?3 G$ Y! c9 E
  2.   reversedMessage2: function () {
      m9 O+ h8 c" \! Y- h! M' O! M
  3.     return this.message.split('').reverse().join('')
    : l( ]4 a) D* v2 m
  4.   }
    3 v& |; A; m8 k  u
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 43 \/ [) h& Y4 ]' e! V# ^  m
  1. var vm = new Vue({
    4 ~) d7 n& ?% N4 g7 Y1 W5 A
  2.   el: '#app',$ k7 ~, e+ L6 z) x2 y
  3.   data: {5 w4 F) \( {, Q$ m
  4.     name: 'Google',% G7 Y* Y" Z( S  y
  5.     url: 'http://www.google.com'
    ; X5 p5 i- j6 t4 I) v
  6.   },
    ; L0 d& W- E# w" P3 O2 K" ^% p: c
  7.   computed: {+ i: G! B0 U; P9 |2 U$ d
  8.     site: {+ t* x8 p; H! I! {6 r* X: F
  9.       // getter
    # @4 \3 c( P. h( s( s# I* @3 G
  10.       get: function () {" r# y* K& c) M+ K, V* L" W$ G
  11.         return this.name + ' ' + this.url0 F( w0 d: L# U  y3 x! g8 P
  12.       },
    4 a0 ]* b& L- ?
  13.       // setter8 }0 Z) M1 x: v) S
  14.       set: function (newValue) {
    * t8 [. Y6 T) O# a1 U0 B; F' Q8 V
  15.         var names = newValue.split(' ')
    , O' ~! y2 J& y/ x1 }/ i
  16.         this.name = names[0]* Q2 h! m  z( m; F- ^0 A# n9 w; i
  17.         this.url = names[names.length - 1]. n8 }$ H% K2 w9 [6 s* b. A; }
  18.       }
    9 ]  Q  j. e9 A* d
  19.     }% L% ~! Z& |# _1 [! I9 H
  20.   }
    : y* f3 K$ x# F3 a0 O% `
  21. })
    1 H& s8 p0 ?* ]
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    4 Y/ w3 l4 h, o8 H2 F
  23. vm.site = '百度教程 http://www.baidu.com';
    0 J, j5 ^& `" A# c, Z, W8 l
  24. document.write('name: ' + vm.name);' R& n' h$ _; f; G7 |# H
  25. document.write('<br>');
    6 U6 \! N8 A' r9 |2 s0 `% n& `$ T
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。' `" Q( j5 a, W3 ^7 v
* L7 B1 i2 T  J* w
. Q7 e5 n, R3 U2 I0 E$ Q

% x: Y) I( H+ o  X5 y, p
# c: A$ t2 P4 y( C) u1 y. x0 I
6 v5 T' c8 l4 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-22 04:12 , Processed in 0.054390 second(s), 22 queries .

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