vue3+ts实战

news2024/11/26 18:52:13

目录

一、ts语法练习

1.1、安装

1.2、语法

二、vue3+ts

2.1、项目创建

2.1.1、项目创建(建议node版本在16.及以上)

2.1.2、下载路由、axios

2.1.3、引入element-plus

2.1.4、报错解决

(1)文件路径下有红色波浪

(2)组件名称下有红色波浪

(3)引入模块下有红色波浪

2.2、导航栏模块

2.3、表格模块

2.4、事件与弹窗显示

2.5、Icon组件封装

一、ts语法练习

1.1、安装

安装:npm install -g typescript
检验:tsc -v
编译为js文件:tsc demo.ts(文件名)

1.2、语法

参考博客:TypeScript 语法_typescript 往后加n天-CSDN博客

二、vue3+ts

2.1、项目创建

2.1.1、项目创建(建议node版本在16.及以上)

npm init vite

初始化时填写项目包名称xxx,选择“Vue”、“TypeScript”

cd xxx后npm install,然后npm run dev,即可打开新项目,看到首页

2.1.2、下载路由、axios

npm i vue-router -S

npm i axios -S

在src包下创建router文件夹,并在文件夹下创建index.ts文件;

在src包下创建http/api文件夹,并在文件夹下创建http.ts文件;

(1)、router下的index.ts代码

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
// interface IRouterList {
//     name?: string,
//     path: string,
//     component?: any,
//     [propname: string]: any
// }
// RouteRecordRaw 内置的类型接口,也可以使用自定义的类型约束: IRouterList[]或者Array<IRouterList>
const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        redirect: '/home'
    },
    {
        path: '/home',
        name: 'home',
        component: () => import('../components/layout/index.vue'),
        children: [{
            path: '/index',
            name: 'index',
            component: () => import('../views/index/index.vue')
        },
        {
            path: '/monitor',
            name: 'monitor',
            component: () => import('../views/monitor/index.vue')
        },
  ]
    }
];
const router = createRouter({
    history: createWebHashHistory(),
    routes
});
export default router;

在main.ts里引入:

import router from './router'

createApp(App).use(router).mount('#app')

(2)、api下的http.ts代码

import axios, { type AxiosRequestConfig, AxiosResponse } from 'axios';
axios.defaults.baseURL = `http://localhost:3000`;
// AxiosRequestConfig:请求参数类型
// 请求拦截器
axios.interceptors.request.use((config: AxiosRequestConfig | any) => config);
// 响应拦截器
axios.interceptors.response.use((res: AxiosResponse) => {
    return res
}, err => {
    return Promise.reject(err)
});
// export default axios;
// 如何去定义传入参数类型或返回的类型         unknown:未知类型
interface IHttp {
    request<T>(method: string, url: string, params?: unknown): Promise<T>;
}
const http: IHttp = {
    request: (method, url, params) =>
        axios({
            method: method,
            url: url,
            data: params
        })
}
export default http;

页面调用接口:

<script lang="ts" setup>
import axios from '../../api/http'
import { onMounted, ref } from 'vue'
interface ItableData {
    date: string,
    title: string,
    user: string,
    id: number,
    check: boolean
}
const tableData = ref<ItableData[]>([]);
onMounted(async () => {
    let { data } = await axios.request<{ data: ItableData[] }>('get', '/data/query');
    tableData.value = data
})
</script>

不封装的话,只能一个一个写:

import axios from 'axios'
onMounted(async () => {
    axios.get('http://localhost:3000/data/query').then(res => {
        console.log(res);
    })
})

2.1.3、引入element-plus

官网:Overview 组件总览 | Element Plus

安装:npm install element-plus --save

引入:(建议按需引入)https://element-plus.org/zh-CN/guide/quickstart.html

unplugin-auto-import可以不要

注意:如果下载成功,可以在项目的package.json文件里看到对应的版本号

2.1.4、报错解决

(1)文件路径下有红色波浪

问题描述:

component: () => import('../views/index/index.vue');//(路径下面有红色波浪线)

解决方法:

在项目的vite-env.d.ts文件中加入以下代码即可

declare module '*.vue' {
    import { DefineComponent } from "vue"
    const component: DefineComponent<{}, {}, any>
    export default component
  }
(2)组件名称下有红色波浪

问题描述:

import Icons from "../common/icons.vue";  // (Icons下面有红色波浪线)

解决方法:

Vetur(语句高亮插件)暂不支持ts,可以禁用,换成Vue Language Features(Volar)或Vue - Official插件

(3)引入模块下有红色波浪

问题:import { ref } from "vue"; //(vue下面有红色波浪线)

解决方法:

在项目的tsconfig.json文件中的moduleResolution属性值改为"node"

2.2、导航栏模块

注意: <el-menu>里面有了router属性才能跳转到对应的页面

//====================================导航栏页面====================
<template>
  <el-aside width="200px">
    <!-- <el-menu>里面有了router才能跳转到对应的页面 -->
    <el-menu default-active="2" class="el-menu-vertical-demo" router>
      <el-menu-item :index="v.url" v-for="v in menuItems" :key="v.url">
        <!-- <el-icon><component :is="v.icon"></component></el-icon> -->
        <el-icon><Icons :icon="v.icon" /></el-icon>
        <span>{{ v.name }}</span>
      </el-menu-item>
    </el-menu>
  </el-aside>
</template>
<script lang="ts" setup>
import Icons from "../common/icons.vue"; 
import { useMenu } from "./navMenu";
const { menuItems } = useMenu();
</script>
//====================================navMenu.ts页面====================
import {
    Document,
    Menu as IconMenu,
    Location,
    Setting,
} from "@element-plus/icons-vue";
import { INavMenu } from '../../models';//INavMenu 是封装的接口
export const useMenu = () => {
    const menuItems: INavMenu[] = [
        { name: "首页", url: "/index", icon: Document },
        { name: "监督活动", url: "/monitor", icon: Location },
        { name: "订单管理", url: "/order", icon: Setting },
        { name: "统计分析", url: "/census", icon: Setting },
    ];
    return {
        menuItems
    }
}
//====================================models文件夹里的index.ts页面====================
export interface INavMenu {//定义接口,作限制类型
    name: string,
    url: string,
    icon?: any,
}

2.3、表格模块

下面模拟了表格自带的筛选功能、文字处理功能、文字过长展示功能以及获取接口数据展示等。

<template>
    <el-table :data="tableData" style="width: 100%">
        <el-table-column prop="date" label="Date" :filters="dateHandler" :filter-method="filterHandler" />
        <el-table-column prop="title" label="title" />
        <el-table-column prop="user" label="user" show-overflow-tooltip />
        <el-table-column prop="id" label="id" />
        <el-table-column prop="check" label="check">
            <template #default="{ row }">
                <el-tag :type="row.check ? 'success' : 'danger'">{{ row.check ? '已完成' : '未完成' }}</el-tag>
            </template>
        </el-table-column>
    </el-table>
</template>
<script lang="ts" setup>
import axios from '../../api/http';
import { onMounted, ref, computed } from 'vue';
interface ItableData {
    date: string,
    title: string,
    user: string,
    id: number,
    check: boolean
}
const tableData = ref<ItableData[]>([{
    date: '2024-5-20',
    title: '吧就',
    user: 'dcsavvvvvvvvvvvv',
    id: 1,
    check: true
},
{
    date: '2024-5-21',
    title: '的繁荣的',
    user: '超出隐藏超出隐藏超出隐藏超出隐藏超出隐藏超出隐藏超出隐藏超出隐藏',
    id: 2,
    check: false
}]);
onMounted(async () => {
    let { data } = await axios.request<{ data: ItableData[] }>('get', '/data/query');
    tableData.value = data
})
// 获取日期-动态数据(computed处理)
const dateHandler = computed(() => {
    // return tableData.value.map(item => ({ text: item.date, value: item.date }))
    const map = new Map();
    for (let item of tableData.value) {
        if (!map.has(item.date)) {
            map.set(item.date, item)
        }
    }
    let data = [...map.values()];//map去重
    return data.map(item => ({ text: item.date, value: item.date }))
})
// 筛选方法
const filterHandler = (
    value: string,
    row: ItableData,
) => {
    return row.date === value
}
</script>

2.4、事件与弹窗显示

<template>
 <el-button type="success" @click="setData('add', null)">添加</el-button>
 <el-button type="success" @click="setData('edit', row)">编辑</el-button>
 <!-- 弹出框 -->
 <el-dialog v-model="dialogFormVisible" title="操作数据" width="500">
        <el-form :model="form">
            <el-form-item label="Promotion name">
                <el-input v-model="form.name" autocomplete="off" />
            </el-form-item>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取消</el-button>
                <el-button type="primary" @click="dialogFormVisible = false">
                    提交
                </el-button>
            </div>
        </template>
  </el-dialog>
</template>
<script lang="ts" setup>
let dialogFormVisible = ref<boolean>(false);//弹框状态
let form = ref({});//弹框数据
// 添加或编辑方法
function setData(type: string, row: ItableData | null) {
    dialogFormVisible.value = true;//弹框显示
    type == 'add' ? form.value = {} : form.value = { ...row }
}
</script>

2.5、Icon组件封装

//==============================主页面============================
<template>
<el-icon><Icons :icon="v.icon" /></el-icon>
</template>
<script lang="ts" setup>
import Icons from "../common/icons.vue"; 
</script>
//==============================icons.vue页面============================
<template>
  <component :is="icon"></component>
</template>
<script lang="ts" setup>
import { defineProps } from "vue";
const { icon } = defineProps<{ icon: any }>();
</script>

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

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

相关文章

快速幂算法6

eg: n10&#xff0c;10%20, 10/25, 5%21,4* 5/22, 2%20,4*256 0/20, 1024 递归算法 #include<iostream> using namespace std; long long quick_pow(int b,int e) {if(b0)return 0;if(e0)return 1;if(e%20){int tempquick_pow(b,e/2);return temp*temp;}if(e%2!0)…

大数据学习之安装并配置maven环境

什么是Maven Maven字面意&#xff1a;专家、内行Maven是一款自动化构建工具&#xff0c;专注服务于Java平台的项目构建和依赖管理。依赖管理&#xff1a;jar之间的依赖关系&#xff0c;jar包管理问题统称为依赖管理项目构建&#xff1a;项目构建不等同于项目创建 项目构建是一…

【SQL国际标准】ISO/IEC 9075:2023 系列SQL的国际标准详情

目录 &#x1f30a;1. 前言 &#x1f30a;2. ISO/IEC 9075:2023 系列SQL的国际标准详情 &#x1f30a;1. 前言 ISO&#xff08;国际标准化组织&#xff0c;International Organization for Standardization&#xff09;是一个独立的、非政府间的国际组织&#xff0c;其宗旨是…

C++语言学习(五)—— 类与对象(一)

目录 一、类类型的定义 二、类成员的访问控制 2.1 什么是"类内"和"类外" 2.2 对于访问控制属性的说明 三、类类型的使用 3.1 进行抽象 3.2 声明类 3.3 实现类 3.4 使用类 四、构造函数的引入 五、析构函数的引入 六、重载构造函数的引入 6.1 …

# 分布式链路追踪_skywalking_学习(2)

分布式链路追踪_skywalking_学习&#xff08;2&#xff09; 一、分布式链路追踪_skywalking &#xff1a;Rpc 调用监控 1、Skywalking(6.5.0) 支持的 Rpc 框架有以下几种&#xff1a; Dubbo 2.5.4 -> 2.6.0Dubbox 2.8.4Apache Dubbo 2.7.0Motan 0.2.x -> 1.1.0gRPC 1.…

Live800:客户为王,企业竞争的新趋势与核心要素!

在企业经营管理中&#xff0c;客户始终是最重要的资源和战略。从企业经营的角度来说&#xff0c;企业管理的核心是客户管理&#xff0c;客户管理的核心是价值创造和价值分配&#xff0c;这是企业经营的基础。这里主要讨论了企业竞争的新趋势与核心要素&#xff0c;认为客户为王…

嵌入式岗位,你有能力,你同样可以拿到高薪资

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 就算你进去了&#xff0…

景源畅信:小白做抖音运营难吗?

在数字化时代&#xff0c;社交媒体已成为人们生活的一部分&#xff0c;而抖音作为其中的翘楚&#xff0c;吸引了众多希望通过平台实现自我价值和商业目标的用户。对于刚入门的小白来说&#xff0c;运营抖音账号可能会遇到不少挑战。接下来&#xff0c;我们将详细探讨这一话题&a…

交换机部分综合实验

实验要求 1.内网IP地址使用172.16.0.0/16 2.sw1和sW2之间互为备份; 3.VRRP/mstp/vlan/eth-trunk均使用; 4.所有pc均通过DHcP获取Ip地址; 5.ISP只配置IP地址; 6.所有电脑可以正常访问IsP路由器环回 实验拓扑 实验思路 1.给交换机创建vlan&#xff0c;并将接口划入vlan 2.在SW1和…

pytorch-13_2 模型结构选择策略:层数、激活函数、神经元个数

一、拟合度概念 在所有的模型优化问题中&#xff0c;最基础的也是最核心的问题&#xff0c;就是关于模型拟合程度的探讨与优化。根据此前的讨论&#xff0c;模型如果能很好的捕捉总体规律&#xff0c;就能够有较好的未知数据的预测效果。但限制模型捕捉总体规律的原因主要有两点…

Qt for android 添加自己的java包

java 包 目录 将目录放在项目的android目录中 .pro 中添加 或(可以在Qt Creator中显示) DISTFILES android/src/ScytheStudio/*.java \android/src/Serial/*.java \

火山引擎边缘云亮相 Force 原动力大会,探索 AI 应用新范式

5月15日&#xff0c;2024 春季火山引擎 FORCE 原动力大会在北京正式举办。大会聚焦 AI 主题&#xff0c;以大模型应用为核心、以 AI 落地为导向&#xff0c;展示了火山引擎在大模型、云计算领域的实践应用&#xff0c;携手汽车、手机终端、金融、消费、互联网等领域的专家和企业…

CSS3 新增背景属性 + 新增边框属性(如果想知道CSS3新增背景属性和新增边框属性的知识点,那么只看这一篇就够了!)

前言&#xff1a;CSS3在CSS2的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际面临的问题&#xff0c;本篇文章主要讲解的为CSS3新增背景属性和新增边框属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSD…

关于廉洁的短视频:四川京之华锦信息技术公司

关于廉洁的短视频&#xff1a;传递清廉之风 在信息爆炸的时代&#xff0c;短视频以其短小精悍、直观生动的特点&#xff0c;成为了人们获取信息、传播价值观念的重要渠道。四川京之华锦信息技术公司在众多主题中&#xff0c;关于廉洁的短视频尤为引人注目&#xff0c;它们以独…

B站自动回复插件_无需千粉,轻松适配引流拉新资源分享

项目介绍 B站关键词自动回复插件&#xff0c;无需千粉&#xff0c; 很适合做流量做引流做私欲的朋友&#xff0c; 前期没有千粉是无法开启官方自动回复的&#xff0c; 适当的情况下可以用这个插件顶一下&#xff0c; 三联好评领取资源的打法真的超级涨粉&#xff0c; 感谢插件…

第十二节 SpringBoot Starter 系列结束语

感谢阅读&#xff0c;到这里&#xff0c;本系列课程就结束了。 一、为什么选择 SpringBoot Starter SpringBoot 近年来已经成为 Java 应用的必备框架&#xff1b; 而 SpringBoot starter 模式已经成为各大中间件集成到 SpringBoot 应用的首选方式&#xff0c;通过引入 xxx-st…

【MATLAB源码-第215期】基于matlab的8PSK调制CMA均衡和RLS-CMA均衡对比仿真,对比星座图和ISI。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 CMA算法&#xff08;恒模算法&#xff09; CMA&#xff08;Constant Modulus Algorithm&#xff0c;恒模算法&#xff09;是一种自适应盲均衡算法&#xff0c;主要用于消除信道对信号的码间干扰&#xff08;ISI&#xff09;…

【软件测试】Selenium + Chrome UI自动化环境搭建

文章目录 自动化测试 Selenium Chrome 环境搭建1、下载Chrome 浏览器2、取消Chrome浏览器自动更新3、下载ChromeDriver4、测试环境是否搭建成功 自动化测试 Selenium Chrome 环境搭建 1、下载Chrome 浏览器 https://www.slimjet.com/chrome/google-chrome-old-version.php …