Vue与TypeScript的完美结合

2023-11-20

前言:

    TypeScript 是 JS类型的超集,并支持了泛型、类型、命名空间、枚举等特性,弥补了 JS 在大型应用开发中的不足。在我们自己单独学习 TS时,时常感觉很多知识点还是比较好理解的,但要和框架结合的话,感觉就有点糟,因为我使用Vue比较多,这里就介绍Vue 框架与 TS的结合。
    下面就结合我的经验,简单介绍一下如何在Vue中平滑的从JS过渡到TS,在各位大佬面前班门弄斧了。(想了解的更具体的话,可以参考官方文档,官方文档就是最好的入门手册)

构建:

通过官方脚手架Vue-CLI构建,tips:如果没有安装就先下载安装

npm install --global @vue/cli

最新的Vue-CLI工具允许开发者使用TS集成环境创建新项目。只需运行vue create myapp,然后,命令行会要求选择预设,使用箭头键选择 Manually select features。
在这里插入图片描述
接下来,只需确保选择了 TypeScript 和 Babel 选项即可,自2020年9月更新Vue3.0之后,目前还提供Vue项目版本的选择
在这里插入图片描述
最后配置其余设置,之后就会显示安装依赖并设置项目,只需坐等
在这里插入图片描述

目录结构:

安装完成打开项目,集成 TS 后的Vue项目目录结构大致如下所示:

|--TS - Vue
    |-- .browserslistrc     # browserslistrc 配置文件 (用于支持 Autoprefixer)
    |-- .eslintrc.js        # eslint 配置
    |-- .gitignore
    |-- babel.config.js     # babel-loader 配置
    |-- package-lock.json
    |-- package.json        # package.json 依赖
    |-- postcss.config.js   # postcss 配置
    |-- README.md
    |-- tsconfig.json       # TS 配置文件(主要用于指定待编译的文件和定义编译选项)
    |-- vue.config.js       # vue-cli 配置
    |-- public              # 静态资源 
    |   |-- favicon.ico     # favicon图标
    |   |-- index.html      # html模板
    |-- src
    |   |-- App.vue         # 入口页面
    |   |-- main.ts         # 入口文件 加载组件 初始化等
    |   |-- shims-tsx.d.ts	#ts配置文件(允许.tsx 结尾的文件,在 Vue 项目中编写 jsx 代码)
    |   |-- shims-vue.d.ts	#ts配置文件(主要用于TS识别.vue 文件,TS默认并不支持导入 vue 文件)
    |   |-- assets          # 主题 字体等静态资源 (由 webpack 处理加载)
    |   |-- components      # 全局组件
    |   |-- router          # 路由
    |   |-- store           # 全局 vuex store
    |   |-- views           # 所有页面
    |-- tests               # 测试
使用:

先了解一下vue 中使用 TS 非常好用的几个库文件:

  • vue-class-component
import Component from 'vue-class-component'
  • vue-property-decorator
import { Vue, Component, Inject, Provide, Prop, Model, Watch, Emit, Mixins } from 'vue-property-decorator'
  • vuex-module-decorators
import { Module, VuexModule, Mutation, Action, MutationAction, getModule } from 'vuex-module-decorators'
  • vuex-class
import { State, Getter, Action, Mutation, namespace } from 'vuex-class'
Component声明:
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';

@Component
export default class Test extends Vue {

}
Data对象:
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';

@Component
export default class Test extends Vue {
  private name: string;
}
Prop声明:
@Prop({ default: false }) private first!: boolean;
@Prop({ default: true }) private second!: string;
@Prop({ default: "" }) private num!: number;

tips:

  • !: 表示一定存在,?: 表示可能不存在(叫做赋值断言)
  • @Prop(options: (PropOptions | Constructor[] | Constructor) = {})
    • PropOptions,可以使用以下选项:type,default,required,validator
    • Constructor[],指定 prop 的可选类型
    • Constructor,例如 String,Number,Boolean 等,指定 prop 的类型
Method声明:
public getSome(): void {
	//函数主体
}
Watch 监听属性:
@Watch("totalPrice", { immediate: true,deep: true })
private onTotalPriceChange(newVal:number, oldVal:number) {
 	//监听执行函数主体
}

tips:

  • @Watch(path: string, options: WatchOptions = {})
  • options 包含两个属性:
    • immediate?:boolean 侦听开始之后是否立即调用(即:首次是否执行)
    • deep?:boolean 被侦听的变量为对象时,需要使用才能监听它的属性改变
Computed 计算属性:
public get allPrice() {
	// 计算逻辑主体
  	return + “最后结果”
}
生命周期函数:
public created(): void {
  console.log('created');
}

public mounted():void{
  console.log('mounted')
}
Emit 事件:
import { Vue, Component, Emit } from 'vue-property-decorator'
@Component
export default class newComponent extends Vue {
  count = 0
  @Emit()
  addToCount(n: number) {
      this.count += n
  }
  @Emit('reset')
  resetCount() {
      this.count = 0
  }
  @Emit()
  returnValue() {
      return 10
  }
  @Emit()
  onInputChange(e) {
      return e.target.value
  }
  @Emit()
  promise() {
      return new Promise(resolve => {
      setTimeout(() => {
          resolve(20)
      }, 0)
      })
  }
}

tips:

  • @Emit(event?: string)
  • @Emit 装饰器接收一个可选参数,该参数是Emit的第一个参数充当事件名,如果没有提供这个参数,那么会将回调函数名,例如 priceChange 转为 price-change,并将其作为事件名
  • @Emit 会将回调函数的返回值作为第二个参数,如果返回值是一个 Promise 对象,$emit 会在 Promise 对象被标记为 resolved 之后触发
  • @Emit 的回调函数的参数,会放在其返回值之后,一起被$emit 当做参数使用
Vuex状态管理:
import Vue from 'vue'
import Component from 'vue-class-component'
import { State, Getter, Action, Mutation, namespace } from 'vuex-class'
 
const someModule = namespace('path/to/module')
 
@Component
export class MyComp extends Vue {
  @State('foo') stateFoo
  @State(state => state.bar) stateBar
  @Getter('foo') getterFoo
  @Action('foo') actionFoo
  @Mutation('foo') mutationFoo
  @someModule.Getter('foo') moduleGetterFoo
 
  // 如果省略参数,请使用属性名称, 对于每个状态/getter/action/mutation类型
  @State foo
  @Getter bar
  @Action baz
  @Mutation qux
 
  created () {
    this.stateFoo	 // -> store.state.foo
    this.stateBar	 // -> store.state.bar
    this.getterFoo	 // -> store.getters.foo
    this.actionFoo({ value: true })	 // -> store.dispatch('foo', { value: true })
    this.mutationFoo({ value: true }) 	// -> store.commit('foo', { value: true })
    this.moduleGetterFoo	 // -> store.getters['path/to/module/foo']
  }
}

    
    今天的分享到此结束,希望对您有所帮助,如果文章有错误或者有什么相关的建议,请直接私信联系我,谢谢!!!此外你如果感觉喜欢请点击进行关注,你的观看是我最大的动力,以后会不定时的分享学习心得,敬请期待(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)

——来自一个程序猿小白的自我成长 && 学习分享

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue与TypeScript的完美结合 的相关文章

随机推荐

  • STL list使用

    List 容器 list是C 标准模版库 STL Standard Template Library 中的部分内容 实际上 list容器就是一个双向链表 可以高效地进行插入删除元素 使用list容器之前必须加上
  • VMware--配置php debug环境之PHPStudy+VSCode Xdebug php调试

    目录 1 win配置php环境 1 1 配置PHPStudy 1 1 1 下载phpstudy 1 1 2 配置phpstudy 1 1 3 测试phpstudy是否配置完成 1 2 配置环境变量 1 2 1 打开环境变量 添加配置 1 2
  • OpenWrt 学习记录

    OpenWrt 学习记录 ssh setting CodePath review Makefile CURDIR MAKEFILE LIST ssh setting keygen ssh keygen t rsa C hugh win10W
  • error Missing “key“ prop for element in array react/jsx-key

    react遇到一个奇怪的问题 error Missing key prop for element in array react jsx key 检查了jsx中使用map的 都定义了key div otherList map item an
  • matlab遗传算法(GA)详解(一)算法入门

    遗传算法 Genetic Algorithm GA 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 是一种通过模拟自然进化过程搜索最优解 所找到的解是全局最优解 的方法 参数编码 初始群体的设定 适应度函数的设计 遗传
  • C++ 子类继承父类 之 构造函数

    C 子类继承父类 之 构造函数 前面常写点java的代码 对于C 基本的一些概念很模糊了 就当写个小笔记 之后遇到问题肯定还要补充 主要内容 a 子类继承父类写法 b 子类继承父类的构造函数 创建父类F h cpp view plain c
  • Java中Collections类详细用法

    1 sort Collection 方法的使用 含义 对集合进行排序 例 对已知集合c进行排序 public class Practice public static void main String args List c new Arr
  • 游戏开发物理引擎PhysX研究系列:深入学习方法思考

    无论是google还是百度 对于PhysX相关介绍实在是太少了 目前个人感受是最好通过Unity的物理相关设置来猜测PhysX相关接口的细节原理 光看c 代码去理解时 速度不是很快 有时候效果也不一定对的上
  • maven deploy plugin_Maven插件

    在默认的maven工程内默认使用的JDK1 5的版本 将JDK也看成一个项目进行处理 设置JDK的版本保证当前的IDE集成了设置Maven需要的JDK版本 修改JDK版本的方式是在项目的pom文件内使用build标签进行插件的配置 标签 b
  • DA14585 读取 SHT30温度计;

    user sht30 c file user i2c c brief user i2c source file Copyright 2018 Dialog Semiconductor This computer program or com
  • 常见电路-SD卡

    一 SD速率 低速SDIO下 速率达到0 400KHz 全速SDIO下 速率达到100MHz 本人用的SanDisk SD卡 软件设置速率16M 二 SD电路 原理图 网上有人说上拉电阻 最低10K 最高50K 没有试验过 我常用的是San
  • 变频器典型电路原理图文分析,了解变频器的内在。进线端用RST表示ABC三相,出线端用UVW表示ABC三相。应该只是相邻的字母表示三相,没有具体的物理意义

    变频器典型电路原理图文分析 了解变频器的内在 要想做好变频器维修 当然了解变频器基础知识是相当重要的 也是迫不及待的 下面我们就来分享一下变频器维修基础知识 大家看完后 如果有不正确地方 望您指正 如果觉得还行支持一下 给我一些鼓动 可以简
  • Python人脸识别黑科技(一):50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识

    Python黑科技 50行代码运用Python OpenCV实现人脸追踪 详细教程 快速入门 图像识 本篇文章我们来讲一下关于AI相关的人脸追踪 人脸识别相关的一些知识 当然本篇教程为 上 部分 讲一下利用python opencv来实现人
  • java中Keytool的使用总结

    java中Keytool的使用总结 2011 02 26 15 30 15 分类 在申请Android Map API Key的时候使用到了java中Keytool 下面转一篇介绍java中Keytool的文章 http blog csdn
  • 每日一题分享

    数字以 0123456789101112131415 的格式作为一个字符序列 在这个序列中第 2 位 从下标 0 开始计算 是 2 第 10 位是 1 第 13 位是 1 以此类题 请你输出第 n 位对应的数字 分析 0 9 共10个 10
  • 数据缺失类型:MCAR、MAR、MNAR

    2022 01 23 1 Missing Completely at Random MCAR 2 Missing at Random MAR 3 Missing Not at Random MNAR 参考 AI for Medical Pr
  • R语言实现推荐系统

    目录 1 理论基础 1 1 推荐系统 1 2 R语言 2 数据准备 2 1 数据获取 2 2 数据读取
  • SAP MASS 扩展物料的仓库管理视图

    SAP MASS 扩展物料的仓库管理视图 执行事务代码 MASS 进入如下界面 Object Type BUS1002 Materials industry 执行 进入如下界面 选中 Material Data for Each Wareh
  • markdown 添加视频、音频、gif

    参考 http blog fandong me 2017 08 25 Markdown Advance https www cnblogs com GuliGugaLiz p 10237929 html 1 在markdown里 添加 gi
  • Vue与TypeScript的完美结合

    前言 TypeScript 是 JS类型的超集 并支持了泛型 类型 命名空间 枚举等特性 弥补了 JS 在大型应用开发中的不足 在我们自己单独学习 TS时 时常感觉很多知识点还是比较好理解的 但要和框架结合的话 感觉就有点糟 因为我使用Vu