首页 > 其他分享 >Vue 3 + TypeScript + Vite + Element-Plus + Router + Axios + Pinia项目搭建(内含完整架构)

Vue 3 + TypeScript + Vite + Element-Plus + Router + Axios + Pinia项目搭建(内含完整架构)

时间:2024-01-14 16:01:54浏览次数:37  
标签:axios Axios App error Element TypeScript vue router import

Vue 3 + TypeScript + Vite + Element-Plus + Router + Axios + Pinia项目搭建(内含完整架构)

安装Vue3+ts+vite

npm init vite@latest

选择y,新建项目名称,选择vue,选择vue-ts 下载完成后执行以下命令行

cd 新建的项目名称
npm i
npm run dev

安装Element-Plus

npm install element-plus --save

安装完后给main.ts配置以下代码

import { createApp } from 'vue'
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
import App from './App.vue'
createApp(App).use(ElementPlus).mount('#app')

在 tsconfig.json 中通过 compilerOptions.type 指定全局组件类型。

// tsconfig.json
{
  "compilerOptions": {
    "types": ["element-plus/global"]
  }
}

自动导入两款插件使用方法

#选择一个你喜欢的包管理器
 
#NPM
# npm install -D unplugin-vue-components unplugin-auto-import
 
#Yarn
$ yarn add -D unplugin-vue-components unplugin-auto-import

安装完成后打开vite.config.ts文件,复制以下代码到vite.config.ts里

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),]
})

在页面中渲染

<el-button>Default</el-button>
    <el-button type="primary">Primary</el-button>
    <el-button type="success">Success</el-button>
    <el-button type="info">Info</el-button>
    <el-button type="warning">Warning</el-button>
    <el-button type="danger">Danger</el-button>
    <el-button>中文</el-button>

效果如下:

Vue 3 + TypeScript + Vite + Element-Plus + Router + Axios + Pinia项目搭建(内含完整架构)_App


引入router,axios,Pinia

一、安装router

npm install vue-router

在src下新建router文件夹/index.ts 配置内容如下:

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

main.ts添加router

import { createApp } from 'vue'
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
import router from './router/index'
import App from './App.vue'
createApp(App).use(ElementPlus).use(router).mount('#app')

更改页面结构

在src中新增view文件夹,里面新建Home.vue

<template>
  <div>
    <el-button>Default</el-button>
    <el-button type="primary">Primary</el-button>
    <el-button type="success">Success</el-button>
    <el-button type="info">Info</el-button>
    <el-button type="warning">Warning</el-button>
    <el-button type="danger">Danger</el-button>
    <el-button>中文</el-button>
  </div>
</template>

<script lang='ts'>
import { onBeforeMount, onMounted } from "vue";
export default {
  name: "",
  setup() {},
};
</script>
<style scoped lang='less'>
</style>

App.vue页面

<script setup lang="ts">
</script>
<template>
  <div>
    <a href="https://vitejs.dev" target="_blank">
      <img src="/vite.svg" class="logo" alt="Vite logo" />
    </a>
    <a href="https://vuejs.org/" target="_blank">
      <img src="./assets/mdImg/vue.svg" class="logo vue" alt="Vue logo" />
    </a>
    <a href="https://element-plus.gitee.io/zh-CN/" target="_blank">
      <img src="./assets/mdImg/element-plus-logo.svg" class="logo element" alt="Vue logo" />
    </a>
  </div>
  <router-view></router-view>
</template>

<style scoped>
.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
  filter: drop-shadow(0 0 2em #42b883aa);
}
.logo.element:hover {
  filter: drop-shadow(0 0 2em #459FFCaa);
}
</style>

效果:

Vue 3 + TypeScript + Vite + Element-Plus + Router + Axios + Pinia项目搭建(内含完整架构)_App_02

二、安装axios

npm install axios
pnpm install axios

可参考以下封装方法:

Vue 3 + TypeScript + Vite + Element-Plus + Router + Axios + Pinia项目搭建(内含完整架构)_ios_03

request.ts

import axios from 'axios'

// 创建axios
const service = axios.create({
  // baseURL: '/api',
  baseURL: 'http://xxx.xxx.xx.xxx',
  timeout:80000
});

// 添加请求拦截器
service.interceptors.request.use(
  (config:any) => {
    let token:string =''//此处换成自己获取回来的token,通常存在在cookie或者store里面
    if (token) {
      // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
      config.headers['X-Token'] = token
   
      config.headers.Authorization =  + token       
     }
    return config
  },
  error => {
    // Do something with request error
    console.log("出错啦", error) // for debug
    Promise.reject(error)
  }
)

service.interceptors.response.use(
  (response:any) => {
   return response.data
 },    /*  */
 error => {
   console.log('err' + error) // for debug
   if(error.response.status == 403){
     // ElMessage.error('错了')
     console.log('错了');
     
   }else{
     // ElMessage.error('服务器请求错误,请稍后再试')
     console.log('服务器请求错误,请稍后再试');
   }
   return Promise.reject(error)
 }
)
export default service;

main.ts

import { createApp, useAttrs } from 'vue'
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
import router from './router/index'
import App from './App.vue'
let app = createApp(App)
import axios from './utils/request'
app.config.globalProperties.$http = axios;
const pinia = createPinia()
app.use(ElementPlus).use(router).mount('#app')

service.ts

import service from "../request"

// 获取seller
export function getSeller(params:any){
  return service.request({
    method:'POST',
    url:'接口一',
    data:params
  })
}
export function Login(params:any){
  return service.request({
    method:'POST',
    url:'接口二',
    data:params
  })
}

页面调用

// 接口引入地址
import { getTest} from "../utils/api/service";

/* 调用接口 */
       getTest('放入params参数').then(response => {
            console.log("结果", response);
          })
          .catch(error => {
            console.log('获取失败!')
          });

三、安装Pinia

npm add pinia@next

挂载Pinia

main.ts 如果按照上面步骤来的话可以直接替换main.ts

import { createApp, useAttrs } from 'vue'
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
import router from './router/index'
import App from './App.vue'
import {createPinia} from 'pinia'
let app = createApp(App)
import axios from './utils/request'
app.config.globalProperties.$http = axios;
const pinia = createPinia()
app.use(ElementPlus).use(pinia).use(router).mount('#app')

新建store文件夹/userCount.ts

import { defineStore } from 'pinia'
// defineStore( ) 方法的第一个参数:相当于为容器起一个名字。注意:这里的名字必须唯一,不能重复。
export const user = defineStore('user', {
    state: () => {
        return {
            num:1
        }
    },
    getters: {

    },
    actions: {

    }
})

需要使用的页面里

<template>
    <div>
        {{num}}
    </div>
</template>
<script lang='ts' setup>
    import { useMainStore } from "../../store/module/useCountStore";
    const mainStore = useMainStore();
    console.log(mainStore.count);
</script>

地址如下: 完整架构

标签:axios,Axios,App,error,Element,TypeScript,vue,router,import
From: https://blog.51cto.com/u_15947040/9240876

相关文章

  • element表格table点击行,改变当前行的背景颜色
     参考:https://blog.csdn.net/qq_33347991/article/details/129870567实际应用如下:   ......
  • ElementUI中使用tooltip
    button添加属性disabled,造成el-tooltip失效当鼠标移入的时候,通过tootip显示提示内容,但是发现移入进去发现失效,并没有显示提示信息,示例代码如下:<el-tooltipcontent="Topcenter"placement="top"><el-buttondisabled>Dark</el-button></el-tooltip>网上查阅后,按钮的disabled属......
  • typescript实现一个最简的装饰器依赖注入
    装饰器依赖注入,元数据键是关键因此必须开启ts装饰器和ts元数据tsconfig.json"experimentalDecorators":true,//开启装饰器"emitDecoratorMetadata":true,//开启元数据并且安装reflect-metadata支持元数据编程全局入口倒入一次即可import"reflect-metadata";类型元数据:......
  • element el-select value-key 的bug
      bug复现:<el-selectv-model="form.test"style="width:240px;"clearablemultiplevalue-key="value"><el-optionv-for="itemin[{name:'A公司',value:0},{name:'B公司',value......
  • axios发送get、post请求
    1.环境安装//nodejs环境//npminstallaxios2.axios发送get请求constaxios=require('axios')consturl="xxx.xxx.xxx";constheaders={}axios.get(url,{headers}).then(function(response){console.log(response.data)r......
  • [TypeScript]介绍及安装
    TypeScript是JavaScript的超集,扩展了JavaScript的语法。因此现有的JavaScript代码可与TypeScript一起工作无需任何修改,TypeScript通过类型注解提供编译时的静态类型检查。TypeScript可处理已有的JavaScript代码,并只对其中的TypeScript代码进行编译。 TypeScrip......
  • Elementui el-form表单中ref的用法
    在ElementUI的el-form组件中,ref是用来获取对该表单组件的引用的属性。通过给el-form添加ref属性,你可以在Vue组件中通过引用来访问和操作这个表单组件,而不需要通过DOM查询或其他方式。使用ref属性可以在Vue组件的JavaScript部分直接访问el-form的实例,从而可以......
  • #星计划# 在OpenHarmony上使用网络组件axios与Spring Boot进行前后端交互
    在OpenHarmony上使用网络组件axios与SpringBoot进行前后端交互#jitoa#此博客由金陵科技学院-开放原子开源社李俊杰编写仓库地址:axiosTest·AtomGit_开放原子开源基金会代码托管平台结果演示:在OpenHarmony上使用网络组件axios与SpringBoot进行前后端交互_哔哩哔哩_bilib......
  • 前端歌谣-第伍拾伍课-vue2-element组件封装el-button-groups
    前言大家好我是歌谣今天继续给大家带来elementui组件el-button的封装使用方法<btn-groups:btns="btns":max="max"class="page-btns"></btn-groups>参数部分name控制属性名显示按钮的名称{{item.name}}btns:[{//按钮名称name:"歌谣&qu......
  • 前端歌谣-第伍拾陆课-vue2-element组件封装el-button-groups(续)
    前言我是歌谣今天继续给大家带来el-button-groups(项目的讲解背景颜色属性color:style="item.color?{background:item.color,borderColor:item.color}:{}"btns:[{//按钮名称name:"歌谣",//按钮类型......