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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
, C: S- Z8 K, v' ?- k6 u
  1. <div id="app">
    % y1 Y" o0 i' u1 a7 n) @$ `( c0 [6 ^
  2.   {{ message.split('').reverse().join('') }}/ U$ B" n* [- K" A
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2( B9 I& w, |' j- Q1 C3 F+ k8 d  P9 o
  1. <div id="app">3 p' C$ B6 t; h1 d
  2.   <p>原始字符串: {{ message }}</p>/ f7 I0 s' v; x( Z* ^
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>
    & h3 G6 A* ?# C" e, o1 ?
  4. </div>
    5 o7 v* Y0 g/ ]; ?0 B9 a3 j/ P
  5. 1 [  I7 @' t3 b6 i2 ^
  6. <script>
    % E' B9 o! C$ n, z( a) M
  7. var vm = new Vue({
    & _% V3 ^5 ^7 Z% |
  8.   el: '#app'," J7 t: d4 d/ p- b/ w
  9.   data: {$ w, s3 F3 [. U8 [0 V* K. v5 |5 ^
  10.     message: 'Runoob!'4 ~* K3 J8 `6 w5 m: J" h
  11.   },
    6 p0 S5 m( b- I2 A' a8 I6 p
  12.   computed: {
    % r3 S) I9 U! Z9 r
  13.     // 计算属性的 getter4 u' ?" d" U- T8 h8 g0 H
  14.     reversedMessage: function () {
    9 h  ^5 i. U- c0 a, r
  15.       // `this` 指向 vm 实例
    : ?2 J2 Y0 E* t- X
  16.       return this.message.split('').reverse().join(''), V# X# _8 @) s. Q0 a
  17.     }
    . i3 v* {1 }$ z3 W7 {' ~, w. y
  18.   }
    5 W4 M  K, k7 \7 ]. h
  19. })' O& @' d1 v, C
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3* o! J$ r( P: q" i
  1. methods: {4 z. D) g1 B. K/ o
  2.   reversedMessage2: function () {, K1 ^+ W0 j4 k6 K
  3.     return this.message.split('').reverse().join('')
    3 S% d& I. j  j; B- `
  4.   }; A7 i1 I- L: k' i. E( _) |
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4) y6 y' U+ C( g  b: C7 ~- z
  1. var vm = new Vue({
    ( l! u& Z; W. V2 s: u/ R
  2.   el: '#app',
    / V  a/ t& u/ z9 U! E+ w
  3.   data: {& T: R1 Q. i* v) |% L9 R
  4.     name: 'Google',  \/ K( l/ A) r' i" ?' N8 T
  5.     url: 'http://www.google.com'
    : T, O+ W/ J2 r" }
  6.   },
    $ S, a6 f# s) s* D6 i
  7.   computed: {8 X0 p% g; g! s1 G
  8.     site: {0 \5 Q6 u; F/ ]" R% s5 j* {
  9.       // getter. z4 p; c  S$ X- u* X
  10.       get: function () {7 ?4 A: A* H. ]* |1 \
  11.         return this.name + ' ' + this.url
    - f# U! {1 b" A9 u; O$ Z
  12.       },3 F! l" }$ l  [+ O5 M
  13.       // setter4 E2 t, }$ e% c* G2 _
  14.       set: function (newValue) {: ~; K. L/ _0 L2 V# q
  15.         var names = newValue.split(' ')
    , O+ z- a  U+ e7 e0 S8 C
  16.         this.name = names[0]
    8 i, A& H2 @2 q5 e0 w
  17.         this.url = names[names.length - 1]/ v$ G+ f5 @3 H9 w3 X! w
  18.       }' o8 x5 {( Z: H4 @  |3 C% i
  19.     }. U  e% u& C  s1 H# G7 `
  20.   }  K  @* k! Q. M: X2 L2 @
  21. })
    8 K% X9 R9 h! U& H
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新
    # }1 L4 F$ [3 z0 _" {
  23. vm.site = '百度教程 http://www.baidu.com';9 E$ f+ U! E6 x/ G
  24. document.write('name: ' + vm.name);& x( [+ B/ b3 W# [7 Z
  25. document.write('<br>');$ d) q$ Z' i4 i" v6 @) A
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
- O/ e0 S% R% I  c
* g' m) w& |. a# `" y) y
% S+ O( V8 e4 j5 d3 N8 U
. k% `- q- q6 G$ H* f0 m
- h. H- `; n+ ]7 N' n& Y5 o: m4 F/ b6 k- H$ V  i7 o9 Q" {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:28 , Processed in 0.069921 second(s), 23 queries .

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