vite+vue3專案最佳起始點(保姆級)
一 、透過雲開發平臺快速建立初始化應用
二 、 本地編寫 Vite後臺專案最佳起始點
1.將應用模版克隆到本地
git clone + 專案地址
cd Vite
git checkout feature/1.0.0
npm install
npm run dev
2.路由
npm i vue-router@next -S
import { createRouter, createWebHashHistory } from 'vue-router'; const router = createRouter({ history: createWebHashHistory(), routes: [ { path: '/', component: () => import('views/home.vue') } ] }); export default router
import router from "@/router"; createApp(App).use(router).mount("#app");
3.狀態管理
npm i vuex@next -S
import {createStore} from 'vuex'; export default createStore({ state: { couter: 0 } });
import store from "@/store"; createApp(App).use(store).mount("#app");
4.樣式組織
npm i sass -D
5.UI庫
npm i element3 -S
import element3 from "element3"; import "element3/lib/theme-chalk/index.css"; createApp(App).use(element3)
import "element3/lib/theme-chalk/button.css"; import { ElButton } from "element3" createApp(App).use(ElButton)
// 完整引入 import element3 from "element3"; import "element3/lib/theme-chalk/index.css"; // 按需引入 // import { ElButton } from "element3"; // import "element3/lib/theme-chalk/button.css"; export default function (app) { // 完整引入 app.use(element3) // 按需引入 // app.use(ElButton); }
<el-button>my button</el-button>
6.基礎佈局
<template> <div> <!-- 側邊欄 --> <div></div> <!-- 內容容器 --> <div> <!-- 頂部導航欄 --> <navbar /> <!-- 內容區 --> <app-main /> </div> </div> </template> <script setup> import AppMain from "./components/AppMain.vue"; import Navbar from "./components/Navbar.vue"; </script> <style scoped> @import "../styles/mixin.scss"; .app-wrapper { @include clearfix; position: relative; height: 100%; width: 100%; } </style>
{ path: "/", component: Layout, children: [ { path: "", component: () => import('views/home.vue'), name: "Home", meta: { title: "首頁", icon: "el-icon-s-home" }, }, ], },
7.動態導航
<template> <el-scrollbar wrap-class="scrollbar-wrapper"> <el-menu :default-active="activeMenu" :background-color="variables.menuBg" :text-color="variables.menuText" :unique-opened="false" :active-text-color="variables.menuActiveText" mode="vertical" > <sidebar-item v-for="route in routes" :key="route.path" :item="route" :base-path="route.path" /> </el-menu> </el-scrollbar> </template> <script setup> import SidebarItem from "./SidebarItem.vue"; import { computed } from "vue"; import { useRoute } from "vue-router"; import { routes } from "@/router"; import variables from "styles/variables.module.scss"; const activeMenu = computed(() => { const route = useRoute(); const { meta, path } = route; if (meta.activeMenu) { return meta.activeMenu; } return path; }); </script>
8.麵包屑
<template> <el-breadcrumb separator="/"> <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" >{{ item.meta.title }}</span> <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> </el-breadcrumb-item> </el-breadcrumb> </template> <script setup> import { compile } from "path-to-regexp"; import { reactive, ref, watch } from "vue"; import { useRoute, useRouter } from "vue-router"; const levelList = ref(null); const router = useRouter(); const route = useRoute(); const getBreadcrumb = () => { let matched = route.matched.filter((item) => item.meta && item.meta.title); const first = matched[0]; if (first.path !== "/") { matched = [{ path: "/home", meta: { title: "首頁" } }].concat(matched); } levelList.value = matched.filter( (item) => item.meta && item.meta.title && item.meta.breadcrumb !== false ); } const pathCompile = (path) => { var toPath = compile(path); return toPath(route.params); } const handleLink = (item) => { const { redirect, path } = item; if (redirect) { router.push(redirect); return; } router.push(pathCompile(path)); } getBreadcrumb(); watch(route, getBreadcrumb) </script> <style scoped> .app-breadcrumb.el-breadcrumb { display: inline-block; font-size: 14px; line-height: 50px; margin-left: 8px; .no-redirect { color: #97a8be; cursor: text; } } </style>
9.資料封裝
npm i axios -S
VITE_BASE_API=/api
import axios from "axios"; import { Message, Msgbox } from "element3"; // 建立axios例項 const service = axios.create({ // 在請求地址前面加上baseURL baseURL: import.meta.env.VITE_BASE_API, // 當傳送跨域請求時攜帶cookie // withCredentials: true, timeout: 5000, }); // 請求攔截 service.interceptors.request.use( (config) => { // 模擬指定請求令牌 config.headers["X-Token"] = "my token"; return config; }, (error) => { // 請求錯誤的統一處理 console.log(error); // for debug return Promise.reject(error); } ); // 響應攔截器 service.interceptors.response.use( /** * 透過判斷狀態碼統一處理響應,根據情況修改 * 同時也可以透過HTTP狀態碼判斷請求結果 */ (response) => { const res = response.data; // 如果狀態碼不是20000則認為有錯誤 if (res.code !== 20000) { Message.error({ message: res.message || "Error", duration: 5 * 1000, }); // 50008: 非法令牌; 50012: 其他客戶端已登入; 50014: 令牌過期; if (res.code === 50008 || res.code === 50012 || res.code === 50014) { // 重新登入 Msgbox.confirm("您已登出, 請重新登入", "確認", { confirmButtonText: "重新登入", cancelButtonText: "取消", type: "warning", }).then(() => { store.dispatch("user/resetToken").then(() => { location.reload(); }); }); } return Promise.reject(new Error(res.message || "Error")); } else { return res; } }, (error) => { console.log("err" + error); // for debug Message({ message: error.message, type: "error", duration: 5 * 1000, }); return Promise.reject(error); } ); export default service;
10.常見業務處理
<el-table v-loading="loading" :data="list"> <el-table-column label="ID" prop="id"></el-table-column> <el-table-column label="賬戶名" prop="name"></el-table-column> <el-table-column label="年齡" prop="age"></el-table-column> </el-table>
export function useList() { // 列表資料 const state = reactive({ loading: true, // 載入狀態 list: [], // 列表資料 }); // 獲取列表 function getList() { state.loading = true; return request({ url: "/getUsers", method: "get", }).then(({ data, total }) => { // 設定列表資料 state.list = data; }).finally(() => { state.loading = false; }); } // 首次獲取資料 getList(); return { state, getList }; }
import { useList } from "./model/userModel";
const { state, getList } = useList();
<pagination :total="total" v-model:page="listQuery.page" v-model:limit="listQuery.limit" @pagination="getList" ></pagination>
const state = reactive({ total: 0, // 總條數 listQuery: {// 分頁查詢引數 page: 1, // 當前頁碼 limit: 5, // 每頁條數 }, });
request({ url: "/getUsers", method: "get", params: state.listQuery, // 在查詢中加入分頁引數 })
11.表單處理
<el-form ref="form" :model="model" :rules="rules"> <el-form-item prop="name" label="使用者名稱"> <el-input v-model="model.name"></el-input> </el-form-item> <el-form-item prop="age" label="使用者年齡"> <el-input v-model.number="model.age"></el-input> </el-form-item> <el-form-item> <el-button @click="submitForm" type="primary">提交</el-button> </el-form-item> </el-form>
export function useItem(isEdit, id) { const model = ref(Object.assign({}, defaultData)); // 初始化時,根據isEdit判定是否需要獲取詳情 onMounted(() => { if (isEdit && id) { // 獲取詳情 request({ url: "/getUser", method: "get", params: { id }, }).then(({ data }) => { model.value = data; }); } }); return { model }; }
三 、 雲端一鍵部署上線應用
1.上傳程式碼
git add . git commit -m '新增你的註釋' git push
2.在日常環境部署
3.配置自定義域名線上上環境上線
4.專案預覽效果
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2900662/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vite+vue3專案配置二級訪問目錄ViteVue
- RabbitMQ保姆級教程最佳實踐MQ
- Vite+Vue3 專案 華仔待辦ViteVue
- 保姆級教程,如何發現 GitHub 上的優質專案?Github
- Laravel 專案的起始工作與準備Laravel
- 保姆級神器 Maven,再也不用擔心專案構建搞崩了Maven
- 【保姆級】Python專案(Flask網頁)部署到Docker的完整過程PythonFlask網頁Docker
- 盤點2021最佳資料視覺化專案視覺化
- SpringCloud搭建保姆級教程SpringGCCloud
- Docker安裝Jenkins打包Maven專案為Docker映象並執行【保姆級圖文教學】DockerJenkinsMaven
- SeaweedFS + TiKV 部署保姆級教程
- graspnet復現保姆級教程
- 回收站刪除的檔案恢復,保姆級教學
- 盤點 35 個 Apache 頂級專案,我拜服了…Apache
- ROS通訊方式(保姆級教程)ROS
- 分散式事務保姆級教程分散式
- VSCode安裝使用教程,保姆級!VSCode
- Mapbox 輕鬆規劃起始點軌跡
- vue專案最佳化Vue
- 我給Apache頂級專案貢獻了點原始碼。Apache原始碼
- blog保姆級別開發流程七
- Hive視窗函式保姆級教程Hive函式
- 專案效能最佳化方案
- go專案dockerfile最佳實踐GoDocker
- 專案管理小結(如何做好一個百萬級專案甚至千萬級別的專案)專案管理
- 文旅夜遊消費升級專案IP的優點
- 保姆級教程!玩轉 ChunJun 詳細指南
- 保姆級教程,透視分析真的不難
- OceanBase 金融專案最佳化案例
- 如何將Angular單專案升級為多專案Angular
- 門戶專案特點以及專案策劃
- React17+React Hook+TS4 最佳實踐 仿 Jira 企業級專案ReactHook
- 20201124_起始
- Dell Latitude 7300 安裝 Centos 7.6 保姆級教程CentOS
- 保姆級教程 | Merge Request 分支合併請求
- 用 Python 寫個貪吃蛇,保姆級教程!Python
- Containerd 的前世今生和保姆級入門教程AI
- 超級賬本-頂級專案介紹