0.目录
深入理解Vue中的Typescript(一)-es语法的类属性和装饰器
深入理解Vue中的Typescript(二)-vue_component源码分析和Typescript语法
深入理解Vue中的Typescript(三)-vue2项目当中使用Typescript
1.前言
typescript
是javascript
超集,能帮助程序员写出更好的,更不容易出错的javascript
代码.所以越来越受到各大公司的欢迎.当vue
拥抱typescript
后,写出的vue
代码会更加得符合面向对象编程的风格,更符合未来的es语法的规范,因此vue3.0
选用语言就是typescript
在我们学习typescript
下的vue
前,我们不妨对比下vue2.x
当中,不用typescript
和用typescript
的区别
1.1不用TS
<template>
<div>
<button @click="handleClick">{{count}}</button>
<hello-world></hello-world>
</div>
</template>
<script>
import HelloWorld = from './HelloWorld.vue'
export.default {
components: {
'hello-world': HelloWorld
},
data(){
return {
count: 0
}
},
created(){
this.count = 1
},
methods: {
handleClick(){
this.count++
}
}
}
</script>
1.2用TS
<template>
<div>
<button @click="handleClick">{{count}}</button>
<hello-world></hello-world>
</div>
</template>
<script>
import Vue from 'vue'
import Component from 'vue-class-component'
import HelloWorld = from './HelloWorld.vue'
@Component({
components: {
'hello-world': HelloWorld
}
})
export default class Counter extends Vue {
count = 0
created(){
this.count = 1
},
handleClick(){
this.count++
}
}
</script>
上面的两种写法中,第2种用TS的方式和第1种不用TS的区别有
(1)通过extends vue
采用定义类的方式生成组件
(2)少了data
,methods
属性,采用直接在类上定义变量和方法的方式
(3)vue
其他的配置通过@Component({...})
方式定义
从上面的3个区别看出,用typescript
方式,更像是在javascript
类定义基础进行扩展,用到更多的es语法规范,
接下来,我逐步分享这个3个区别中涉及到技术点
2.概述
在弄清楚用上面第2种typescript
方式具体含义之前,我们得明白一个问题,上面3个区别点,体现语法特点,是属于vue
?还是属于typescript
?还是属于es语法
?答案是属于es语法,也就是不用typescript
,我们也可以怎么定义类,只是用了typescript
我们还可以再上述代码的基础上,做得更多,做得更好,为了更好的学习后面的知识,我们有必要先来了解目前遇到的es语法标准-类属性和装饰器,要注意的是,截止目前为止,这两个语法标准,都还是试验性标准,还没成为正式标准
3.类属性
3.1含义
回顾e6
标准,给类定义变量的方式如下
class Person {
constructor() {
this.name = '张三';//类实例的变量
}
}
Person.type = '哺乳类';//类的静态变量
使用类变量
的语法后,上面代码可以写成
class Person {
name = '张三';//类实例的变量
static type = '哺乳类';//类的静态变量
}
通过类变量
语法定义的类,语法上要更加的简洁,好写,好读
3.2 测试
接下来,我们来写下代码,测试下类变量
语法的效果,因为这是高级的es语法,我们需要通过babel做语法上的转换成低版本的es语法,才可以执行,下面是测试的步骤和相关命令和代码
(1)安装babel
打开终端,输入命令:
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
安装完毕之后,再次输入命令安装:
npm install --save @babel/polyfill
(2)安装babel插件
再次输入命令安装:
npm install --save-dev @babel/plugin-proposal-class-properties
(3)创建babel.config.js
在项目目录中创建babel.config.js文件。 编辑js文件中的代码如下:
const presets = [
["@babel/env",{
targets:{
edge:"17",
firefox:"60",
chrome:"67",
safari:"11.1"
}
}]
]
const plugins = [
["@babel/plugin-proposal-class-properties", { "loose": true }]
]
module.exports = { presets, plugins }
(4)创建index.js
class Person {
name = '张三';//类实例的变量
static type = '哺乳类';//类的静态变量
}
let p = new Person
console.log(p.name)
console.log(Person.type)
(5)使用npx执行文件
打开终端,输入命令:
npx babel-node ./index.js
4.装饰器
4.1 含义
装饰器是通过注释修改类和类的方法,同时这个修改是发送在代码编译阶段,而不是发生在运行阶段,例如下面是最简单的装饰器用法,给MyClass
类添加静态属性annotated
@annotation
class MyClass { }
function annotation(target) {
target.annotated = true;
}
MyClass.annotated //true
如果用es5
的语法,上面的语句可以写成
class MyClass { }
function annotation(target) {
target.annotated = true;
}
annotation(MyClass)
MyClass.annotated //true
前面的例子是为类添加一个静态属性,如果想添加实例属性,可以通过目标类的prototype
对象操作
@annotation
class MyClass { }
function annotation(target) {
target.prototype.annotated = true;
}
var my = new MyClass()
my.annotated //true
同时装饰器可以接受参数,例如下面例子
@annotation({
isTestable: true
})
class MyClass { }
function annotation(options) {
return function(target) {
target.isTestable = options.isTestable;
}
}
MyClass.isTestable //true
4.2 测试
接下来,我们来写下代码,测试下装饰器
语法的效果,因为这是高级的es语法,我们需要通过babel做语法上的转换成低版本的es语法,才可以执行,下面是测试的步骤和相关命令和代码
(1)安装babel
打开终端,输入命令:
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
安装完毕之后,再次输入命令安装:
npm install --save @babel/polyfill
(2)安装babel插件
再次输入命令安装:
npm install --save-dev @babel/plugin-proposal-decorators
(3)创建babel.config.js
在项目目录中创建babel.config.js文件。 编辑js文件中的代码如下:
const presets = [
["@babel/env",{
targets:{
edge:"17",
firefox:"60",
chrome:"67",
safari:"11.1"
}
}]
]
const plugins = ["@babel/plugin-proposal-decorators"]
module.exports = { presets, plugins }
(4)创建index.js
@annotation({
isTestable: true
})
class MyClass {}
function annotation(options) {
return function(target) {
target.isTestable = options.isTestable;
target.prototype.annotated = true;
}
}
let my = new MyClass()
console.log(MyClass.isTestable)
console.log(my.annotated)
(5)使用npx执行文件
打开终端,输入命令:
npx babel-node ./index.js
5.预告
弄清楚这两个高级的es的语法之后,接下来看下vue-class-component
这个项目和typescript
在vue中的更多细节
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!