cncml手绘网

标题: Vue.js 计算属性 [打印本页]

作者: admin    时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1  \1 ]2 Q: D& S9 ?. C3 D
  1. <div id="app">' w& |) O; ^' E" V
  2.   {{ message.split('').reverse().join('') }}
    , F" d3 R( Y4 \! G8 A# a
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2: p/ J3 y7 n" f* ~: P
  1. <div id="app">
    7 L: Z" \6 h7 G. F+ k: F' _( L5 K
  2.   <p>原始字符串: {{ message }}</p>
    " ^- t/ [# n! l# t
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>; o) N3 O7 R' C, v; y9 b
  4. </div>* K$ r# x( o2 v$ E$ |
  5. ) ~' ~- o$ i! W, o- `0 D4 \
  6. <script>9 f% Z, v' r- k5 C& i( t0 {( f
  7. var vm = new Vue({
    ) p0 P/ `- C' k2 P& y' o4 r
  8.   el: '#app',
    3 @, N; ?# C6 t$ q% g2 E7 Z% _# q) ~- I
  9.   data: {
    : [7 [/ `' ?/ G( r
  10.     message: 'Runoob!'. T( D; `3 I- e5 f5 E, Y
  11.   },4 q0 y% ^3 Q# J
  12.   computed: {
    % V; \7 q$ H9 v+ S6 T, D% u
  13.     // 计算属性的 getter1 S& |0 e% ]' H
  14.     reversedMessage: function () {; Z; Q# N) o+ ?& o  W; C* n4 N
  15.       // `this` 指向 vm 实例
    ' V7 s8 m$ Z( d% I% C
  16.       return this.message.split('').reverse().join('')% L9 \) o% C, \. v9 s- m8 c
  17.     }9 H6 _) P6 b3 O; C
  18.   }
    % U: \) P! \' _$ e3 ]# t; l' q2 Y
  19. })* H- H6 b/ U( |1 ?
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 32 L9 [+ V* T3 A! y+ Y
  1. methods: {9 W! v; H+ h% @# n
  2.   reversedMessage2: function () {5 R* U3 t" x/ D% C, O& [$ I7 c
  3.     return this.message.split('').reverse().join('')/ W* ^5 b( N. X$ k, a. k0 I8 O- P; T
  4.   }
    * {2 `; j6 B( j. v) W
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4/ y8 B& X) n5 E1 L
  1. var vm = new Vue({
    ) G+ l8 g3 A& c2 i3 ~+ M$ G) {
  2.   el: '#app',
    + T; @- j4 Y( q5 Z. ~. q
  3.   data: {" V6 L4 @4 }1 \2 H4 O# ]! j
  4.     name: 'Google',
    8 E1 T* b3 [7 m: h- z. d
  5.     url: 'http://www.google.com'
    5 U5 _, v6 `4 A, s5 i+ z
  6.   },2 O& ~2 {# a% W, I: I! z0 j
  7.   computed: {
    3 [6 Z, M4 S- Y, I' E& y% o$ y
  8.     site: {
    1 F* R8 O/ t4 ]9 O  P0 N( }) @
  9.       // getter* C1 W* z: Y. D- j1 L
  10.       get: function () {" R+ U4 U) ]7 l0 `
  11.         return this.name + ' ' + this.url
    8 ^7 v/ d* `7 G7 U$ }8 |
  12.       },
    / n4 N/ }6 R4 b# p* w3 t5 ^
  13.       // setter
    * `/ K% F1 r/ W' H" u. S0 q& y
  14.       set: function (newValue) {0 L# K: O. f  G! r( e4 M# [! E5 F
  15.         var names = newValue.split(' ')( U  e( C  L) J3 B' B- q
  16.         this.name = names[0]
    7 c% A- V) x6 H# u7 Z; Q7 p
  17.         this.url = names[names.length - 1]
    0 ^* J6 f0 T0 [# W" l- v. D3 T
  18.       }
      G" {7 ~+ ~. [# [$ f1 w- w# I+ k* j
  19.     }
    % J  {: k5 K9 S) {; a
  20.   }+ S& ~0 t0 I. g
  21. })
    6 M+ s6 M! r  u- j" I4 g1 o  o6 h
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新+ h- D( T5 a8 C* q# a0 V0 j8 E2 P
  23. vm.site = '百度教程 http://www.baidu.com';
    " D; [6 A% D% N$ u; Y( S5 u- @
  24. document.write('name: ' + vm.name);1 C; g; h3 Z. Q& u0 s% \- d
  25. document.write('<br>');- z  v7 w  S0 s: u, R9 r
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
6 V! I  F0 Q4 p# s! p0 [( ]" ^$ `0 C 0 d' P( Z8 e- {8 C& |! i7 [1 g  @

& I) K& j5 s' _2 D0 ~' g
- ~, p; Z, G2 |* `2 ]
; J8 r1 W: s; N2 F
. f, D4 q$ a. Y% g2 I




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2