在Vue.js中使用TypeScript的方法


Posted in Javascript onMarch 19, 2020

虽然 vue2.x 对TypeScript的支持还不是非常完善,但是从今年即将到来的3.0版本在GitHub上的仓库 vue-next 看,为TS提供更好的官方支持应该也会是一个重要特性,那么,在迎接3.0之前,不妨先来看看目前版本二者的搭配食用方法吧~

创建项目

  • 虽然GitHub上有各种各样相关的Starter,但是使用 Vue CLI 应该是目前相对比较好的方式,在使用 vue create 创建新项目时,对 preset 选择 Manually select features 选项,之后添加 TypeScript
  • 如果想在vue应用中完整使用ES6中提供的类特性,那么在 class-style component syntax 处选择Y(本文主要介绍选择Y的情况)
  • 对于 Babel 来说,一般情况选择使用,而 linter / formatter 的具体选择可根据项目需求,此处不多说明

进入项目

创建完成后,看一看 package.json ,可以发现 vue-class-componentvue-property-decorator 以及其他ts相关的modules都已被添加,其中: vue-class-component 可以让你使用class-style语法创建组件,比如以下代码:

<template>
 <div>
 <button @click="decrement">-</button>
 {{ count }}
 <button @click="increment">+</button>
 </div>
</template>

<script lang="ts">
 import Vue from 'vue'
 import Component from 'vue-class-component'

 // Define the component in class-style
 @Component
 export default class Counter extends Vue {
 // Class properties will be component data
 count = 0

 // Methods will be component methods
 increment() {
  this.count++
 }

 decrement() {
  this.count--
 }
 }
</script>

vue-property-component 则完全依赖于前者,提供了除 @Component 外的其他几种装饰器,比如 @Prop

import { Vue, Component, Prop } from 'vue-property-decorator'

 @Component
 export default class YourComponent extends Vue {
 @Prop(Number) readonly propA: number | undefined
 @Prop({ default: 'default value' }) readonly propB!: string
 @Prop([String, Boolean]) readonly propC: string | boolean | undefined
}

再来一个二者结合的简单例子吧:

<template>
 <div class="hello">
 <h1>{{ msg }}</h1>
 <h1>{{ fullName }}</h1>
 <button @click="reverseStr()">Reverse</button>
 </div>
</template>

<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';

@Component
export default class HelloWorld extends Vue {
 @Prop() private msg!: string;
 firstName = "rapt";
 lastName = "azure";

 mounted() {
 console.log('mounted');
 }

 // Computed property
 get fullName(): string {
 return this.firstName + this.lastName;
 }

 // Method
 reverseStr() {
 this.firstName = this.firstName.split('').reverse().join('');
 this.lastName = this.lastName.split('').reverse().join('');
 }

}
</script>
  • 此时,你的vue项目已经有fully-typed的可能了,当然也会有更好的自动补全以及错误提示。
  • 为了更好的确定类型,可以创建例如 interfaces 这样的文件夹,充分利用ts的接口和类来使项目有更好的组织结构,可读性和维护性。

另一种选择

其实当然也可以不使用class风格啦,这样的话,就和平时熟悉的vue更为相似了,而对类型当然也是完全支持的。
这里也提供一个简单的例子吧~<template>

<div class="hello">
  <h1>{{ msg }}</h1>
  <h1>{{ test }}</h1>
 </div>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
 name: 'HelloWorld',
 props: {
  msg: String,
 },
 data() {
  return {
   test: "Hello from TS" as string
  }
 },
 methods: {
  pressMe(): string {
   return this.test + 'br'
  }
 }
});
</script>

其他的话

  • 本文只是简要探讨了在Vue.js中使用TypeScript的可能性,更多的相关内容在 官方文档 里可以找到哦,或者也可以多去Github的Vue区,TS区逛逛呢~
  • TypeScript的出现为JavaScript的生态带来了新活力,不管是前端三大框架Vue,React,Angular,还是Node系的后端框架比如Nest和Express,都在积极拥抱TS,希望以后整个生态会发展得越来越好吧~

总结

到此这篇关于在Vue.js中使用TypeScript的文章就介绍到这了,更多相关Vue.js使用TypeScript内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript cookies操作集合
Apr 12 Javascript
jQuery与其它库冲突的解决方法
Jun 25 Javascript
js中各浏览器中鼠标按键值的差异
Apr 07 Javascript
javascript中取前n天日期的两种方法分享
Jan 26 Javascript
Bootstrap媒体对象的实现
May 01 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
Nov 01 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
Jun 13 Javascript
jQuery实现简单的计时器功能实例分析
Aug 29 jQuery
Vue项目中使用jquery的简单方法
May 16 jQuery
在vue-cli 3中给stylus、sass样式传入共享的全局变量
Aug 12 Javascript
JS+CSS实现3D切割轮播图
Mar 21 Javascript
JS实现长图上下滚动效果
Mar 19 #Javascript
JavaScript实现简单计算器
Mar 19 #Javascript
jQuery实现颜色打字机的完整代码
Mar 19 #jQuery
webpack 动态批量加载文件的实现方法
Mar 19 #Javascript
vue-cli3项目升级到vue-cli4 的方法总结
Mar 19 #Javascript
js实现经典贪吃蛇小游戏
Mar 19 #Javascript
javascrpt密码强度校验函数详解
Mar 18 #Javascript
You might like
简单的php中文转拼音的实现代码
2014/02/11 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
在Python程序中操作MySQL的基本方法
2015/07/29 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
python实现加密的方式总结
2020/01/19 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Ruby如何定义一个类
2012/10/08 面试题
店长岗位的工作内容
2013/11/12 职场文书
考试退步检讨书
2014/01/15 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
三万活动总结
2014/04/28 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL