当前位置: 首页 > news >正文

vite+vue3+ts项目集成vue-router、axios封装、sass、element-plus及icon

一、根据vite+vue3+ts项目搭建的项目,此时的目录结构如下:

在这里插入图片描述

二、集成vue-router、axios封装、sass、element-plus及icon

配置别名(先安装@types/node)

npm i @types/node -D

1、vite.config.ts 配置别名,代码如下

import { resolve } from 'path'
resolve: {
    // 配置别名
    alias: {
      '@': resolve(__dirname, 'src'),
      components: resolve(__dirname, 'src/components')
    },
    // 类型: string[] 导入时想要省略的扩展名列表。
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.json', '.vue', '.mjs']
  }

安装vue-router(也可以用yarn)

npm i vue-router@4

1、在src目录新建views文件夹,新建index.vue文件,代码如下:

<template>
  <h1>欢迎vite+vue3+ts+pinia+element-plus+qiankun项目</h1>
</template>

2、在src目录新建router文件夹,新建index.ts文件,代码如下:

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import Home from '@/views/index.vue'
const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        name: 'Home页面',
        component: Home
    }
]
const router = createRouter({
    history: createWebHistory(),
    routes
})
export default router

3、在main.ts文件中引入

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
const app = createApp(App)
// 注册路由
app.use(router)
app.mount('#app')

4、在App.vue文件改造如下

<template>
  <router-view />
</template>

5、最终效果

在这里插入图片描述

安装element-plus/icon

npm install element-plus @element-plus/icons-vue --save

1、在main.ts文件中引入

我这是全量引入;若是按需引入需要unplugin-vue-components插件,请自行配置

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import locale from 'element-plus/lib/locale/lang/zh-cn'// 因element-plus默认是英文,我们指定一下默认中文
// 图标并进行全局注册
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
// 注册ElementPlus
 app.use(ElementPlus, {
    locale // 语言设置
    // size: Cookies.get('size') || 'medium' // 设置默认尺寸
  })
 // 注册所有图标
  for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
  }

2、在页面使用

在这里插入图片描述

安装css 预处理器sass

npm install -D sass sass-loader

1、页面使用

<style lang="scss" scoped>
.home {
  background-color: #eee;
  height: 100vh;
}
</style>

安装axios及api封装

npm install axios --save

1、封装axiso前先配置环境变量新建4个文件.env.dev/sit/uat/prod

VITE_APP_ENV='dev' // /sit/uat/prod
# import.meta.env.{参数名}
# api地址
VITE_APP_BASE_API = '' // sit-api/uat-api/prod-api

2、根据环境变量构建不同环境包(package.json文件的修改)

"scripts": {
    "serve": "vite --mode dev",
    "dev": "vue-tsc --noEmit && vite build --mode dev",
    "sit": "vue-tsc --noEmit && vite build --mode sit",
    "uat": "vue-tsc --noEmit && vite build --mode uat",
    "prod": "vue-tsc --noEmit && vite build --mode prod",
    "preview": "vite preview"
  },

3、存储token安装 @types/js-cookie js-cookie (也可以不用插件)

npm i @types/js-cookie js-cookie -D

4、在src目录新建utils文件夹,新建request.ts文件,代码如下:

import axios from 'axios'
import Message from '@/utils/message' // 防止重复点击重复弹出message弹框
import { ElMessageBox } from 'element-plus'
import { getToken } from '@/utils/cookies'
export default (config: any) => {
  // 创建axios实例
  const service: any = axios.create({
    baseURL: import.meta.env.VITE_APP_BASE_API as string,
    // 超时
    timeout: 50000
  })
  // 请求拦截器
  service.interceptors.request.use(
    (config: any) => {
      config.headers['Authorization'] = getToken() || ''
      config.headers['Content-Type'] =
        config.headers['Content-Type'] || 'application/json'
      // 8080
      if (config.type == 'file') {
        config.headers['content-type'] = 'application/multipart/form-data'
      } else if (config.type == 'form') {
        config.headers['Content-type'] = 'application/x-www-form-urlencoded'
      }
      if (config.method && config.method.toLowerCase() === 'get') {
        config.data = true
      }
      return config
    },
    (error: any) => {
      return Promise.reject(error)
    }
  )
  // 响应拦截器
  service.interceptors.response.use(
    (response: any) => {
      const code = response.data.code
      if (code === 401) {
        ElMessageBox.confirm(
          '登录状态已过期,您可以继续留在该页面,或者重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          // 调用退出登录接口
        })
      } else if (code !== 200) {
        Message({
          message: response.data.msg,
          type: 'error',
          duration: 5 * 1000
        })
        return Promise.reject('error')
      } else {
        return response.data
      }
    },
    (error: any) => {
      Message({
        message: error.message,
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.reject(error)
    }
  )
  return service(config)
}

5、在src目录新建api文件夹,新建index.ts文件,代码如下:

import request from '@/utils/request'
import * as masterData from './mes/masterData' // 业务接口
// 数据字典-查询 公共api
export const getDicts = (dictType: any) => { return request({ url: `/system/dict/data/type/${dictType}`, method: 'GET' }) }
export default {
  getDicts,
  ...masterData
}

6、在main.ts文件定义全局api方法,代码如下:

// 所有业务api接口
import api from './api'

// 注册全局api方法
app.config.globalProperties.$api = api

7、页面使用

<script setup lang="ts">
import { getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance() as any
// 获取列表数据
const getList = async () => {
  const res = await proxy.$api.materialList()
  console.log('proxy', res)
  if (res.success) {
    console.log('获取接口数据', res.data.records)
  }
}
getList()
</script>

8、效果

在这里插入图片描述

目前的目录结构

在这里插入图片描述

Ts报错解决

找不到模块“@/xxxxxx”或其相应的类型声明。

在这里插入图片描述

解决:在tsconfig.json文件compilerOptions下添加以下代码

 // 解析非相对模块名的基准目录
    "baseUrl": "./",
    // 模块名到基于 baseUrl的路径映射的列表。
    "paths": {
      "@": [
        "src"
      ],
      "@/*": [
        "src/*"
      ]
    },

组件地址

gitHub组件地址

gitee码云组件地址

相关文章

基于ElementUi再次封装基础组件文档


vue3+ts基于Element-plus再次封装基础组件文档

相关文章:

  • 做网站用什么格式做好/营销渠道策划方案
  • 高明专业网站建设哪家好/网络营销软件商城
  • wordpress 评论 重复/青岛网络推广公司
  • 北京市工程建设信息网官网/seo优化方向
  • 虚拟机网站建设与管理/全国疫情实时资讯
  • 潍坊网站建设top/深圳百度seo公司
  • Java多线程【状态与安全问题】
  • Python编程 变量与常量
  • STM32中使用PS2手柄
  • Hystrix熔断器
  • Linux 基础篇-VIM编辑器
  • 改进YOLOv5系列:首发结合 RepLKNet 构建 最新 RepLKDeXt 结构|CVPR2022 超大卷积核, 越大越暴力,大到31x31, 涨点高效
  • 【C语言】操作符
  • python题库刷题训练软件
  • 【设计模式】【第九章】【设计模式小结】
  • 基于图搜索的规划算法之 A* 家族(十一):总结
  • RocketMQ 消费者Rebalance算法 解析——图解、源码级解析
  • 【0126】Latch中self-pipe trick的应用机制