最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 深入理解Vue中的Typescript(一)-es语法的类属性和装饰器

    正文概述 掘金(黄金林)   2020-11-29   436

    0.目录

    深入理解Vue中的Typescript(一)-es语法的类属性和装饰器
    深入理解Vue中的Typescript(二)-vue_component源码分析和Typescript语法
    深入理解Vue中的Typescript(三)-vue2项目当中使用Typescript

    1.前言

    typescriptjavascript超集,能帮助程序员写出更好的,更不容易出错的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中的更多细节


    起源地下载网 » 深入理解Vue中的Typescript(一)-es语法的类属性和装饰器

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元