vite+vue3+ts项目搭建
一、项目搭建与配置引入
1.创建项目
yarn create vite
2.添加各种依赖
yarn add less
yarn add pinia
import { defineStore } from "pinia" export const useStore = defineStore('main', { state: () => ({ // 这里面存数据 counter: 0, }), actions: { // 这里面存方法集 increment() { this.counter++ }, randomizeCounter() { this.counter = Math.round(100 * Math.random()) }, }, })
main.ts也需要使用
import { createApp } from 'vue' import { createPinia } from "pinia"; import App from './App.vue' const app = createApp(App) app.use(createPinia()) app.mount('#app')
<script setup lang="ts"> import HelloWorld from './components/HelloWorld.vue'; import { useStore } from './stores'; // 因为是直接在stores下面创建的index.ts所以后面的index.ts可以省略,其他文件的就需要把*****.ts写出来 const stores = useStore() console.log(stores.$state); const ChangeMsg = ()=>{ stores.ChangeMsg() } </script> <template> <HelloWorld :msg="stores.$state.msg" /> <button @click="ChangeMsg">改变</button> </template> <style lang="less" scoped> </style>
如此这般,pinia的引入与使用就告一段落啦
pinia使用问题出现:在router里面使用pinia会报错,分析异常的地址:https://stackoverflow.com/questions/70710965/vue-cant-access-pinia-store-in-beforeenter-vue-router
原因:由于在router阶段pinia还未被实例化,所以pinia在现目前是不存在的,所以去取值也是会报错的
解决方案:将pinia创建的实例导出去,然后挂在到APP上,这样你再router的时候也能调用到pinia里面的东西了;pinia只会构建一个实例,你后面定义的其他store也是在这个实例上面的,所以不用担心你创建的其他store取不到(我自己通过看这些解析自己分析的,可能不太准确,有什么都可以在评论区指出,欢迎指错,大家一起学习)
import { createPinia } from "pinia"; const pinia = createPinia(); export default pinia;
在main.ts中导入pinia
省略了一些其他的代码,直接添加进去就好
src/main.ts
// …… import pinia from './stores';// …… app.use(pinia);
router中使用
src/router/index.ts
import pinia from "../stores"; import { useHeadLoading } from "../stores/useHeadLoading"; const headLoadingStores = useHeadLoading(pinia) console.log(headLoadingStores.counter);
useHeadLoading这个文件我就没有改了,就是上文那个src/stores/index.ts这个里面的东西,改了个名字,根据自己的需求进行开发更改就好了
yarn add vue-router
同上面pinia的使用差不多
import { createRouter, createWebHistory } from "vue-router"; const router = createRouter({ history: createWebHistory("/"), routes: [ //基础路由规则 { path: "/", name: "home", component: () => import("../views/Home/index.vue"), }, { path: "/404", name: "404", component: () => import("../views/404/index.vue"), }, { path: "/:pathMatch(.*)", redirect: "/404", }, ], }); export default router;
import router from './router';
app.use(router)
yarn add axios
yarn add qs
除了安装axios还得装一个QS用来处理我们post提交的数据
import axios from "axios"; import qs from "qs"; axios.defaults.baseURL = "你的请求通用地址/"; // 请求地址 //post请求头 axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"; //设置超时 axios.defaults.timeout = 10000; axios.interceptors.request.use( (config) => { return config; }, (error) => { return Promise.reject(error); } ); axios.interceptors.response.use( (response) => { if (response.status == 200) { return Promise.resolve(response); } else { return Promise.reject(response); } }, (error) => { console.log("请求错误!"); } ); export default { post(url, data) { return new Promise((resolve, reject) => { axios({ method: "post", url, data: qs.stringify(data), }) .then((res) => { resolve(res); }) .catch((err) => { reject(err); }); }); }, get(url, data) { return new Promise((resolve, reject) => { axios({ method: "get", url, params: data, }) .then((res) => { resolve(res); }) .catch((err) => { reject(err); }); }); }, };
封装请求API
// 引入封装好的http import http from "./http"; // 封装各种请求 const post = (url:string, data = {}) => http.post(url, Object.assign(data)); const get = (url:string, params = {}) => http.get(url, Object.assign(params)); // 接口说明 // post示例 // const GetSettings = data => post('GetSettings', data) // get示例 // const GetSettings = params => get('GetSettings', params) // 使用说明 // GetSettings({ Did: 4 }).then((res) => { // console.log(res); // }); // 常用接口封装 // 获取配置信息 // {} export const GetSettings = (params:any) => get("getrouters", params);
---------------------------------------------------------------------------------------------------------------------------------------------
yarn add element-plus
我是用的按需自动引入,官网的快速开始也有介绍
npm install -D unplugin-vue-components unplugin-auto-import
// vite.config.ts import { defineConfig } from 'vite'
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()], }), ], })
注意事项:node版本如果低了,这个自动引入会报错的,我用的node版本是:v18.7.0
const msg = ref<string>(); const type = ref<boolean>(); const pageIndex = ref<number>(); const color = ref<string[]>([]); const Myobj = ref<{ name: string, age: number, like: string[] }>()
略微复杂的数据类型就先定义一个数据类型
interface Man { name: string, age: number, like: string[] } const kild = ref<Man>() const kilds = ref<Man[]>([])
注意,数据在定义的时候需要在后面跟一个空数组,不然赋值的时候会报错
复用数据类型操作方法
export interface InfoItem {
title: string;
Cover: string;
}
组件内调用类型
import { ref } from 'vue'; import { InfoItem } from "./types/tower"; const info = ref<InfoItem[]>([]) let item: InfoItem = { title: '你好', Cover: 'img' } info.value.push(item) console.log(info.value);
如果遇到报错波浪线或者类型不提示,请重启vscode,这是vscode的一个BUG,目前还没有新的版本更新去解决他
如果没有提示或者其他报错,请看一下tsconfig.json里面的include是不是匹配了你自定义类型的位置
以上,模板框架就搭完了,然后就根据需求去晚上网页和功能吧