如何在Vue-cli3中巧妙使用TypeScript提高代码可维护性
Admin 2023-04-04 群英技术资讯 356 次浏览
类型检查、直接编译到原生js、引入新的语法糖
TypeScript的设计目的应该是解决JavaScript的“痛点”:弱类型和没有命名空间,导致很难模块化,不适合开发大型程序。另外它还提供了一些语法糖来帮助大家更方便地实践面向对象的编程。
typescript不仅可以约束我们的编码习惯,还能起到注释的作用,当我们看到一函数后我们立马就能知道这个函数的用法,需要传什么值,返回值是什么类型一目了然,对大型项目的维护性有很大的提升。也不至于使开发者搬起石头砸自己的脚。
npm install vue-class-component vue-property-decorator --save npm install ts-loader typescript tslint tslint-loader tslint-config-standard --save-dev
vue-class-component
:扩展vue支持typescript,将原有的vue语法通过声明的方式来支持tsvue-property-decorator
:基于vue-class-component扩展更多装饰器ts-loader
:让webpack能够识别ts文件tslint-loader
:tslint用来约束文件编码tslint-config-standard
: tslint 配置 standard风格的约束webpack配置
根据项目的不同配置的地方不同,如果是vue cli 3.0
创建的项目需要在vue.config.js中配置,如果是3.0以下版本的话,需要webpack.base.conf中配置。(以下说明是在webpack.base.conf文件中更改)
2.1 在webpack.base.conf文件中更改
2.1.1. 在resolve.extensions中增加.ts,目的是在代码中引入ts文件不用写.ts后缀
resolve: { extensions: ['.js', '.vue', '.json', '.ts'], alias: {} }
2.2.2. 在module.rules中增加ts的rules
module: { rules: [ { test: /\.ts$/, exclude: /node_modules/, enforce: 'pre', loader: 'tslint-loader' }, { test: /\.tsx?$/, loader: 'ts-loader', exclude: /node_modules/, options: { appendTsSuffixTo: [/\.vue$/] } } ] }
2.2.3. tsconfig.json配置
ts-loader会检索文件中的tsconfig.json.以其中的规则来解析ts文件,详细的配置可以参考https://www.tslang.cn/docs/handbook/tsconfig-json.html
我项目的tsconfig.json文件
{ // 编译选项 "compilerOptions": { // 输出目录 "outDir": "./output", // 是否包含可以用于 debug 的 sourceMap "sourceMap": true, // 以严格模式解析 "strict": false, // 采用的模块系统 "module": "esnext", // 如何处理模块 "moduleResolution": "node", // 编译输出目标 ES 版本 "target": "es5", // 允许从没有设置默认导出的模块中默认导入 "allowSyntheticDefaultImports": true, // 将每个文件作为单独的模块 "isolatedModules": false, // 启用装饰器 "experimentalDecorators": true, // 启用设计类型元数据(用于反射) "emitDecoratorMetadata": true, // 在表达式和声明上有隐含的any类型时报错 "noImplicitAny": false, // 不是函数的所有返回路径都有返回值时报错。 "noImplicitReturns": true, // 从 tslib 导入外部帮助库: 比如__extends,__rest等 "importHelpers": true, // 编译过程中打印文件名 "listFiles": true, // 移除注释 "removeComments": true, "suppressImplicitAnyIndexErrors": true, // 允许编译javascript文件 "allowJs": true, // 解析非相对模块名的基准目录 "baseUrl": "./", // 指定特殊模块的路径 "paths": { "jquery": [ "node_modules/jquery/dist/jquery" ] }, // 编译过程中需要引入的库文件的列表 "lib": [ "dom", "es2015", "es2015.promise" ] } }
2.2.4. tslint.json配置
在目录中新增tslint.json文件,由于我们前面安装了tslint-config-standard,所以可以直接用tslint-config-standard中规则,文件如下:
{ "extends": "tslint-config-standard", "globals": { "require": true } }
2.2 在vue.config.js文件中更改以下代码即可
configureWebpack: { resolve: { extensions: [".ts", ".tsx", ".js", ".json"], alias: {} }, module: { rules: [ { test: /\.tsx?$/, loader: 'ts-loader', exclude: /node_modules/, options: { appendTsSuffixTo: [/\.vue$/], } } ] } },
由于 TypeScript 默认并不支持 *.vue 后缀的文件,所以在 vue 项目中引入的时候需要创建一个 vue-shim.d.ts 文件,放在根目录下
declare module '*.vue' { import Vue from 'vue'; export default Vue; }
vue组件里大多数的方法改成通过@xxx(装饰器)来表明当前定义的为什么数据。业务逻辑js的部分就可以直接采用ts的写法了。
基本写法
模板template
和样式style
的写法不变,script
的模块进行了改变,写法如下:
<script lang="ts"> import { Component, Vue } from "vue-property-decorator"; @Component export default class Test extends Vue { }; </script>
lang="ts"
:script
声明当前语言是ts
@Component
:注明此类为一个vue组件export default class Test extends Vue
: export当前组件类是继承vue的data()中定义数据
data中的数据由原来的data()
方法改成直接在对象中定义
export default class Test extends Vue { public message1: string = "heimayu"; public message2: string = "真好看"; }
生命周期
// 生命周期 private created(){ this.init(); }
方法
private init(){ console.log('halo'); }
props传值
props的话就没有data那么舒服了,因为他需要使用装饰器了,写法如下
@Prop() propA:string @Prop() propB:number
$emit传值
不带参数
// 原来写法:this.$emit('bindSend') // 现在直接写 this.bindSend() // 多个定义 @Emit() bindSend():string{ return this.message }
方法带参数
// 原来写法:this.$emit('bindSend', msg) // 现在直接写: this.bindSend(msg) // 多个下面的定义 @Emit() bindSend(msg:string){ // to do something }
emit带参数
// 这里的test是改变组件引用的@事件名称这时候要写@test 而不是@bindSend2 @Emit('test') private bindSend2(){ return '这个可以用test接受'; }
watch观察数据
// 原来的写法 watch:{} @Watch('propA',{ deep:true }) test(newValue:string,oldValue:string){ console.log('propA值改变了' + newValue); }
computed计算属性
public get computedMsg(){ return '这里是计算属性' + this.message; } public set computedMsg(message:string){ }
完整代码案例
<template> <div class="test-container"> {{message}} <input type="button" value="点击触发父级方法" @click="bindSend"/> <input type="button" value="点击触发父级方法" @click="handleSend"/> <input type="button" value="点击触发父级方法" @click="bindSend2"/> <!-- <Hello></Hello> --> </div> </template> <script lang="ts"> import { Component, Prop, Vue, Watch, Emit } from "vue-property-decorator"; import Hello from "./HelloWorld.vue"; // 注明此类为一个vue组件 @Component({ components: { Hello } }) export default class Test extends Vue { // 原有data中的数据在这里展开编写 public message: string = "asd"; //原有props中的数据展开编写 @Prop({ type: Number, default: 1, required: false }) propA?: number @Prop() propB:string //原有computed public get computedMsg(){ return '这里是计算属性' + this.message; } public set computedMsg(message:string){ } //原有的watch属性 @Watch('propA',{ deep:true }) public test(newValue:string,oldValue:string){ console.log('propA值改变了' + newValue); } // 以前需要给父级传值的时候直接方法中使用emit就行了,当前需要通过emit来处理 @Emit() private bindSend():string{ return this.message } @Emit() private bindSend1(msg:string,love:string){ // 如果不处理可以不写下面的,会自动将参数回传 // msg += 'love'; // return msg; } //原有放在methods中的方法平铺出来 public handleSend():void { this.bindSend1(this.message,'love'); } // 这里的emit中的参数是表明父级通过什么接受,类似以前的$emit('父级定义的方法') @Emit('test') private bindSend2(){ return '这个可以用test接受'; } } </script>
关于“如何在Vue-cli3中巧妙使用TypeScript提高代码可维护性”的内容今天就到这,感谢各位的阅读,大家可以动手实际看看,对大家加深理解更有帮助哦。如果想了解更多相关内容的文章,关注我们,群英网络小编每天都会为大家更新不同的知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
jquery怎么修改data-optionsHtml5 data-* 属性定义和用法:data-* 属性用于存储页面或应用程序的私有自定义数据。data-* 属性赋予我们在所有 HTML 元素上嵌入自定义 data 属
目录一、安装axios二、配置axios,添加拦截器三、使用axios发送请求附:Vue3 中全局引入 axios总结axios中文网站:axios-http.com/zh/一、安装axiosnpm install axios --save二、配置axios,添加拦截器在src目录下新建一个request文件夹,在里面
这篇文章主要为大家详细介绍了vue实现宫格轮转抽奖,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
今天给大家分享的是JavaScript怎样实现一个简易的登录窗体的内容,小编觉得挺实用的,因此分享给大家做个参考,实现效果及代码如下,接下来跟随小编一起看看吧。
JavaScript中怎样求一个数的平方?对于一个数的平方运算,大家应该都不陌生,那么我们用JavaScript编码要怎样写呢?下文给大家分享两个方法,感兴趣的朋友就继续往下看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008