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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
% N7 K  w* a6 A# Z5 M8 @
  1. <div id="app">
    * j2 _: b5 F& q
  2.   {{ message.split('').reverse().join('') }}/ j1 f% I8 e2 f& J. D8 W
  3. </div>
复制代码
实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2
( h% r  K4 S, N: a; z
  1. <div id="app">0 f, ]. ], v% n2 T3 _+ a5 p
  2.   <p>原始字符串: {{ message }}</p>9 c9 P' K$ n0 ?1 z
  3.   <p>计算后反转字符串: {{ reversedMessage }}</p>% ]% `; ?, B% e; |
  4. </div>* F' a7 f6 x- z7 o1 F! |$ k

  5. . F5 u. k: {3 }
  6. <script>' g4 u1 h: x  T* I
  7. var vm = new Vue({8 I. p. p& T, M* u, R. [
  8.   el: '#app',
    1 @' R( f7 \& |& L* m& g0 k5 o
  9.   data: {! p9 k! x( v; k/ W
  10.     message: 'Runoob!'
    7 p( f1 ]/ q! x3 r8 S5 v/ `. ~
  11.   },  s2 S% o; _$ n. R7 H
  12.   computed: {/ J& N' c7 n* k9 m3 F
  13.     // 计算属性的 getter
    " @  X! n  N/ V7 F) p, O& l0 m
  14.     reversedMessage: function () {
    ) t. b& k" _4 n+ H6 E# @9 [6 V  M
  15.       // `this` 指向 vm 实例% N0 K7 O$ `. f+ x. H8 P$ w
  16.       return this.message.split('').reverse().join('')/ n) a6 T) a: X" n1 j! Y: @+ [& l
  17.     }2 `) h7 o0 p! m& I0 L! W8 y, R. {+ I
  18.   }- q% A8 w- @/ L  t
  19. })' m6 q  T. B4 k4 x' i
  20. </script>
复制代码
实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
5 Z5 h# G' e3 M: m: O
  1. methods: {
    1 ?6 h0 B+ {1 _1 Z6 m/ ^+ Q
  2.   reversedMessage2: function () {: H7 M8 N; L4 `& Y$ Q3 L
  3.     return this.message.split('').reverse().join('')) D7 R- W) H3 ^5 R3 E7 U
  4.   }
    ; J* b7 x5 a4 j2 s5 G  ^8 w
  5. }
复制代码
可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed setter
computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 41 E( v6 f0 d* R) t7 y9 h% H
  1. var vm = new Vue({
      S; e1 U/ g' w6 q
  2.   el: '#app',* K0 l* }+ i% C2 p8 b: F. w" T; h
  3.   data: {7 G3 ]2 ?! y% `' w, I& P
  4.     name: 'Google',) n/ k* Z: X: u" L+ H
  5.     url: 'http://www.google.com'9 W# [% h9 j& u1 s
  6.   },
    6 R$ s7 c, B; e5 o8 k. A
  7.   computed: {0 o% L, d  G% L# {7 U2 t
  8.     site: {) N) s) Q  X' ~" |3 ^
  9.       // getter1 h6 a  e4 V6 Q+ H. u: P4 a
  10.       get: function () {+ [$ c! h1 n- \" g1 l9 g9 T
  11.         return this.name + ' ' + this.url
    8 p  F6 E6 ~3 s( n1 |. o
  12.       },
    % n9 ?6 |" w: G
  13.       // setter, X* _. y. T2 L5 C& l0 R' [/ V
  14.       set: function (newValue) {
    " a% u- ?/ }+ l& p) {7 }& p2 S) O
  15.         var names = newValue.split(' ')
    , G* O* I3 e# V2 D
  16.         this.name = names[0]- s$ b. `* [& G! G
  17.         this.url = names[names.length - 1]
    1 r2 V( [7 [2 F* W  L+ v8 E! O1 r
  18.       }# s+ M% a) X  T& X: R
  19.     }5 c0 e$ K2 D) y4 F$ o$ S6 `6 A5 L4 }
  20.   }0 b' l' _$ ^( J8 L, E7 A: s& W6 W
  21. })/ x$ ]% k+ j3 ^. k; w# D# s3 _
  22. // 调用 setter, vm.name 和 vm.url 也会被对应更新/ W9 ^& L6 L- x; q
  23. vm.site = '百度教程 http://www.baidu.com';; e% y& q, \& z+ f. e# i" L8 ~' S
  24. document.write('name: ' + vm.name);
    7 e- Z+ A9 w. v5 n2 f4 c$ P$ e
  25. document.write('<br>');
    1 J: ?2 A# z& c: L+ k3 W
  26. document.write('url: ' + vm.url);
复制代码
从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。7 F0 A  t4 @# i& L: T

( k6 j& Q  b( `
4 j- Y# ~+ _+ G; X6 H: w/ ]
0 i; j/ `, u* O3 T9 y; M# P0 l: t% k( ?

3 G+ {9 n. B; D* x% l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:54 , Processed in 0.084944 second(s), 24 queries .

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