My Little World

vue对象属性

el

其值为vue模板挂载ID,用于标识vue的APP template挂载在index.html的什么位置

data

method

计算属性computed

通过{ {}}}插值的时候,可以在大括号里面添加一个简单的计算表达式,从而将计算结果插入,但是对于复杂的计算,需要执行多个计算表达式时不能放在大括号里面的,为方便绑定,在computed属性中定义计算属性A,A是一个函数用到变量b,然后将该A属性插入,从而实现相关值b变化,插入值A随之响应的效果

相当于计算属性因为依赖项改变而执行计算,将计算结果插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<p>Original data: "{{ value }}"</p>
<p>Computed result: "{{ doubleValue }}"</p>
<button @click='changeValue'><button>

export default {
data() {
value: 10
},
computed: {
doubleValue: function() {
return this.value * 2
}
},
method: {
changeValue: function() {
this.value++
}
}
}
//当value 变化时,doubleValue通过运算将结果插入

与method区别

也可以在大括号里面调用method中定义的方法,达到计算响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<p>{{doubleVlue()}}</p>
<button @click='changeValue'><button>
export default {
data() {
value: 10
},
method: {
doubleValue: function() {
return this.value * 2
},
changeValue: function() {
this.value++
}
}
}

当计算属性函数依赖的值不发生变化时,每次调用计算属性都会去取最后一次运算的结果,即读取缓存的结果

比如有一个计算属性A需要遍历一个庞大的数组然后得到一个结果,而这个结果则用于其他计算,这样我们就不需要每次去运算A属性函数得到结果,直接读取缓存结果即可

但如果属性A结果的得来是通过运行method方法,那么每次调用A就会进行计算一次,就会造成很大开销

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//computed方式
<p>Original data: "{{ value }}"</p>
<p>Computed result: {{ double }}</p>
<button @click='changeValue'><button>

export default {
data() {
value: 10
},
computed: {
double: function() {
return this.value + this.doubleValue
},
doubleValue: function() {
console.log('double') //只打印一次
return 2
}
},
method: {
changeValue: function() {
this.value++
}
}
}
//method方式

<p>Original data: "{{ value }}"</p>
<p>Computed result: {{ value + doubleValue() }}</p>
<button @click='changeValue'>1234<button>

export default {
data() {
value: 10
},
method: {
doubleValue: function() {
console.log('double') //value 改变一次,打印一次,即函数会被执行一次
return 2
},
changeValue: function() {
this.value++
}
}
}

计算属性还可以设置getter和setter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
computed: {
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
//给fullName设置值的时候,比如fullName = 'John Doe' 时,setter 会被调用,firstName 和 lastName 也会相应地被更新

watch

定义某个变量发生变化时需要执行的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<p>Original data: "{{ value }}"</p>
<p>Computed result: {{ result }}</p>
<button @click='changeValue'>1234<button>

export default {
data() {
value: 10
result: 0
},
watch: {
value: function() {
this.result +=10
}
},
method: {
changeValue: function() {
this.value++
}
}
}
//当value发生变化的时候,就会执行watch绑定的函数,从而可以让result发生响应

对比computed属性,假设一个结果需要依赖多个变量,如果使用watch方法则需要定义多个响应函数,而且响应函数是重复的,而如果使用computed属性则只需要定义一次即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

//computed方式
<p>Original data: "{{ value }}"</p>
<p>Computed result: {{ result }}</p>
<button @click='changeValue'>1234</button>
export default {
data() {
value: 10,
val:1
},
computed: {
result: function() {
return this.val + this.value
}
},
method: {
changeValue: function() {
this.value++
}
}
}
//watch方式
<p>Original data: "{{ value }}"</p>
<p>Computed result: {{ result }}</p>
<button @click='changeValue'>1234</button>

export default {
data() {
value: 10,
val:1
},
watch: {
value: function() {
this.result = this.val + this.value
},
val: function() {
this.result = this.val + this.value
}
},
method: {
changeValue: function() {
this.value++
}
}
}

生命周期钩子函数

components