从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目

这篇具有很好参考价值的文章主要介绍了从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:vue3+ts+vite大家已经都开始用了,最近也在学习,基本上是零基础开始ts的学习,很多语法知识是边写边查,没有系统的学习ts。此处展示从零开始,搭建的一个框架,方便拿来即用!

1. 初始化一个vite项目

npm create vite@latest

其中框架选择vue,语言选择typeScript

2. 启动项目

npm install
npm run dev

项目启动成功以后如下所示:
从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目

3. 修改目录

为了方便日常工作中的框架使用,在此处对刚初始化好的框架进行改造,在原有框架的基础上,添加store,router,layout,utils,views等文件夹,其中的作用将在后面进行说明。如图所示:
从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目

4. 配置router

首先安装vue-router的依赖

npm install vue-router

在router文件夹下创建index.ts文件,配置如下:

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';
const routes: Array<RouteRecordRaw> = [
    // 项目打开后进入的默认地址
    {
        path: '/',
        redirect: '/login'
    },
    {
        path: '/login',
        component: () => import('../views/login/login.vue')
    },
    {
        path: '/home',
        component: () => import('../views/home/home.vue')
    }
]
const router = createRouter({
    history: createWebHashHistory(), // 本项目采用了哈希模式
    routes
})
export default router

路由文件配置以后,需要在main.ts文件中进行引用,如下所示:

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
const app = createApp(App)
// 路由设置
import router from './router/index'
app.use(router)

app.mount('#app')

修改app.vue文件,根据实际情况进行修改,本项目中不需要初始化的helloWord组件,所以修改如下所示:

<script setup lang="ts">
</script>
<template>
  <div>
    <router-view></router-view>
  </div>
</template>
<style scoped>
</style>

在views文件夹中创建login.vue文件,并重新启动项目,如图所示,跳转到登陆页面后表示路由配置成功:
从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目
vue文件中使用路由的方法如下:

import { useRouter, useRoute} from 'vue-router'
const router = useRouter()
const route = useRoute()
// 路由跳转
router.push('/xxx')

**补充:**路由hash模式与history模式的区别

  1. hash模式
    示例:http://localhost:5173/#/login
    原理:利用window监听的onhashchange事件,不会包含在http请求中,对后端完全没有影响。
  2. history模式
    示例:http://localhost:5173/login
    原理:地址发生改变后,会按照改变后的地址向服务端发送请求,需要后端配合处理,做地址映射。

5.配置vuex(pinia)

pinia 是一个拥有组合式API的状态管理库。
pinia官网: https://pinia.vuejs.org/zh/introduction.html
首先安装pinia的依赖

npm install pinia

在store文件夹中创建index.ts,具体内容如下:

import type {App} from 'vue'
import { createPinia } from "pinia";
const store = createPinia()
export function setupStore(app:App<Element>) {
    app.use(store)
}
export {store}

然后在store文件夹中创建modules文件夹,并创建user.ts 文件,用来保存用户的基本信息。

import { defineStore } from 'pinia'
import { store } from '../index'
interface userInfoType {
    username: string,
    age: number,
    gender: string
}
export const useUserStore = defineStore('user', () => {
// 此处使用的是组合式API的方式,更多情况可查看官网
    let userInfo: userInfoType = {
        username: '小明',
        age: 18,
        gender: '男'
    }
    return {
        userInfo
    }
},
)
// 最后到处定义的useUserStore
export function useUserStoreHook() {
    return useUserStore(store)
}

store的基本信息配置好以后,需要在main.ts问价中挂载到app组件上,如下:

import { setupStore } from './store'
// 挂载store
setupStore(app);

存储在vuex中的数据使用方式如下:

// login.vue 文件
<script setup lang="ts">
import { useUserStore } from '../../store/modules/user'
const userStore = useUserStore()
let userInfo = userStore.userInfo
</script>
<template>
  <div class="login-wrap">
    <p>登录页面</p>
    {{ userInfo.username }}的年龄是{{ userInfo.age }}
  </div>
</template>

<style scoped>
.login-wrap {
  width: 100%;
  height: 100vh;
  background-size: 100% 100%;
  position: relative;
  box-sizing: border-box;

}
</style>

效果如下:
从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目

6. element-plus 的基本使用

首先安装依赖

npm install element-plus

官网: https://element-plus.org/zh-CN/guide/design.html
本项目中使用的是方法是在main.ts文件中完整导入!main.ts文件如下:

// element-plus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// 导入所有的icon图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
app.use(ElementPlus)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

在vue文件中基本使用方法:

import { ElMessage } from 'element-plus'
ElMessage('你好')

7. axios封装

对于前后分离的项目来说,绑定后端提供的接口进行数据增删改查是业务中较为重要的部分,此处对axios的使用进行封装,方便向服务断发送请求。
依旧是安装axios的依赖:

npm install axios

axios的接口封装文件如下:

import axios from 'axios';
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'
import {getCookie,setCookie} from '../../utils/cookie'
const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_APP_API_BASEURL,
    timeout: 15000,
    headers: {
        'Content-Type': 'application/json'
    },
});

interface requestConfig extends AxiosRequestConfig {
    headers?: any
}
// axios实例拦截请求
service.interceptors.request.use(
    (config: requestConfig) => {
        const token = getCookie('token');
        if (token) {
            config.headers.token = token
        }
        return config;
    },
    (error: AxiosError) => {
        return Promise.reject(error);
    },
);
// axios实例拦截响应
service.interceptors.response.use(
    (response: AxiosResponse) => {
        if (response.status === 200) {
            return response;
        }
        return response;
    },
    // 请求失败
    (error: any) => {
        const { response } = error;
        if (response) {
            // 请求已发出,但是不在2xx的范围
            return Promise.reject(response.data);
        }
    },
);

/***
 * post 方法封装
 */
export function postMethod<T>(url:string,params?:any):Promise<T> {
    return new Promise((resolve, reject) => {
        service.post(url,params).then((res:any) => {
            if(res.data.code === 200  && res.headers['token'])  {
                setCookie('token',res.headers['token'],21600)
            }
            resolve(res.data)
        }).catch((err) => {
            reject(err)
        })
    })
}
/***
 * get 方法封装
 */
export function getMethod<T>(url:string,params?:any):Promise<T> {
    return new Promise((resolve, reject) => {
        service.get(url,params).then((res:any) => {
            if(res.data.code === 200  && res.headers['token'])  {
                setCookie('token',res.headers['token'],21600)
            }
            resolve(res.data)
        }).catch((err) => {
            reject(err)
        })
    })
}
/**
 * 文件上传 方法封装
 * 上传文件传参方式注意为form-data格式
 */
export function uploadFile<T>(url:string,uploadForm:any):Promise<T>{
    const fd = new FormData()
    fd.append('fileName', uploadForm.projectId)
    fd.append('file', uploadForm.file)
    return new Promise((resolve, reject) => {
        service.post(url,fd,{
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        }).then((res:any) => {
            if(res.data.code === 200  && res.headers['token'])  {
                setCookie('token',res.headers['token'],21600)
            }
            resolve(res.data)
        }).catch((err) => {
            reject(err)
        })
    })
}

8. cookie封装

用户登录的时候,提交表单信息,需要对接口返回的token进行存储,此处使用了cookie进行存储,可以利用js-cookie库进行cookie存储,也可自己封装方法,此处是封装cookie的方法进行cookie的存储,获取,以及清除,如下所示:

// cookie.ts
/**
 * cookie 浏览器缓存
 */
const domain = ''
//  时间单位为秒
export function setCookie(c_name: string, value: any, expire?: any) {
  var date: any = new Date()
  date.setSeconds(date.getSeconds() + expire)
  document.cookie = c_name + '=' + escape(value) + '; expires=' + date.toGMTString() + '; domain=' + domain + ';path=/'
}

export function getCookie(c_name: string) {
  let c_start: number
  let c_end: number
  if (document.cookie.length > 0) {
    c_start = document.cookie.indexOf(c_name + '=')
    if (c_start != -1) {
      c_start = c_start + c_name.length + 1
      c_end = document.cookie.indexOf(';', c_start)
      if (c_end == -1) c_end = document.cookie.length
      return unescape(document.cookie.substring(c_start, c_end))
    }
  }
  return ''
}
export function delCookie(c_name:string) {
  setCookie(c_name, '', -1)
}

9. localStorage 使用

在获取localStorage存储信息时,发现存在一个问题,在vue文件中的setup的语法糖中,直接使用JSON的序列化方法会标红,可以正常使用,但是存在类型问题。将其进行封装后,发现这个问题不在出现,在vue文件中使用时,直接引入即可。如下所示:

// localStorage.ts
/**
 * window.localStorage 浏览器永久缓存
 */
export const localStorage = {
  // 设置永久缓存
  set(key: string, val: any) {
    window.localStorage.setItem(key, JSON.stringify(val));
  },
  // 获取永久缓存
  get(key: string) {
    const json: any = window.localStorage.getItem(key);
    return JSON.parse(json);
  },
  // 移除永久缓存
  remove(key: string) {
    window.localStorage.removeItem(key);
  },
  // 移除全部永久缓存
  clear() {
    window.localStorage.clear();
  }
};

10. 框架地址

gitee地址: https://gitee.com/free_project/vue3_ts_frame.git
目前只有一个空架子,针对表单的使用等还未进行展示;因为对ts不熟,好多类型都设置了any。若有问题还请指出!文章来源地址https://www.toymoban.com/news/detail-464394.html

到了这里,关于从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始创建一个vue3+vite项目并集成element-plus、eslint以及prettier

    项目git地址, 欢迎修改提交,不足地方还请补充批评指正! 项目git地址 ESLint 是一个用于识别和报告在 ECMAScript/JavaScript 代码中发现的模式的工具,其目标是使代码更加一致并避免错误。 ESLint 是完全插件化的。每条规则都是一个插件,你可以在运行时添加更多。你还可以添

    2024年04月09日
    浏览(77)
  • 【Vue H5项目实战】从0到1的自助点餐系统—— 搭建脚手架(Vue3.2 + Vite + TS + Vant + Pinia + Node.js)

    H5 项目基于 Web 技术,可以在智能手机、平板电脑等移动设备上的浏览器中运行,无需下载和安装任何应用程序,且H5 项目的代码和资源可以集中在服务器端进行管理,只需更新服务器上的代码,即可让所有顾客访问到最新的系统版本。 本系列将以肯德基自助点餐页面为模板

    2024年02月13日
    浏览(64)
  • vue3+ts+pinia+vite一次性全搞懂

    前提是所处vue环境为vue3,如果失败就查看一下环境是否为vue2,然后删除vue2,安装vue3 这是我报过的错

    2024年02月01日
    浏览(40)
  • 详解Vite创建Vue3项目+vue-router+ts+vite+element-plus

    前言 在之前的文章中写过“Vue3+TS+ElementPlus的安装和使用教程【详细讲解】”,但那篇文章写的是创建vue3的项目没有使用到Vite构建工具进行创建还是使用的常规webpacket构建工具进行创建的。提到Vite和webpacket的时候我们可以简单说一下。 Vite 和 Webpack 都是现代化的前端构建工

    2024年01月18日
    浏览(62)
  • Vue3+TS+Vite创建项目,并导入Element-plus和Sass

    1.桌面新建一个文件夹Vue3-app 打开编辑器导入文件夹,编辑器打开终端输入或者命令行工具cd到项目目录下输入 npm init vue@latest 回车运行 这里我选择了TS+Vite来开发,并选择安装路由 2.cd到 vue-project目录下 输入 npm install 回车运行 3.安装完成后 输入 npm run dev 回车运行 浏览器打开

    2024年02月16日
    浏览(59)
  • vite + vue3 + vue-router4 + ts + element plus + pinia + axios构建项目

    最后是完整的vite.config.ts、main.ts配置 1、先用vite创建一个项目 2、安装element plus vite.config.ts配置组件按需导入,图标自动导入   main.ts配置 页面文件使用 3、安装axios main.ts 4、安装pinia /stores/index.ts /stores/counter.ts main.ts 页面使用 5、安装router4 /router/index main.ts   6、vite.config.ts常

    2023年04月25日
    浏览(54)
  • Vue3 Vite4 ElementPlus TS模板(含Vue-Router4+Pinia4)

    手动安装配置Vue3 ElementPlus模板比较繁琐,网上寻找一些模板不太符合自己预期,因此花点精力搭建一个符合自己需求的架子 采用最新的组件,版本如下: vite 4.3.9 vite-plugin-mock 2.9.8 vue 3.3.4 pinia 2.1.3 vue-router 4.2.2 element-plus 2.3.6 满足自己以下功能: Vite工具热启动速度快,修改后

    2024年02月08日
    浏览(53)
  • 前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第一章 技术栈简介 (开篇)

    旨在帮助初学者掌握使用现代前端技术栈构建应用的基础知识和技能。在这个系列中,我们将深入探讨如何结合Vue.js、Vite、TypeScript、Pinia和Sass这些强大的工具和框架来开发现代化的前端应用。 通过这个系列,我们将从零开始构建一个完整的前端项目,覆盖项目初始化、组件

    2024年02月05日
    浏览(53)
  • Vue3.2 + TypeScript + Pinia + Vite4 + Element-Plus + 微前端(qiankun) 后台管理系统模板(已开源---显示项目页面截图)

    Wocwin-Admin,是基于 Vue3.2、TypeScript、Vite、Pinia、Element-Plus、Qiankun(微前端) 开源的一套后台管理模板;同时集成了微前端 qiankun也可以当做一个子应用。项目中组件页面使用了Element-plus 二次封装 t-ui-plus 组件,目前已新增fastmock接口。 Link:https://wocwin.github.io/wocwin-admin/ 账号:

    2024年02月08日
    浏览(82)
  • Vite4+Typescript+Vue3+Pinia 从零搭建(3) - vite配置

    项目代码同步至码云 weiz-vue3-template 关于vite的详细配置可查看 vite官方文档,本文简单介绍vite的常用配置。 项目初建后, vite.config.ts 的默认内容如下: 比如,修改 App.vue : 根目录下新建 .env 、 .env.development 、 .env.production 三个文件。 .env 文件内新增内容: .env.development 文件内

    2024年02月05日
    浏览(105)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包