将Typescript
引入Vue
的原因有以下几个:
- 可读性。
ts
是js
的超集,支持js
的所有语法,并对js
进行了一些扩展。大大提高了代码的可阅读性。 - 静态类型检查。 静态类型检查可以避免很多不必要的错误,不用通过调试来发现这些问题。
- 代码提示。
ts
配合vscode
,代码提示非常友好。 - 代码重构。 在全项目中更改某个变量名,会自动修改整个项目的
import
。
TypeScript
在vue中的使用完全依靠的是vue-property-decorator
模块。该模块中主要有这几个属性。
- 1、@Component (完全继承于
vue-class-component
) - 2、@Prop
- 3、@Model
- 4、@Watch
- 5、@Emit
- 6、@Inject
- 7、@Provide
- 8、Mixins (在vue-class-component中定义)
在vue的es6环境中,组件的使用方式是这样的。
<script>
import Chart from '@/components/Charts/Keyboard'
import "../mixin/mixin.js"
export default{
model: {
prop: 'checked',
event: 'change'
},
data(){
return{
valA:"hello world"
}
},
props:{
entityId:{
type:String
},
msg: {
default: 'default value'
},
flag: {
type: [String, Boolean]
},
},
mixins: [myMixins]
components: { Chart },
computed:{
count(){
return "test"
}
},
watch: {
'person': {
handler: 'onPersonChanged',
immediate: true,
deep: true
}
},
created(){},
mounted(){
this.$on('emit-todo', function(n) {
console.log(n)
})
this.emitTodo('world');
},
methods:{
todoCount(){
},
emitTodo(n){
console.log('hello');
this.$emit('emit-todo', n);
}
}
}
</script>
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
46
47
48
49
50
51
52
53
54
55
56
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
46
47
48
49
50
51
52
53
54
55
56
而在vue和Ts的集成环境中,是这样的。
<script lang="ts">
import {Vue, Component,Prop,Model} from 'vue-property-decorator';
import Chart from '@/components/Charts/Keyboard'
@Component({
components:{
Chart
},
mixins: [myMixins]
})
export default class "组件名" extends Vue{
//props属性
@Prop(String) entityId!:string;
@Prop({default:"default value"}) msg!:string;
@Prop([String, Boolean]) flag:string | boolean;
//model属性
@Model ('change', {type: Boolean}) checked!: boolean;
//data
valA :string="hello world";
//计算属性
get count(){
return "test";
},
//watch
@Watch('person', { immediate: true, deep: true })
created(){},
mounted(){
this.$on('emit-todo', function(n) {
console.log(n)
})
this.emitTodo('world');
},
//methods
todoCount(){
},
@Emit() //对应着$emit
emitTodo(n: string){
console.log('hello');
}
}
</script>
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
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