当前位置:   article > 正文

vite+vue3(vuex、vuerouter、axios)+elementplus项目保姆教程_vite+vue + element plus

vite+vue + element plus

简单来说就是记录一下怎么从0开始搭建一个vue3+vite+elementplus的项目,

本文详细记录了每一步的代码\控制台和文件操作,包括项目搭建\安装vuerouter\安装vuex\安装axios和一些发版前准备工作,

可以说是保姆级教程了,喜欢可以收藏一下,

有问题大家一起在评论区探讨

2022/6/2更新

提供一个除了都处理好了的基础代码,clone下来可以直接使用

git地址https://github.com/shinjie1210/vite-config.git

----------------------------------------------------------------------------------------------------------------------------

目录

1.创建并初始化项目

2.安装使用vue-router

3.安装使用vuex

4.安装使用axios

5.安装使用element-plus

6.发版准备工作

未完待续....


1.创建并初始化项目

控制台输入

 npm init vite@latest

然后自己填下项目名称和项目框架 这里我还是选择js的,感兴趣ts的朋友可以自己了解下,也不复杂

cd进项目目录后install一下就可以run起来了

为了方便后面修改啥的,再加上我这个人比较懒,就去设置一下run之后自动默认浏览器打开

在package.json里进行如下修改

  1. {
  2. "name": "a-project",
  3. "version": "0.0.0",
  4. "scripts": {
  5. "dev": "vite --open",//改了这一行 添加了--open
  6. "build": "vite build",
  7. "preview": "vite preview"
  8. },
  9. "dependencies": {
  10. "vue": "^3.2.25"
  11. },
  12. "devDependencies": {
  13. "@vitejs/plugin-vue": "^2.0.0",
  14. "vite": "^2.7.2"
  15. }
  16. }

 然后清理一下 把默认的内容都清空了,留一个主页logo就可以了

  1. <script setup>
  2. </script>
  3. <template>
  4. <img alt="Vue logo" src="./assets/logo.png" />
  5. </template>
  6. <style>
  7. #app {
  8. font-family: Avenir, Helvetica, Arial, sans-serif;
  9. -webkit-font-smoothing: antialiased;
  10. -moz-osx-font-smoothing: grayscale;
  11. text-align: center;
  12. color: #2c3e50;
  13. margin-top: 60px;
  14. }
  15. </style>

 推荐用vscode的各位使用  Vue Language Features (Volar) 这个插件 比较好用

2.安装使用vue-router

npm install vue-router@4

 然后新建如下文件用于配置和测试路由

 配置路由页面index

  1. import {
  2. createRouter,
  3. createWebHistory
  4. } from 'vue-router'
  5. const routerHistory = createWebHistory()
  6. const router = createRouter({
  7. history: routerHistory,
  8. routes: [{
  9. path: '/',
  10. }, {
  11. path: '/foo',
  12. component: () => import('../views/foo.vue')
  13. }, {
  14. path: '/bar',
  15. component: () => import('../views/bar.vue')
  16. }]
  17. })
  18. export default router

测试页面foo.vue/bar.vue

  1. <template>
  2. <div>this is foo page</div>
  3. </template>
  4. <script setup>
  5. </script>
  6. <style>
  7. </style>

app.vue页面进行如下修改

  1. <script setup>
  2. import {
  3. useRouter
  4. } from 'vue-router'
  5. const router = useRouter()
  6. function toFoo() {
  7. router.push({
  8. path: '/foo'
  9. })
  10. }
  11. function toBar() {
  12. router.push({
  13. path: '/bar'
  14. })
  15. }
  16. </script>
  17. <template>
  18. <div>
  19. <img alt="Vue logo" src="./assets/logo.png" />
  20. </div>
  21. <button @click="toFoo">to foo</button>
  22. <button @click="toBar">to bar</button>
  23. <router-view></router-view>
  24. </template>
  25. <style>
  26. #app {
  27. text-align: center;
  28. color: #2c3e50;
  29. margin-top: 60px;
  30. }
  31. </style>

然后在main.js里引入

  1. import {
  2. createApp
  3. } from 'vue'
  4. import App from './App.vue'
  5. import router from './router'
  6. const app = createApp(App)
  7. app.use(router).mount('#app')

那么测试下效果

3.安装使用vuex

npm i vuex@next -S

新增以下文件

配置index.js

  1. import {
  2. createStore,
  3. } from 'vuex';
  4. export default createStore({
  5. state: {
  6. test: 0
  7. },
  8. mutations: { //同步
  9. add(state) {
  10. state.test++
  11. },
  12. min(state) {
  13. state.test--
  14. },
  15. set99(state, payload) {
  16. state.test = payload
  17. }
  18. },
  19. actions: {
  20. change(context, payload) { //异步
  21. setTimeout(() => {
  22. context.commit('set99', payload)
  23. }, 1500);
  24. }
  25. }
  26. });

 然后在main.js里引入

  1. import {
  2. createApp
  3. } from 'vue'
  4. import App from './App.vue'
  5. import router from './router'
  6. import store from './store'
  7. const app = createApp(App)
  8. app.use(router).use(store).mount('#app')

在其他页面引入(foo/bar.vue)并查看效果

  1. <template>
  2. <div>this is foo page</div>
  3. <p>{{store.state.test}}</p>
  4. </template>
  5. <script setup>
  6. import {
  7. useStore
  8. } from 'vuex'
  9. const store = useStore()
  10. </script>
  11. <style>
  12. </style>

在其他页面引入并测试方法执行(app.vue) 

  1. <script setup>
  2. import {
  3. useRouter
  4. } from 'vue-router' //引入router
  5. import {
  6. useStore
  7. } from 'vuex' //引入vuex
  8. const router = useRouter()
  9. const store = useStore()
  10. //路由跳转测试
  11. function toFoo() {
  12. router.push({
  13. path: '/foo'
  14. })
  15. }
  16. function toBar() {
  17. router.push({
  18. path: '/bar'
  19. })
  20. }
  21. //修改数据func测试
  22. function addState() {
  23. store.commit('add')
  24. }
  25. function minState() {
  26. store.commit('min')
  27. }
  28. //异步func测试
  29. function changeState() {
  30. store.dispatch('change', 99)
  31. }
  32. </script>
  33. <template>
  34. <div>
  35. <img alt="Vue logo" src="./assets/logo.png" />
  36. </div>
  37. <button @click="toFoo">to foo</button>
  38. <button @click="toBar">to bar</button>
  39. <router-view></router-view>
  40. <div>
  41. <button @click="addState">add</button>
  42. <button @click="minState">min</button>
  43. <button @click="changeState">change</button>
  44. </div>
  45. </template>
  46. <style>
  47. #app {
  48. text-align: center;
  49. color: #2c3e50;
  50. margin-top: 60px;
  51. }
  52. </style>

效果如下的话,那么vuex就算引入成功了

4.安装使用axios

npm install axios

然后添加配置文件

 编辑apiManager.js 用来配置请求设置

  1. import axios from 'axios';
  2. class ApiHost {
  3. constructor(baseUrl, name, baseOptions) {
  4. this.name = name;
  5. this.axiosInstance = axios.create({
  6. baseURL: baseUrl,
  7. withCredentials: false,
  8. });
  9. this.baseUrl = baseUrl;
  10. this.baseOptions = baseOptions;
  11. //拦截器,用户识别需不需要token
  12. this.axiosInstance.interceptors.request.use(
  13. config => {
  14. let token = window.localStorage.getItem('token')
  15. if (token && config.url.indexOf('login') == -1) {
  16. config.headers.token = token
  17. }
  18. return config;
  19. },
  20. error => {
  21. return error;
  22. }
  23. )
  24. }
  25. call(path, method, urlParams, bodyParams, options) {
  26. let configs = {
  27. url: `${path}`,
  28. params: urlParams,
  29. method,
  30. data: bodyParams
  31. };
  32. return new Promise((resolve, reject) => {
  33. this.axiosInstance
  34. .request(configs)
  35. .then(res => {
  36. if (res.data.code == '200' || res.data.code == '0') {
  37. resolve(res.data);
  38. } else {
  39. reject(res.data)
  40. }
  41. })
  42. .catch(error => {
  43. reject(error);
  44. });
  45. })
  46. }
  47. get(path, urlParams, options) {
  48. return this.call(path, 'get', urlParams, null, options);
  49. }
  50. delete(path, urlParams, bodyParams, options) {
  51. return this.call(path, 'delete', urlParams, bodyParams, options);
  52. }
  53. post(path, bodyParams, options) {
  54. return this.call(path, 'post', null, bodyParams, options);
  55. }
  56. put(path, bodyParams, options) {
  57. return this.call(path, 'put', null, bodyParams, options);
  58. }
  59. patch(path, bodyParams, options) {
  60. return this.call(path, 'patch', null, bodyParams, options);
  61. }
  62. }
  63. export default class {
  64. static getApiHost(baseUrl, name, baseOptions) {
  65. return new ApiHost(baseUrl, name, baseOptions);
  66. }
  67. }

编辑index.js用于导出所有请求

  1. import ApiManager from '../api/ApiManager'
  2. const apiManager = ApiManager.getApiHost("", "");
  3. //admin-auth-center/login 用户登录
  4. export function userLogin(data) {
  5. return apiManager.post('你的baseURL' + "你的接口路径", data)
  6. }

然后我们在app.vue里做一个测试

  1. <script setup>
  2. import {
  3. useRouter
  4. } from 'vue-router' //引入router
  5. import {
  6. useStore
  7. } from 'vuex' //引入vuex
  8. import { //引入生命周期函数--------------------添加内容
  9. onMounted
  10. } from 'vue';
  11. import { //引入定义的请求--------------------添加内容
  12. userLogin
  13. } from './api/index'
  14. const router = useRouter()
  15. const store = useStore()
  16. //发请求--------------------添加内容
  17. onMounted(() => {
  18. userLogin({
  19. //你的请求字段
  20. }).then(res => {
  21. console.log(res);
  22. }).catch(error => {
  23. console.log(error);
  24. })
  25. })
  26. //路由跳转测试
  27. function toFoo() {
  28. router.push({
  29. path: '/foo'
  30. })
  31. }
  32. function toBar() {
  33. router.push({
  34. path: '/bar'
  35. })
  36. }
  37. //修改数据func测试
  38. function addState() {
  39. store.commit('add')
  40. }
  41. function minState() {
  42. store.commit('min')
  43. }
  44. //异步func测试
  45. function changeState() {
  46. store.dispatch('change', 99)
  47. }
  48. </script>
  49. <template>
  50. <div>
  51. <img alt="Vue logo" src="./assets/logo.png" />
  52. </div>
  53. <button @click="toFoo">to foo</button>
  54. <button @click="toBar">to bar</button>
  55. <router-view></router-view>
  56. <div>
  57. <button @click="addState">add</button>
  58. <button @click="minState">min</button>
  59. <button @click="changeState">change</button>
  60. </div>
  61. </template>
  62. <style>
  63. #app {
  64. text-align: center;
  65. color: #2c3e50;
  66. margin-top: 60px;
  67. }
  68. </style>

那么如果控制台打印了请求结果,就算成功拉

5.安装使用element-plus

先npm安装一下,然后我们直接走按需引入路线

npm install element-plus --save

安装按需引入的插件

npm install -D unplugin-vue-components unplugin-auto-import

然后去编辑vite.config.js

  1. import {
  2. defineConfig
  3. } from 'vite'
  4. import vue from '@vitejs/plugin-vue'
  5. import Components from 'unplugin-vue-components/vite'//这里
  6. import AutoImport from 'unplugin-auto-import/vite'//这里
  7. import {
  8. ElementPlusResolver
  9. } from 'unplugin-vue-components/resolvers'//这里
  10. // https://vitejs.dev/config/
  11. export default defineConfig({
  12. plugins: [vue(),
  13. AutoImport({//这里
  14. resolvers: [ElementPlusResolver()],
  15. }),
  16. Components({//这里
  17. resolvers: [ElementPlusResolver()],
  18. }),
  19. ]
  20. })

那么到这里我们就成功完成按需引入了,不再需要在每个页面单独进行引入了,

下面写点内容进行测试,直接在app.vue页面测试就行了

先在dom里写个el-button看能不能显示,位置随便啊自己好找就行

<el-button type="primary">ele-test</el-button>

然后再在之前写请求的地方测试下ElMessage在没有单独引入的情况下能不能使用

  1. onMounted(() => {
  2. ElMessage({
  3. message: 'element-plus按需引入成功',
  4. type: 'success',
  5. })
  6. })

ojbk

6.发版准备工作

今天有点早..就再写一点培训机构和网上视频不怎么说的内容

项目搭起来之后可以内网发版看下效果了,我们做一下准备工作

首先前往路由index页面写一下路由history模式路径,

  1. import {
  2. createRouter,
  3. createWebHistory
  4. } from 'vue-router'
  5. const routerHistory = createWebHistory('/aProject/')//这里
  6. const router = createRouter({
  7. history: routerHistory,
  8. routes: [{
  9. path: '/',
  10. }, {
  11. path: '/foo',
  12. component: () => import('../views/foo.vue')
  13. }, {
  14. path: '/bar',
  15. component: () => import('../views/bar.vue')
  16. }]
  17. })
  18. export default router

 然后再修改vite.config.js内容,配置项目部署基础目录,地址和刚刚配置的路由路径一致

  1. import {
  2. defineConfig,
  3. loadEnv
  4. } from 'vite'
  5. import vue from '@vitejs/plugin-vue'
  6. import Components from 'unplugin-vue-components/vite'
  7. import AutoImport from 'unplugin-auto-import/vite'
  8. import {
  9. ElementPlusResolver
  10. } from 'unplugin-vue-components/resolvers'
  11. // https://vitejs.dev/config/
  12. export default defineConfig({
  13. base: '/aProject/',//这里
  14. plugins: [vue(),
  15. AutoImport({
  16. resolvers: [ElementPlusResolver()],
  17. }),
  18. Components({
  19. resolvers: [ElementPlusResolver()],
  20. }),
  21. ]
  22. })

之后再修改一下.gitignore文件,默认是不上传dist文件夹的 我们需要修改一下

  1. node_modules
  2. .DS_Store
  3. #dist//可以加#号也可以直接删除本行
  4. dist-ssr
  5. *.local

然后命令行运行build,就可以让运维把按dist文件夹部署项目了

npm run build

 这两天有空我再写一下不同环境的分包和vite.config的配置,觉得有用的朋友记得点赞哦

未完待续....

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/225683
推荐阅读
相关标签
  

闽ICP备14008679号