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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
; N4 H# G4 ]  a+ U5 t( {2 g. B
  1. <div id="app">
    , O' E/ k7 a% a/ m: t
  2.   {{ message.split('').reverse().join('') }}
    6 w# w  u7 J8 f6 T5 ~6 z3 m4 Q
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2" x2 W7 j! i: b: G4 c0 @8 i! l  E
  1. <div id="app">
    , `  ~& ?( C6 q  o
  2.   <p>原始字符串: {{ message }}</p>
    . r: R; c* ^9 m* q3 x8 K# D; c, U+ g
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    4 v6 Q3 v, X. _' S) e6 Q, O; `4 V
  4. </div>( f' W0 t  e7 w
  5. 1 |+ L8 s* x0 q: m  g
  6. <script>$ o7 J8 R! `' z
  7. var vm = new Vue({; h: E! A5 D$ X$ }5 F* z: f& h
  8.   el: '#app',: }7 ?, |, |% m; ?3 H
  9.   data: {6 [) ?) j- f) O: ?- N. V7 ]
  10.     message: 'Runoob!'
    ; C, ]7 Z$ i! w, ~$ `
  11.   },& z2 [! P) o2 s" {; l
  12.   computed: {9 y4 l9 G5 L% q# g3 x
  13.     // 计算属性的 getter
    ' s5 f4 m) l! w$ x7 W" j/ v' z0 O
  14.     reversedMessage: function () {* ?* b* K/ M7 u8 V: x
  15.       // `this` 指向 vm 实例
    # |2 ~- Q# `% n# u" k( O4 K1 a
  16.       return this.message.split('').reverse().join('')
    " H. D5 S: X0 W. p: ~1 d6 g
  17.     }
    ' f8 A/ a  q+ y& F' r; z
  18.   }
    * m- X/ R- o6 H& F
  19. })
    % _; R- c9 L: ]# c1 }  X
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3: t8 }4 K8 _5 f
  1. methods: {4 P. K4 b6 o1 R. h# g
  2.   reversedMessage2: function () {/ a7 }0 [$ P$ a; v0 }( N: Z; v
  3.     return this.message.split('').reverse().join('')+ m& V/ m* g9 ], s
  4.   }: W9 B5 T1 P; c5 [' o: e8 i
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 44 a/ H& H# C/ S( G% j* @
  1. var vm = new Vue({
    ; n$ f" R$ h$ r1 T
  2.   el: '#app',
    " ~" U  ]0 P2 x
  3.   data: {6 O$ P. a5 P9 Q+ D
  4.     name: 'Google',( T3 z+ D# v  z  g5 S: o
  5.     url: 'http://www.google.com'6 a4 G) [1 G) r3 o4 I
  6.   },
    . _2 r# e) q6 u' x" r- I
  7.   computed: {5 W9 n% z6 J: U/ f' d
  8.     site: {
    . q6 p$ [0 d; o0 G/ N& l' C
  9.       // getter- ]* j; K. s0 F* V4 R( d
  10.       get: function () {
    ! Q" {- o0 F# K) s
  11.         return this.name + ' ' + this.url& B. D* |! ]& |) e7 J, Q2 W* v
  12.       },2 X  L; h9 \* q% K5 i
  13.       // setter
    4 r: u9 p% Y) @7 y. o, i
  14.       set: function (newValue) {* ^7 B+ j8 G  c7 j; P; j7 t3 P
  15.         var names = newValue.split(' ')
    ! L  _: ?9 J' o' K# u- [
  16.         this.name = names[0]9 M2 ]/ ~. }+ F% A; \. T" m% n% g
  17.         this.url = names[names.length - 1]! N! p- U$ q# n3 v0 ?+ F( R$ }
  18.       }* ]2 {/ L/ U0 I5 K( {
  19.     }$ O" i- Q* B% a5 `) _
  20.   }) @- ~4 O3 _, x0 x+ J
  21. })9 f6 [3 t' U( {; U
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新+ Q( o' G- m+ A- @& U* b
  23. vm.site = '百度教程 http://www.baidu.com';
    ; K) |" L1 v# F# f; O
  24. document.write('name: ' + vm.name);! O" t  g8 ?; |( z$ I' Z0 r- w
  25. document.write('<br>');
    9 d2 G4 I  O. m$ V, d' o3 U4 u
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。- u1 I3 w, X- U( G, X3 r( o
  A$ V8 {4 |  T, t: Y
  D: x4 @8 Z, I' ?( ^0 B
: B1 [6 v7 u- j! l$ O& p
& G9 t5 m2 y& a& ~4 H* T# ^

9 c7 L5 d' y& k% i" E* [' I1 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:58 , Processed in 0.062184 second(s), 23 queries .

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