cncml手绘网
标题: Vue.js 计算属性 [打印本页]
作者: admin 时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1
# G/ G' M$ D# `0 c+ g- <div id="app">1 m& R1 N' s6 x3 d5 z( u
- {{ message.split('').reverse().join('') }}1 G+ P: B0 }4 g$ z/ a: W/ ]; w( R
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2; Q% s6 t3 k+ [ O; T
- <div id="app">
; t+ G) Q+ P& |/ K$ { V+ s; g. _: s - <p>原始字符串: {{ message }}</p>- S, g8 h+ Z$ }2 S3 a. u
- <p>计算后反转字符串: {{ reversedMessage }}</p>
, R/ {7 u; o$ J( g$ ]* V3 `8 C - </div>6 b, g- w: H; ?3 `% o6 B
- 2 n: m# s8 L# F \ P: r
- <script>
2 o* S( n5 X$ G* X4 ~- h! O - var vm = new Vue({
& p. Q" R5 r) y; z/ h% o" c0 h1 j# D6 r - el: '#app',
/ ?9 l) W l2 x- h - data: {
5 L! }1 z% }: d! c8 x - message: 'Runoob!'
2 k' k% n$ J3 l - },6 {+ m G. }( F2 q5 v; [8 H: |& R
- computed: {. h: x- t( @' n! @ e0 m
- // 计算属性的 getter
* U% v' B! @5 B, f6 }" s/ B) L6 E - reversedMessage: function () {
8 Z# o& b4 l/ u! x( e1 D) `( x - // `this` 指向 vm 实例$ w3 o5 X8 A2 e- v0 S# x0 i. \3 s
- return this.message.split('').reverse().join('')1 V2 g; ]% ^2 X; j
- }) c: @1 G, K+ t. X' q) v9 z
- }
6 d; ^5 t G: q/ W0 F7 P) c - })
2 A) J% S& M2 L' |- _8 Z3 X - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3: H( }7 u7 L0 \/ J
- methods: {
. S9 ?4 s9 u& G( _" a - reversedMessage2: function () {
. @$ Z, p5 Y+ ]) q4 ^; _' x - return this.message.split('').reverse().join('')
3 Y2 a- x3 V0 L1 i; p( i - }! O E) q7 k+ a2 [ n! \
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4
0 l0 ^+ Q& j8 J# i" V8 W& ?) N8 V- var vm = new Vue({
/ ^: c, u+ Z0 i1 L# v - el: '#app',
. c: |( |) E" H& _* L% | - data: {) t5 F; W1 n8 E/ g
- name: 'Google',0 l- M! U+ X! G) M# V: \) e
- url: 'http://www.google.com'
_+ p- |" ^0 `7 c - },7 D& K$ ]$ ~ ?) p. y( M4 m6 j
- computed: {) J- @' {: g" \% q q! ?# F G
- site: {
/ t6 ^7 u, I+ D4 c. Y9 S - // getter
1 d6 h. }, W0 j, D, Y - get: function () {
) p% N% V3 h3 x8 A - return this.name + ' ' + this.url: b3 z) F5 E {1 Z# ~
- },
& x" ~& s6 P- x# w; \) ] - // setter- D+ ]3 j% f# t! Q$ w {, u
- set: function (newValue) {, i$ r) Q7 o# N
- var names = newValue.split(' '), W8 @; o5 i1 k B3 S7 D0 h5 u
- this.name = names[0]
( `# G4 Z' \7 w, J3 m - this.url = names[names.length - 1]
/ H: w V6 a5 h9 ^) s8 A - }# U" `5 d, S G
- }
/ f# c4 m3 N& N w6 C% f1 O {6 Z - }
k- U1 _! m8 @! ^ - })
5 l( ?. N! d! j' K* p( A - // 调用 setter, vm.name 和 vm.url 也会被对应更新1 q+ a; Z8 `6 q) X
- vm.site = '百度教程 http://www.baidu.com';
2 u T k8 @& _* T2 D! \ - document.write('name: ' + vm.name);7 t; a+ H) ?( d' ~/ X) p0 |' t
- document.write('<br>');: z' B5 _' \, ?
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
~/ `( k( v/ I
6 x/ \- f( ^% o2 q. r" s& _0 ]' d
1 |& S1 }9 _5 E, D. _7 R& ]9 M; `+ F8 y8 p5 e* o
" K& V' F' J# |; `
3 t8 n3 z" [" G* s0 c3 G# X0 K
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |