vue3+ts实战

目录

一、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>

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
对于Vue 3和TypeScript的项目实战,有以下几个步骤可以参考: 1. 创建一个新的Vue 3项目:可以使用Vue CLI来快速创建一个基本的Vue 3项目。通过命令行运行`vue create`命令,选择使用TypeScript作为项目的语言支持。 2. 配置Vue 3的TypeScript支持:在创建项目时,选择了TypeScript后,Vue CLI会自动生成一些基本的TypeScript配置。你可以在`tsconfig.json`文件中进行进一步的配置,例如指定编译目标、模块加载器等。 3. 使用Vue 3的Composition API:Composition API是Vue 3中引入的新特性,它允许开发者更灵活地组织和重用组件逻辑。你可以在组件中使用`setup()`函数来定义组件的逻辑部分,并通过`ref()`、`reactive()`等函数来创建响应式数据。 4. 定义类型:在使用TypeScript开发Vue 3项目时,可以为组件、数据等定义类型。通过给变量、函数参数、返回值等添加类型注解,可以提供更好的代码提示和类型检查。 5. 使用Vue Router进行路由管理:如果你的项目需要使用路由管理,可以使用Vue Router。在Vue 3中,可以使用`createRouter()`函数来创建路由实例,并通过`use()`方法将其挂载到应用中。 6. 使用Vuex进行状态管理:如果你需要进行全局状态管理,可以使用Vuex。在Vue 3中,可以使用`createStore()`函数来创建Vuex实例,并通过`provide()`和`inject()`配合使用,将其注入到应用中的各个组件中。 7. 编写单元测试:在实战项目中,编写单元测试是一个重要的环节。你可以使用工具如Jest或Mocha等来编写和运行单元测试,以确保你的代码的质量和稳定性。 以上是一个基本的Vue 3和TypeScript项目实战的步骤,希望对你有所帮助!如果你有更具体的问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值