cncml手绘网
标题: Vue.js 计算属性 [打印本页]
作者: admin 时间: 2018-7-4 11:00
标题: Vue.js 计算属性
计算属性关键词: computed。
计算属性在处理一些复杂逻辑时是很有用的。
可以看下以下反转字符串的例子:
实例 1 \1 ]2 Q: D& S9 ?. C3 D
- <div id="app">' w& |) O; ^' E" V
- {{ message.split('').reverse().join('') }}
, F" d3 R( Y4 \! G8 A# a - </div>
复制代码实例 1 中模板变的很复杂起来,也不容易看懂理解。
接下来我们看看使用了计算属性的实例:
实例 2: p/ J3 y7 n" f* ~: P
- <div id="app">
7 L: Z" \6 h7 G. F+ k: F' _( L5 K - <p>原始字符串: {{ message }}</p>
" ^- t/ [# n! l# t - <p>计算后反转字符串: {{ reversedMessage }}</p>; o) N3 O7 R' C, v; y9 b
- </div>* K$ r# x( o2 v$ E$ |
- ) ~' ~- o$ i! W, o- `0 D4 \
- <script>9 f% Z, v' r- k5 C& i( t0 {( f
- var vm = new Vue({
) p0 P/ `- C' k2 P& y' o4 r - el: '#app',
3 @, N; ?# C6 t$ q% g2 E7 Z% _# q) ~- I - data: {
: [7 [/ `' ?/ G( r - message: 'Runoob!'. T( D; `3 I- e5 f5 E, Y
- },4 q0 y% ^3 Q# J
- computed: {
% V; \7 q$ H9 v+ S6 T, D% u - // 计算属性的 getter1 S& |0 e% ]' H
- reversedMessage: function () {; Z; Q# N) o+ ?& o W; C* n4 N
- // `this` 指向 vm 实例
' V7 s8 m$ Z( d% I% C - return this.message.split('').reverse().join('')% L9 \) o% C, \. v9 s- m8 c
- }9 H6 _) P6 b3 O; C
- }
% U: \) P! \' _$ e3 ]# t; l' q2 Y - })* H- H6 b/ U( |1 ?
- </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
- methods: {9 W! v; H+ h% @# n
- reversedMessage2: function () {5 R* U3 t" x/ D% C, O& [$ I7 c
- return this.message.split('').reverse().join('')/ W* ^5 b( N. X$ k, a. k0 I8 O- P; T
- }
* {2 `; j6 B( j. v) W - }
复制代码可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。
computed settercomputed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :
实例 4/ y8 B& X) n5 E1 L
- var vm = new Vue({
) G+ l8 g3 A& c2 i3 ~+ M$ G) { - el: '#app',
+ T; @- j4 Y( q5 Z. ~. q - data: {" V6 L4 @4 }1 \2 H4 O# ]! j
- name: 'Google',
8 E1 T* b3 [7 m: h- z. d - url: 'http://www.google.com'
5 U5 _, v6 `4 A, s5 i+ z - },2 O& ~2 {# a% W, I: I! z0 j
- computed: {
3 [6 Z, M4 S- Y, I' E& y% o$ y - site: {
1 F* R8 O/ t4 ]9 O P0 N( }) @ - // getter* C1 W* z: Y. D- j1 L
- get: function () {" R+ U4 U) ]7 l0 `
- return this.name + ' ' + this.url
8 ^7 v/ d* `7 G7 U$ }8 | - },
/ n4 N/ }6 R4 b# p* w3 t5 ^ - // setter
* `/ K% F1 r/ W' H" u. S0 q& y - set: function (newValue) {0 L# K: O. f G! r( e4 M# [! E5 F
- var names = newValue.split(' ')( U e( C L) J3 B' B- q
- this.name = names[0]
7 c% A- V) x6 H# u7 Z; Q7 p - this.url = names[names.length - 1]
0 ^* J6 f0 T0 [# W" l- v. D3 T - }
G" {7 ~+ ~. [# [$ f1 w- w# I+ k* j - }
% J {: k5 K9 S) {; a - }+ S& ~0 t0 I. g
- })
6 M+ s6 M! r u- j" I4 g1 o o6 h - // 调用 setter, vm.name 和 vm.url 也会被对应更新+ h- D( T5 a8 C* q# a0 V0 j8 E2 P
- vm.site = '百度教程 http://www.baidu.com';
" D; [6 A% D% N$ u; Y( S5 u- @ - document.write('name: ' + vm.name);1 C; g; h3 Z. Q& u0 s% \- d
- document.write('<br>');- z v7 w S0 s: u, R9 r
- 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 |