cncml手绘网
标题: Vue.js 计算属性 [打印本页]
作者: admin 时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 16 P' A$ X t" C @* x: |
- <div id="app">
3 o9 ?& q+ m" H - {{ message.split('').reverse().join('') }}5 y9 c$ ?( ^, v: ^9 s
- </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 28 z1 D( S8 k0 k; b' t: W, r7 a
- <div id="app">
9 L8 |' [, L. q$ A+ a6 v - <p>原始字符串: {{ message }}</p>4 ^" o( o% O' {5 e; T I
- <p>计算后反转字符串: {{ reversedMessage }}</p> P6 O: _: b& t4 d
- </div>3 n* ]) d* ^9 a" q. W" Q6 D
- $ B4 F3 k! X E) q
- <script>
6 _" {3 [$ n* m8 P$ w1 D7 A - var vm = new Vue({
& j( Q, y; s* [ - el: '#app',
) F1 _1 h3 S: Z; o - data: {
3 b6 K! O+ _( ?' X+ ~! `+ h - message: 'Runoob!'' i6 v: a7 n8 M6 A
- },0 v; y" J P: B; A. z0 o
- computed: {
6 b7 }% Q& c* G7 ?; y - // 计算属性的 getter3 J) F- O8 Z W
- reversedMessage: function () {/ X I8 h, a7 d8 R$ e$ ^
- // `this` 指向 vm 实例
- ~# S. g. m9 I6 {0 X - return this.message.split('').reverse().join('')- b- n; L% R0 k) d2 q
- }
) k) x0 q! c; ? - }3 E# X2 Y5 `: z! I3 W
- })
. ~, P- z5 }5 f - </script>
复制代码实例 2 中声明了一个计算属性 reversedMessage 。
提供的函数将用作属性 vm.reversedMessage 的 getter 。
vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。
computed vs methods我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
实例 3
- {9 T0 d0 R1 j N1 k3 p) `- methods: {# _: y$ P0 l; _' |1 U0 c9 \
- reversedMessage2: function () {
: \5 k6 r( @. ^. O: A' w - return this.message.split('').reverse().join('')4 F3 \1 X: |5 G6 O5 D: G3 z
- }3 G8 \$ j' Y6 {$ I9 v4 |8 Y) R4 t* ?2 w
- }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4+ x; [( `, n- W2 z Y* z7 |
- var vm = new Vue({& g {8 M4 F% A: n) C" v* f
- el: '#app',
' a- D* ~+ r' D: I - data: {
" t W' w" B4 Y# u5 V - name: 'Google',
6 O! L0 e* M/ J$ r% w/ |$ _6 Z( s - url: 'http://www.google.com'
& E$ I/ q. R' s- {! ` I+ _3 l" r - },8 r- G9 `) v) u5 t: M
- computed: {
c& f* i7 K1 t) U+ b - site: {
3 M' C( g. d0 f4 T+ v& E - // getter
/ i* ?% N" k; f O) L! L ]. H. }5 G - get: function () {. g: D. j @" P3 u& Y- w- f5 N) b
- return this.name + ' ' + this.url
+ o$ ]+ z& V: k% [ - },1 w# E7 b- l/ R1 n1 y$ ~! L, U5 R
- // setter+ m( s4 [' k0 p
- set: function (newValue) {
5 O5 z1 o) W/ V# e/ E' M7 s2 q - var names = newValue.split(' ')
, W {/ L2 R# J* I7 ? g5 j - this.name = names[0]% W% }& K/ k. D9 C! n, N h; Z9 N
- this.url = names[names.length - 1]- [- y8 n, I. V4 T
- }& O* h* G! t, G
- }7 o3 A; L5 s% t0 o
- }* X P( ~+ z R5 A
- })
- W4 ~( e! {8 D% M - // 调用 setter, vm.name 和 vm.url 也会被对应更新
% W/ c1 W0 O% C' Q6 x - vm.site = '百度教程 http://www.baidu.com';0 `$ @" A: x* A1 a- C
- document.write('name: ' + vm.name);" C% l$ G* \! ?4 W- E
- document.write('<br>'); w. y6 E# d' L2 A+ l% t. a
- document.write('url: ' + vm.url);
复制代码 从实例运行结果看在运行 vm.site = '百度教程 http://www.baidu.com'; 时,setter 会被调用, vm.name 和 vm.url 也会被对应更新。
2 z# e _% D3 {# j1 I
6 q+ b/ t/ i L; C: H
* w# p- ]: k- p7 t# N/ Q
* ]+ C" v; }/ o/ D2 u/ L
- l k8 l2 R6 w# k
" ] P e) s2 b. s+ f6 c' P7 C
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |