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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 18 R- [' v8 N" I- ], f
  1. <div id="app">: T7 R8 `' P$ _
  2.   {{ message.split('').reverse().join('') }}" N, n+ K; r  a. h; V
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 25 p6 V& b/ f# ^
  1. <div id="app">" Y* O7 B0 L! _
  2.   <p>原始字符串: {{ message }}</p>
    - H' A, @! h8 U- N
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>9 `4 u! D5 ]; _  \  K
  4. </div>6 R- a# U% Z4 W, G1 n- z. j
  5. 8 l* Y/ {. G- m/ h- Y
  6. <script>, f* H$ Y0 Q/ R$ Z9 g+ o- F; o; X
  7. var vm = new Vue({
    9 q* }1 T( l# x7 V# L# \
  8.   el: '#app',# R6 h7 ^3 D/ J& v5 c. F/ \
  9.   data: {5 [3 I5 Z5 w! l# C% J
  10.     message: 'Runoob!') a' C, i8 @. q: W9 y2 s4 P# }2 Q# r
  11.   },8 H  D+ ~  O8 s9 E
  12.   computed: {
    # X' z1 X4 }5 w# }6 K8 @
  13.     // 计算属性的 getter3 @3 e6 Y0 o$ ]1 U0 V! L
  14.     reversedMessage: function () {7 P. G" V, ]( i8 `' }4 B, E: I# U
  15.       // `this` 指向 vm 实例! a0 e% Z  m+ X' i
  16.       return this.message.split('').reverse().join('')' x2 z, z  M. I0 L' M6 {
  17.     }6 n- u7 {; I" C8 \
  18.   }9 m  N  h" ?! W4 L9 o% Y
  19. })
    3 o# d9 b# y8 ]9 Z: N+ ]
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
7 m) H, Y& x5 f1 C8 v! b1 E
  1. methods: {7 d- L: M8 a( V( l8 _  `( F9 h
  2.   reversedMessage2: function () {
    " Y: v" e7 l- Y+ J' V# K6 e( j
  3.     return this.message.split('').reverse().join('')
    " B! q- L6 a8 {: a- H
  4.   }
      j* ?+ c- _; v9 O
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 47 z# B  R) j1 y# C6 s( G  T# I$ I9 N  m
  1. var vm = new Vue({, _, Y# s/ B/ K8 H4 J- B( u
  2.   el: '#app',
    8 \6 U8 {  d, ]( @4 S" O& A* o
  3.   data: {
    ( m; |3 N! h" ~7 ?: {6 j
  4.     name: 'Google',
    6 z* U% I% U; c/ U8 y
  5.     url: 'http://www.google.com'+ D- t3 `: l: a# a2 G$ L% s
  6.   },
    0 U) u" T( \( ^. O8 P
  7.   computed: {4 b( d3 I1 @& X' g  }5 W5 i. L
  8.     site: {: q7 R! x  _( e3 i
  9.       // getter
    - T8 ~' J' @- h0 D. _! |- b# d
  10.       get: function () {
    3 r$ |2 E+ M* R/ z
  11.         return this.name + ' ' + this.url# g8 `0 o* \+ m- E6 ~+ q1 }& X4 v: O
  12.       },
    ; T2 i" H/ \! l! d6 y
  13.       // setter; s" J  N6 z0 _+ o9 s* z! P
  14.       set: function (newValue) {
    9 x6 e, s2 _4 M" K
  15.         var names = newValue.split(' ')' J0 E( V& l/ e( b7 x  k; C7 i
  16.         this.name = names[0]( E: x. K+ Y1 |6 _' F
  17.         this.url = names[names.length - 1]
    7 ]/ B# _' c1 B
  18.       }/ e% y, T% d0 N. i
  19.     }
    " x- ~+ L. J8 y9 x2 U' E; J
  20.   }0 w6 j- j! v1 K. g
  21. })4 Y4 ]: ^" j" I/ A3 w- t" I
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新5 c4 E5 b9 Q( H: f9 R9 r7 @
  23. vm.site = '百度教程 http://www.baidu.com';3 O( _$ |2 W, \4 c
  24. document.write('name: ' + vm.name);
    * `. X9 v* D: D: ~2 P2 h( A
  25. document.write('<br>');# j; p* [8 u  |9 g, @3 k
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
: A! e! M7 {# `9 F# N0 ]) v" X
* s' C5 L. o. y8 Y! U7 W" S# P$ C+ R8 C9 ~9 m- V! W

' x9 ^) ~5 R7 }
2 X# w: o) ?9 _# ^) c" j/ j8 P. A: F- d2 Y: R- N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:44 , Processed in 0.056494 second(s), 23 queries .

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