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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
% n/ j+ d. F' v
  1. <div id="app">+ H* f& H+ h) _' o4 d4 O
  2.   {{ message.split('').reverse().join('') }}
    & k4 T# ~- ?1 Z
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
" @& g9 h1 _3 ]+ y5 }3 F( J, v
  1. <div id="app">
    : j1 t2 `5 B8 _. K) Q" X* Z
  2.   <p>原始字符串: {{ message }}</p>
    5 D. W# T4 J+ T! T* ~3 Y* q
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>' e0 R4 o$ X0 i( C. d" ?  U
  4. </div>
      m  c# g3 q  ?( d/ v! q

  5. 5 l) `7 a/ C7 d. Q
  6. <script>7 A& k: f9 S1 X
  7. var vm = new Vue({+ L( w. @& r6 U& Q7 f
  8.   el: '#app',
    1 M/ _5 h/ ]# v
  9.   data: {) k9 ?4 M+ q" a" P$ I% N, l
  10.     message: 'Runoob!'
    0 H+ r, Y% c2 y
  11.   },  U: U, ~% v! K7 n4 C
  12.   computed: {, l! m% X+ T" }( M+ \4 G3 A' p# h
  13.     // 计算属性的 getter2 t9 @0 Y$ d2 ^" T+ V1 O6 m
  14.     reversedMessage: function () {5 a  w1 D" Y/ t3 n' G# h
  15.       // `this` 指向 vm 实例
    ' R( C* v; M3 \2 U, X, n
  16.       return this.message.split('').reverse().join('')
    & _# Q- w0 ?4 g' Y2 x2 r* {
  17.     }# ^: O: R; y5 f; Q' a. l0 S8 G% ]
  18.   }/ }/ I3 _, L  q/ s
  19. })
    2 i/ ?7 M9 N! b6 A7 b( d
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3; w/ C: R5 u+ G* _
  1. methods: {
    2 S  _  F6 T4 J1 y3 f
  2.   reversedMessage2: function () {
    9 h7 N  _1 X' A# d5 \
  3.     return this.message.split('').reverse().join('')
    ) _" y3 A* o) H$ Q
  4.   }% g  F% w# _* t9 R, V7 i# p
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
( v8 Z% _( ?6 Y8 t+ [
  1. var vm = new Vue({# |6 M2 E' X, a
  2.   el: '#app',
    ' k8 L3 L# ^. s, F( d- z/ c' F
  3.   data: {
    & g: s, e& V& |' D0 a& _
  4.     name: 'Google',( v9 H) r  n- ]( m, N' B: Z
  5.     url: 'http://www.google.com'  x! g2 {4 H, e( s
  6.   },) s# _! I7 {8 l* J6 d9 O
  7.   computed: {/ i! V. O' r$ K4 t8 k
  8.     site: {
      Z3 ]. ]) c! v5 h- A- ]' G3 f
  9.       // getter
    . h' h6 M3 q8 T7 l7 Y* N% B
  10.       get: function () {
    ) o0 a) U; e: q& q3 t& A
  11.         return this.name + ' ' + this.url- R5 l+ v4 k4 w7 h# ?
  12.       },
    & k, n& ?0 ]. w
  13.       // setter# C8 W, c; {4 Z" J$ G7 S
  14.       set: function (newValue) {
    & P9 v+ M* l6 z9 U8 E* O4 r
  15.         var names = newValue.split(' ')
    7 A  x+ v* L) d  @3 T
  16.         this.name = names[0]+ ^+ C0 i- F7 i8 F% a
  17.         this.url = names[names.length - 1]: q( A+ U& o. N- y
  18.       }( `: @" V& h! y. k& G/ |
  19.     }
    ) h1 y( p3 f; I( r
  20.   }. u" X' x- |  b1 m
  21. })
    4 Y7 \8 x- E' z  Q1 s
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    # T' R) Y4 D! L4 m. E
  23. vm.site = '百度教程 http://www.baidu.com';
    2 P7 |' v, t' A% U' Q
  24. document.write('name: ' + vm.name);2 u1 L" d" w5 A/ Y0 G
  25. document.write('<br>');/ Q. P4 X' @. F4 ^
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
7 X7 P  {- Y3 X; q/ e$ q ( t  Y; \9 G# ~. e$ `
3 D5 b  |3 ^  ?0 p+ h* a0 J: t
4 L" v, h/ @1 o$ w
( i- i0 h4 k% b' f1 m0 u0 M5 m
$ c5 R* h/ R9 m" \; i& d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:48 , Processed in 0.072613 second(s), 22 queries .

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