【VUE实战项目】使用typescript重构项目

news2025/3/3 5:41:35

前言

本文是博主vue实战系列中的一篇,本系列不是专业的前端教程,是专门针对后端熟悉前端的。前面我们用vue实现了一个基础的管理系统,前文专栏地址:

https://blog.csdn.net/joker_zjn/category_12469788.html?spm=1001.2014.3001.5482

接下来我们要基于typescript来重构该项目。

目录

目录

前言

目录

搭架子

安装依赖

迁移配置

迁移其它

重构路由

api重构


搭架子

重新建一个项目来做ts的重构吧。

npx vue create project-ts

不要选择vue2还是vue3,而是选择手动设置,在手动设置里,选择上ts:

选择配置上以下内容:

然后选择2.X版本,做以下配置:

创建出来的项目的目录结构:

可以看到由于上面选择了支持ts,main.js变成了main.ts,而且代码的工程目录中多了很多关于ts的配置文件:

  • shims-vue.d.ts,用来支持在ts中使用vue

  • tsconfig.json,用来对ts进行配置

安装依赖

架子搭好了,下一步就是安装依赖。

cnpm i element-ui font-awesome axios echarts@4 -S

迁移配置

仔细想想项目里会有哪些配置?无非就是vue的配置文件,vue.config.js以及main.js。

在新项目中建一个vue.config.js,把vue的配置从老项目中复制过去,并追加一些对webpack的配置:

module.exports = {  
    devServer:{
      open:true,
      host:'localhost',
      //配置代理
      proxy:{
        '/api':{
          //目标地址
          target:'http://127.0.0.1:8081/api/',
          //开启跨域
          changeOrigin:true,
          pathRewrite:{
            '^/api':''
          }
        }
      }
    },
    //对webpack进行配置
    chainWebpack(chainWebpack){
        chainableWebWebpack.resovle={extensions:['.js','.ts','.json','.d.ts']}
    }
  }

然后将老项目的main.js手动合并到新的项目的main.ts中来:

在合并过程中有可能有些import会报错,把对应的依赖在node_moudle中删除重新install即可。

import Vue from "vue";
import App from "./App.vue";
import router from "./router";

// import '../plugins/element.js'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import 'font-awesome/css/font-awesome.min.css';
import axios from "axios";

//import service from './utils/service';

import echarts from 'echarts';

Vue.use(ElementUI)
//挂载到原型,可以在全局使用
Vue.prototype.axios=axios
// Vue.prototype.service=service;
Vue.config.productionTip = false
Vue.prototype.$echarts=echarts
Vue.config.productionTip = false;

new Vue({
  router,
  render: (h) => h(App),
}).$mount("#app");

然后我们会发现,还有老项目中的service.js还要合过来,其实不止service.js,utils下面的所有js都要拿过来:

直接把整个utils文件夹拿过来吧。

然后需要在shims-vue中配置将echarts和自己写的这些js暴露出来,在main.ts中才能被引用到:

declare module "*.vue" {
  import Vue from "vue";
  export default Vue;
}
//有一些第三方库和自定义的js或者三方的js,并不支持ts
//用declare module可以将其完成兼容,从而在ts中import它们
declare module 'echarts'
declare module '*.js'

迁移其它

配置和依赖都迁移完了,接下来该迁移其它东西了。其它还有什么?

assert文件夹、router文件夹、api文件夹、component文件夹、app.vue

将这些全数复制过来覆盖新项目默认初始化出来的即可。

重构路由

由于现在项目用的是ts不是js,所以要将原来的router.js重构为router.ts,项目初始化后router.js中是有配置示例的,直接将原来的路由里面的各个路由放入这个数组中即可:

import Vue from "vue";
import Router from "vue-router";

const routes: Array<any> = [
  {
    path: "/",
    redirect: "/login",
    name: "首页",
    hidden: true,
    component: () => import("@/components/Login.vue"),
  },
  {
    path: "/login",
    name: "Login",
    hidden: true,
    component: () => import("@/components/Login.vue"),
  },
  {
    path: "/home",
    name: "学生管理",
    iconClass: "fa fa-users",
    //默认转跳到学生管理页
    redirect: "/home/student",
    component: () => import("@/components/Home.vue"),
    children: [
      {
        path: "/home/student",
        name: "学生列表",
        iconClass: "fa fa-list",
        component: () => import("@/components/students/StudentList.vue"),
      },
      {
        path: "/home/info",
        name: "信息列表",
        iconClass: "fa fa-list-alt",
        component: () => import("@/components/students/InfoList.vue"),
      },
      {
        path: "/home/infos",
        name: "信息管理",
        iconClass: "fa fa-list-alt",
        component: () => import("@/components/students/InfoLists.vue"),
      },
      {
        path: "/home/work",
        name: "作业列表",
        iconClass: "fa fa-list-ul",
        component: () => import("@/components/students/WorkList.vue"),
      },
      {
        path: "/home/workMent",
        name: "作业管理",
        iconClass: "fa fa-list",
        component: () => import("@/components/students/WorkMent.vue"),
      },
    ],
  },
  {
    path: "/home/dataview",
    name: "数据分析",
    iconClass: "fa fa-bar-chart",
    component: () => import("@/components/Home.vue"),
    children: [
      {
        path: "/home/dataview",
        name: "数据概览",
        iconClass: "fa fa-list",
        component: () => import("@/components/dataAnalysis/DataView.vue"),
      },
      {
        path: "/home/mapview",
        name: "地图概览",
        iconClass: "fa fa-line-chart",
        component: () => import("@/components/dataAnalysis/MapView.vue"),
      },
      {
        path: "/home/travel",
        name: "旅游地图",
        iconClass: "fa fa-line-chart",
        component: () => import("@/components/dataAnalysis/ScoreMap.vue"),
      },
      {
        path: "/home/score",
        name: "分数地图",
        iconClass: "fa fa-line-chart",
        component: () => import("@/components/dataAnalysis/TravelMap.vue"),
      },
    ],
  },
  {
    path: "/users",
    name: "用户中心",
    iconClass: "fa fa-user",
    component: () => import("@/components/Home.vue"),
    children: [
      {
        path: "/home/user",
        name: "用户概览",
        iconClass: "fa fa-list",
        component: () => import("@/components/users/User.vue"),
      },
    ],
  }
];

Vue.use(Router);
const router = new Router({
  mode: "history",
  routes,
});

export default router;

唯一要注意的是,给各个组件跟上.vue,这是因为ts是有类型概念的,所以其类型检查要比js严格,使用js时路由转跳配置中组件可以没有后缀名,构建工具会在各类后缀名中反复尝试。但是到了ts,由于有强类型的概念了,构建工具就不会去自动尝试了而是一板一眼的来编译。所以在使用ts时强制要求声明文件后缀名,否则会报错。

api重构

在api目录下新建一个api.ts,将原来api.js中的内容拷贝过来,然后修改为ts。

首先在src下面创建一个type.d.ts,这是

然后拿原来的登陆方法login来示例。

先在type.d.ts中定义实体类:

export interface IUserData{
    username:string;
    password:string;
}

然后在api.ts中调用:

import { IUserData } from '../types';
export function login(data:IUserData){
    return service({
        method:'post',
        url:'/login',
        data
    })
}

最后改造出来的结果:

import service from '../utils/service.js'
import { IUserData } from '../types';
export function login(data:IUserData){
    return service({
        method:'post',
        url:'/login',
        data
    })
}
​
export function students(params:any){
    return service({
        method:'get',
        url:'/student/list',
        params
    })
}
​
export function studentDel(id:any){
    return service({
        method: 'delete',
        url:`/student/${id}`
    })
}
​
export function info(data:any){
    return service({
        method:'post',
        url:'/student/info',
        data
    })
}
​
export function getInfo(){
    return service({
        method:'get',
        url:'/student/info'
    })
}
//信息列表修改接口
export function updateInfo(data:any){
    return service({
        method:'put',
        url:'/student/info',
        data
    })
}
​
export function deleteInfo(id:any){
    return service({
        method:'delete',
        url:`/student/info/${id}`
    })
}

api.ts写好后,api.js就可以删掉了,然后全局搜一下把对api.js的引用全部改为api.ts。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1917630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java线程锁synchronized的几种情况

一、对象方法锁 1、成员方法加锁 同一个对象成员方法有3个synchronized修饰的方法&#xff0c;通过睡眠模拟业务操作 public class CaseOne {public synchronized void m1(){try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace()…

七款好用的公司电脑监控软件推荐|2024年电脑监控软件干货整理!

在现代企业管理中&#xff0c;电脑监控软件成为提高员工生产力、确保数据安全和防止信息泄露的重要工具。以下是七款适合公司使用的电脑监控软件推荐 固信软件https://www.gooxion.com/ 1. 固信软件 功能特点&#xff1a; 实时屏幕监控和行为分析。 网站访问历史记录和详细…

pytorch-RNN存在的问题

这里写目录标题 1. RNN存在哪些问题呢&#xff1f;1.1 梯度弥散和梯度爆炸1.2 RNN为什么会出现梯度弥散和梯度爆炸呢&#xff1f; 2. 解决梯度爆炸方法3. Gradient Clipping的实现4. 解决梯度弥散的方法 1. RNN存在哪些问题呢&#xff1f; 1.1 梯度弥散和梯度爆炸 梯度弥散是…

C++超市外卖小程序-计算机毕业设计源码62482

摘要 随着社会生活节奏加快和消费习惯的变化&#xff0c;外卖服务成为人们日常生活中不可或缺的一部分。超市外卖作为新兴业态备受关注&#xff0c;然而传统外卖平台在推荐精准度和用户体验方面存在挑战。 本研究旨在基于协同过滤算法&#xff0c;结合C语言和MySQL数据库&#…

信息化安全管理怎么做

企业如何做好安全管理工作?检查频次多了怕影响子正常生产经营&#xff0c;效益低下&#xff0c;检查频次少了又担心管控不住。”这是安全管理部综合业务室的困惑&#xff0c;也是很多企业的困惑。面对企业在安全管理中的困惑与挑战&#xff0c;采用信息化平台与精细化管理策略…

Java研学-Shiro安全框架(四)

六 SpringBoot集成Shiro认证 1 分析 Shiro提供认证授权功能&#xff0c;所以SpringBoot中不需再编写自定义注解&#xff0c;权限拦截&#xff0c;登录拦截&#xff0c;登录登出。Shiro 环境中有三个封装对象Subject &#xff0c;SecurityManager和Realms&#xff0c;SpringBoo…

hcip暑假第二次作业

ip配置如下 配置缺省路由 [R1]ip route-static 0.0.0.0 0 12.0.0.2 -------设置缺省路由 [R1]ip route-static 0.0.0.0 0 21.0.0.2 [R2]ip route-static 0.0.0.0 0 22.0.0.2 [R3]ip route-static 0.0.0.0 0 23.0.0.2 [R4]ip route-static 0.0.0.0 0 24.0.0.2 [R5]ip route…

python如何计算两个时间相差多少秒钟,分钟,小时,天,月,年

使用场景&#xff1a;在做上课记录系统的时候&#xff0c;有上课开始时间和上课结束时间&#xff0c;需要计算这两个时间的插值&#xff0c;以分钟为单位。 封装方法如下&#xff1a; from datetime import datetimedef sub_seconds(date1: str "2024-07-11 12:33:33&q…

编程范式之事件驱动编程

目录 前言1. 定义2. 特点2.1 异步性2.2 解耦2.3 可扩展性2.4 高度响应 3. 适用场景3.1 用户界面开发3.2 网络编程3.3 游戏开发3.4 物联网&#xff08;IoT&#xff09; 4. 优点4.1 提高效率4.2 灵活性和可扩展性4.3 解耦和模块化4.4 高响应性 5. 缺点5.1 复杂性增加5.2 调试困难…

Spring中如何操作Redis

Spring毕竟是Java中的一个主流框架&#xff0c;如何在这个框架中使用Redis呢&#xff1f; 创建项目并引入相关依赖 然后进行创建。 至此就将Redis的相关依赖引入进来了。 编写Redis配置 将application.properties修改成application.yml 然后编写如下配置&#xff1a; spr…

昇思学习打卡-16-热门LLM及其他AI应用/K近邻算法实现红酒聚类

文章目录 算法原理距离定义模型构建 算法原理 K近邻算法可以用在分类问题和回归问题上&#xff0c;它的原理如下&#xff1a;要确定一个样本的类别&#xff0c;可以计算它与所有训练样本的距离&#xff0c;然后找出和该样本最接近的k个样本&#xff0c;统计出这些样本的类别并…

青否数字人手机端APP抖音开播完整教程!

1.开播--所需硬件 安卓手机设备--支持 直播手机推荐型号&#xff1a;配备了麒麟980,骁龙865,天玑1000以上的处理器的安卓手机&#xff0c;运营内存不低于6G 网络宽带&#xff1a;上下行宽带稳定在10Mbps以上&#xff08;普通家用1000M宽带的上行速度大约为30Mbps&#xff0c;最…

二分查找模板及例题

文章目录 模板一&#xff1a;使用场景&#xff1a;解释&#xff1a;例题&#xff1a;数的范围题意&#xff1a; 代码&#xff1a; 模板二&#xff1a;使用场景&#xff1a;解释&#xff1a;例题&#xff1a;[Building an Aquarium](https://codeforces.com/problemset/problem/…

Tita的OKR:最新20个HR人力资源OKR案例

OKR是一个目标设定框架&#xff0c;可以提高员工的参与度&#xff0c;同时帮助人们专注于最重要的事情。 然而&#xff0c;OKR最大的挑战之一是设定正确的目标&#xff0c;我与很多人力资源专业人士交谈过&#xff0c;他们证明他们的OKR并不完美。 这就是为什么我们收集了最佳…

【2024_CUMCM】机器学习导论、不平衡分类模型(重采样)、交叉验证(附代码)

目录 基本概念 机器学习概念与过程 机器学习的分类 学习任务 分类与回归区分 学习方式 不平衡分类模型 什么是不平衡分类 下采样的优点和缺点 过采样的优点和缺点 交叉验证 what 过拟合 常见方法 K折交叉验证&#xff08;K-Fold Cross Validation&#xff09; …

后VMware时代,一体化技术平台建设思路

在数字化转型的浪潮中&#xff0c;企业对IT基础设施的需求正在发生根本性的变化。VMware时代的结束&#xff0c;为企业带来了重新构建技术平台的机遇与挑战。6月28日&#xff0c;在主题为【聚力生态&#xff0c;VMware全链替代】的线上研讨会上&#xff0c;灵雀云首席解决方案专…

适合运动的骨传导耳机有哪些?总结五款适合运动的骨传导耳机推荐

在追求健康生活的浪潮中&#xff0c;运动健身蔚然成风&#xff0c;而运动时的音乐陪伴更是不可或缺。然而&#xff0c;传统耳机在运动场景下的种种不便&#xff0c;促使市场寻找更佳解决方案。此时&#xff0c;骨传导耳机应运而生&#xff0c;以其独特的传音方式&#xff0c;为…

ESP32-WROVER-E/ESP32-WROVER-IE模组硬件相关

ESP32-WROVER-E和ESP32-WROVER-IE区别 带I的为采用外部天线&#xff0c;不带I的使用PCB天线。 模组后缀N16R8&#xff0c;16为4、8、16为FLASH存储器容量&#xff0c;8为8或2&#xff0c;为PSRAM的容量&#xff0c;单位均为MB。 模组芯片 ESP32-WROVER-E 和 ESP32-WROVER-IE…

tkinter-TinUI-xml实战(11)多功能TinUIxml编辑器

引言 在TinUIXml简易编辑器中&#xff0c;我们通过TinUI搭建了一个简易的针对TinUIXml布局的编辑器&#xff0c;基本掌握了TinUIXml布局和TinUIXml的导入与导出。现在&#xff0c;就在此基础上&#xff0c;对编辑器进行升级。 本次升级的功能&#xff1a; 更合理的xml编辑与…

【洞见】智算操作系统,推进算力迈入普惠智算新时代

WAIC 2024世界人工智能大会暨人工智能全球治理高级别会议正式拉开帷幕&#xff0c;面向世界徐徐展示人工智能技术最前沿的理念和成果。九章云极DataCanvas公司董事长方磊受邀参加大会开幕式&#xff0c;并在“迈向AGI&#xff1a;大模型焕新与产业赋能”论坛发表主题演讲&#…