使用 Vite + Vue3 + Element-Plus + Pinia + Ts 搭建 Vue3 项目

本文详细介绍了如何使用Vite搭建Vue3项目,包括配置VueRouter、Element-Plus、Pinia和Sass,以及解析@符号的路径和TypeScript的类型检查。通过这些步骤,开发者可以创建一个功能完备的Vue3应用。

使用Vite搭建

Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。

首先 npm 输入:

npm create vite@latest

在这里插入图片描述
Project name:项目名称
Select a framework:选择一个框架
Select a variant:选择 ts 或者 js

输入项目名称后选择 vue 选择 tscd 进入目录 npm install 安装依赖后,npm run dev 运行。
在这里插入图片描述
项目目录

在这里插入图片描述
与webpack搭建的是有些区别的,首先多了ts的配置文件,以及vite的配置文件vite.config.ts,还有vite呢拥有更好的打包编译性能。

在这里插入图片描述

这块可以看下使用webpack和vite搭建的区别

在这里插入图片描述
在这里插入图片描述

使用Vite创建的项目是没有配置Vuex(或者用Pinia)、VueRouter、Sass的,需要我们手动配置,我们可以看下package.json文件只有vite 、vue、ts等依赖。

在这里插入图片描述

配置Router

1、 首先,安装 Vue Router:

npm install vue-router@next

2、 在项目的根目录下创建一个新的目录,比如 src/router。

3、 在 src/router 目录下创建一个新的文件,比如 index.ts,并在其中配置路由:

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

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

4、 在 src/main.ts 中导入并使用路由:

import { createApp } from 'vue'
import router from './router';
import './style.css'
import App from './App.vue'

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

这样就成功配置了 Vue Router,并创建了一个简单的路由。

配置 Element-Plus

Element-Plus

首先安装依赖:

npm install element-plus --save

在main.ts中引入element-plus

import { createApp } from 'vue'
import router from './router';
import ElementPlus from 'element-plus' // element-plus
import 'element-plus/dist/index.css' // element-plus
import './style.css'
import App from './App.vue'

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

配置sass

首先安装依赖:

npm install sass sass-loader

使用

<style scoped lang="scss"></style>

配置Pinia

Pinia 与 Vuex 的比较
Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法。最终,我们意识到 Pinia 已经实现了我们在 Vuex 5 中想要的大部分内容,并决定实现它 取而代之的是新的建议。
与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。

1、首先安装依赖

npm install pinia

2、在项目的根目录下创建一个新的目录,比如 src/store。

3、在 src/store 目录下创建一个新的文件,比如 index.ts,用于配置和创建 Pinia

import { defineStore } from 'pinia';

// 创建 Pinia Store
export const dataStore = defineStore('dataStore', {
  state: () => {
    return {
        msg: 'hello pinia'
    }
  },
});

4、在 src/main.ts 中导入并使用 Pinia:

import { createApp } from 'vue'
import router from './router';
import { createPinia } from 'pinia' // pinia
const pinia = createPinia() // pinia
import ElementPlus from 'element-plus' // element-plus
import 'element-plus/dist/index.css' // element-plus
import './style.css'
import App from './App.vue'

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

5、在Vue 组件中,可以使用 dataStore 函数来访问和操作 Pinia Store。

<script setup lang="ts">
import {dataStore} from './store'
let store = dataStore()
console.log(store.msg)
</script>

在这里插入图片描述
6、访问state

在组件中首先引入:

import {dataStore} from './store'
let store = dataStore()

store.变量名的形式访问

7、访问getters
getter 完全等同于 Store 状态的 计算值。 它们可以用 defineStore() 中的 getters 属性定义。 他们接收“状态”作为第一个参数以鼓励箭头函数的使用:

import { defineStore } from 'pinia';

// 创建 Pinia Store
export const dataStore = defineStore('dataStore', {
  state: () => {
    return {
        msg: 'hello pinia',
        num: 0
    }
  },
  getters:{
    addNum():number{
      return this.num+10
    }
  }
});
<script setup lang="ts">
import {dataStore} from './store'
let store = dataStore()
console.log(store.msg) // 访问store中state变量
console.log(store.addNum) // 访问store中getters计算属性
</script>

在这里插入图片描述
8、getters如何传值?
getters 只是幕后的 computed 属性,因此无法向它们传递任何参数。 但是,可以从 getter 返回一个函数以接受任何参数:

import { defineStore } from 'pinia';

// 创建 Pinia Store
export const dataStore = defineStore('dataStore', {
  state: () => {
    return {
        msg: 'hello pinia',
        num: 0
    }
  },
  getters:{
    addNum():number{
      return this.num+10
    },
    addNum2(){
      return (number:number) => this.num + number
    }
  }
});
<script setup lang="ts">
import {dataStore} from './store'
let store = dataStore()
console.log(store.msg) // 访问store中state变量
console.log(store.addNum) // 访问store中getters计算属性
console.log(store.addNum2(100)) // 访问store中getters计算属性并传值
</script>

在这里插入图片描述

9、Actions
相当于组件中的 methods。 它们可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑:

import { defineStore } from 'pinia';

// 创建 Pinia Store
export const dataStore = defineStore('dataStore', {
  state: () => {
    return {
        msg: 'hello pinia',
        num: 0
    }
  },
  getters:{
    addNum():number{
      return this.num+10
    },
    addNum2(){
      return (number:number) => this.num + number
    }
  },
  actions:{
    actionFun(){
      console.log("我是store中actions的方法")
    }
  }
});
<script setup lang="ts">
import {dataStore} from './store'
let store = dataStore()
console.log(store.msg) // 访问store中state变量
console.log(store.addNum) // 访问store中getters计算属性
console.log(store.addNum2(100)) // 访问store中getters计算属性并传值
store.actionFun() // 调用store中actions的方法
</script>

在这里插入图片描述

配置解析 @ 符号,并找到对应的路径

在tsconfig.json中配置如下:

在这里插入图片描述

{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "skipLibCheck": true,

    /* 配置解析 @ 符号,并找到对应的路径 */
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    },

    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "preserve",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

在vite.config.ts配置如下:

在这里插入图片描述

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  // 配置解析 @ 符号,并找到对应的路径
  resolve: {
    alias: {
      '@': '/src',
    },
  }
})

TypeScript忽略类型检查

单行忽略(添加到忽略得哪行代码的前一行)

// @ts-ignore

跳过对某些文件的检查 (添加到该文件的首行)

// @ts-nocheck

对某些文件的检查(添加到要检查文件的前一行)

// @ts-check
以下是一个使用 Vue 3VitePiniaElement Plus 和 Apifox 开发的项目中包含 Pinia 使用的代码示例。 ### 项目初始化 首先确保你已经创建了一个基于 Vue 3Vite项目,并且安装了 PiniaElement Plus: ```bash # 创建 Vue 3 + Vite 项目 npm init vite@latest my-vue3-project -- --template vue cd my-vue3-project # 安装 Pinia npm install pinia # 安装 Element Plus npm install element-plus ``` ### 配置 Vite 在 `vite.config.js` 中配置别名,方便后续引用: ```javascript import { defineConfig } from &#39;vite&#39; import vue from &#39;@vitejs/plugin-vue&#39; export default defineConfig({ plugins: [vue()], resolve: { alias: [ { find: "@", replacement: "/src" } ] } }) ``` ### 配置 Pinia 在 `src` 目录下创建 `stores` 文件夹,并在其中创建一个 `counter.js` 文件: ```javascript // src/stores/counter.js import { defineStore } from &#39;pinia&#39; export const useCounterStore = defineStore(&#39;counter&#39;, { state: () => ({ count: 0 }), actions: { increment() { this.count++ }, decrement() { this.count-- } } }) ``` ### 配置 Element Plus 在 `main.js` 中引入并使用 Element Plus: ```javascript // src/main.js import { createApp } from &#39;vue&#39; import { createPinia } from &#39;pinia&#39; import ElementPlus from &#39;element-plus&#39; import &#39;element-plus/dist/index.css&#39; import App from &#39;./App.vue&#39; const app = createApp(App) const pinia = createPinia() app.use(pinia) app.use(ElementPlus) app.mount(&#39;#app&#39;) ``` ### 使用 PiniaElement Plus 的组件 在 `src/App.vue` 中使用 PiniaElement Plus 的组件: ```vue <template> <div> <el-button @click="increment">增加</el-button> <el-button @click="decrement">减少</el-button> <p>当前计数: {{ counterStore.count }}</p> </div> </template> <script setup> import { useCounterStore } from &#39;./stores/counter&#39; const counterStore = useCounterStore() const increment = () => { counterStore.increment() } const decrement = () => { counterStore.decrement() } </script> ``` ### Apifox 的使用 Apifox 主要用于接口管理和调试,在项目中通常会使用 Axios 来发送请求。首先安装 Axios: ```bash npm install axios ``` 然后在 `src` 目录下创建 `api` 文件夹,并在其中创建一个 `user.js` 文件: ```javascript // src/api/user.js import axios from &#39;axios&#39; const api = axios.create({ baseURL: &#39;https://your-api-url.com&#39; }) export const getUser = () => { return api.get(&#39;/users&#39;) } ``` 在组件中使用这个 API: ```vue <template> <div> <el-button @click="fetchUser">获取用户信息</el-button> <p v-if="user">{{ user.name }}</p> </div> </template> <script setup> import { ref } from &#39;vue&#39; import { getUser } from &#39;./api/user&#39; const user = ref(null) const fetchUser = async () => { try { const response = await getUser() user.value = response.data } catch (error) { console.error(&#39;获取用户信息失败:&#39;, error) } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值