版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
前端Vue3項目實戰(zhàn)教程前言Vue.js作為當(dāng)前最流行的前端框架之一,其最新版本Vue3帶來了CompositionAPI、更好的TypeScript支持、性能優(yōu)化等諸多改進(jìn)。本教程將通過一個完整的電商后臺管理系統(tǒng)實戰(zhàn)項目,帶你從零開始掌握Vue3的核心技術(shù)棧,包括CompositionAPI、路由管理、狀態(tài)管理、組件通信、UI組件庫集成、HTTP請求、項目構(gòu)建等關(guān)鍵知識點(diǎn)。我們將采用“理論+實踐+代碼解析”的模式,確保你不僅能理解原理,更能獨(dú)立開發(fā)出高質(zhì)量的前端應(yīng)用。一、項目準(zhǔn)備與環(huán)境搭建1.開發(fā)環(huán)境要求Node.js:版本≥16.0.0(推薦使用LTS版本,如18.x)包管理器:npm(隨Node.js安裝)或yarn(推薦)代碼編輯器:VSCode(推薦安裝Vue相關(guān)插件:Vetur或Volar)2.創(chuàng)建Vue3項目使用Vue官方腳手架工具create-vue(Vue3官方推薦)創(chuàng)建項目:
#使用npm
npmcreatevue@latestvue3-ecommerce-admin
#或使用yarn
yarncreatevuevue3-ecommerce-admin
#或使用pnpm
pnpmcreatevuevue3-ecommerce-admin交互式選項配置(根據(jù)需求選擇):
-?TypeScript:Yes(推薦,提升代碼健壯性)
-?JSX:No(除非需要)
-?VueRouter:Yes(項目需要路由功能)
-?Pinia:Yes(Vue3推薦的狀態(tài)管理庫)
-?Vitest:No(可選,單元測試)
-?ESLint:Yes(代碼規(guī)范檢查)
-?Prettier:Yes(代碼格式化)進(jìn)入項目目錄并安裝依賴:cdvue3-ecommerce-admin
npminstall3.項目結(jié)構(gòu)概覽創(chuàng)建完成后的項目基礎(chǔ)結(jié)構(gòu)如下:vue3-ecommerce-admin/
├──public/#靜態(tài)資源(如favicon.ico)
├──src/
│├──assets/#靜態(tài)資源(圖片、字體等)
│├──components/#通用組件(如按鈕、卡片)
│├──router/#路由配置(index.ts)
│├──stores/#Pinia狀態(tài)管理(如用戶信息、權(quán)限)
│├──views/#頁面級組件(如登錄頁、商品管理頁)
│├──api/#HTTP請求封裝(如axios實例、API接口)
│├──utils/#工具函數(shù)(如日期格式化、權(quán)限校驗)
│├──App.vue#根組件
│└──main.ts#應(yīng)用入口文件
├──package.json#項目依賴與腳本配置
└──vite.config.ts#Vite構(gòu)建工具配置二、核心技術(shù)棧集成與配置1.VueRouter4(路由管理)Vue3推薦使用VueRouter4,支持CompositionAPI。(1)基礎(chǔ)路由配置(src/router/index.ts)import{createRouter,createWebHistory}from'vue-router'
importLoginfrom'@/views/Login.vue'
importDashboardfrom'@/views/Dashboard.vue'
importProductListfrom'@/views/ProductList.vue'
constroutes=[
{
path:'/login',
name:'Login',
component:Login,
meta:{requiresAuth:false}//不需要登錄
},
{
path:'/',
redirect:'/dashboard'//默認(rèn)重定向到儀表盤
},
{
path:'/dashboard',
name:'Dashboard',
component:Dashboard,
meta:{requiresAuth:true}//需要登錄
},
{
path:'/products',
name:'ProductList',
component:ProductList,
meta:{requiresAuth:true}
}
]
constrouter=createRouter({
history:createWebHistory(import.meta.env.BASE_URL),
routes
})
//路由守衛(wèi):全局前置守衛(wèi)(檢查登錄狀態(tài))
router.beforeEach((to,from,next)=>{
consttoken=localStorage.getItem('token')//假設(shè)token存儲在localStorage
if(to.meta.requiresAuth&&!token){
next('/login')//需要登錄但未登錄,跳轉(zhuǎn)到登錄頁
}elseif(to.path==='/login'&&token){
next('/dashboard')//已登錄用戶訪問登錄頁,重定向到儀表盤
}else{
next()//其他情況正常放行
}
})
exportdefaultrouter(2)在組件中使用路由(CompositionAPI)<scriptsetuplang="ts">
import{useRouter,useRoute}from'vue-router'
constrouter=useRouter()
constroute=useRoute()
//跳轉(zhuǎn)到商品列表頁
constgoToProducts=()=>{
router.push('/products')
}
//獲取路由參數(shù)(如/products/:id)
constproductId=computed(()=>route.params.id)
</script>
<template>
<button@click="goToProducts">查看商品列表</button>
</template>2.Pinia(狀態(tài)管理)Pinia是Vue3官方推薦的狀態(tài)管理庫,比Vuex更簡潔,天然支持CompositionAPI和TypeScript。(1)定義Store(src/stores/user.ts)import{defineStore}from'pinia'
import{ref}from'vue'
exportconstuseUserStore=defineStore('user',()=>{
//狀態(tài)
consttoken=ref<string|null>(localStorage.getItem('token'))
constuserInfo=ref<any>(null)
//動作(Actions)
constlogin=async(username:string,password:string)=>{
try{
//模擬API登錄請求(實際項目中替換為真實API)
constresponse=awaitfetch('/api/login',{
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify({username,password})
})
constdata=awaitresponse.json()
if(data.success){
token.value=data.token
userInfo.value=data.user
localStorage.setItem('token',data.token)//存儲token
}
returndata
}catch(error){
console.error('登錄失敗:',error)
throwerror
}
}
constlogout=()=>{
token.value=null
userInfo.value=null
localStorage.removeItem('token')//清除token
}
return{token,userInfo,login,logout}
})(2)在組件中使用Store<scriptsetuplang="ts">
import{useUserStore}from'@/stores/user'
constuserStore=useUserStore()
//登錄操作
consthandleLogin=async()=>{
try{
awaituserStore.login('admin','123456')
alert('登錄成功!')
}catch(error){
alert('登錄失敗,請檢查用戶名和密碼')
}
}
//退出登錄
consthandleLogout=()=>{
userStore.logout()
alert('已退出登錄')
}
</script>
<template>
<div>
<divv-if="userStore.token">
歡迎,{{userStore.userInfo?.username}}!
<button@click="handleLogout">退出登錄</button>
</div>
<divv-else>
<inputv-model="username"placeholder="用戶名"/>
<inputv-model="password"type="password"placeholder="密碼"/>
<button@click="handleLogin">登錄</button>
</div>
</div>
</template>3.UI組件庫集成(以ElementPlus為例)ElementPlus是一套為開發(fā)者、設(shè)計師和產(chǎn)品經(jīng)理準(zhǔn)備的基于Vue3的桌面端組件庫。(1)安裝ElementPlusnpminstallelement-plus
npminstall@element-plus/icons-vue#圖標(biāo)庫(2)全局配置(src/main.ts)import{createApp}from'vue'
importAppfrom'./App.vue'
importrouterfrom'./router'
import{createPinia}from'pinia'
importElementPlusfrom'element-plus'
import'element-plus/dist/index.css'
import*asElementPlusIconsVuefrom'@element-plus/icons-vue'
constapp=createApp(App)
//注冊所有圖標(biāo)
for(const[key,component]ofObject.entries(ElementPlusIconsVue)){
ponent(key,component)
}
app.use(createPinia())
app.use(router)
app.use(ElementPlus)
app.mount('#app')(3)在組件中使用ElementPlus組件<scriptsetuplang="ts">
import{ref}from'vue'
import{ElMessage}from'element-plus'
constusername=ref('')
constpassword=ref('')
consthandleLogin=()=>{
if(!username.value||!password.value){
ElMessage.warning('請輸入用戶名和密碼')
return
}
//調(diào)用登錄邏輯...
ElMessage.success('登錄成功!')
}
</script>
<template>
<el-cardclass="login-card">
<template#header>
<span>電商后臺管理系統(tǒng)</span>
</template>
<el-form>
<el-form-itemlabel="用戶名">
<el-inputv-model="username"placeholder="請輸入用戶名"/>
</el-form-item>
<el-form-itemlabel="密碼">
<el-inputv-model="password"type="password"placeholder="請輸入密碼"/>
</el-form-item>
<el-buttontype="primary"@click="handleLogin"style="width:100%">
登錄
</el-button>
</el-form>
</el-card>
</template>
<stylescoped>
.login-card{
max-width:400px;
margin:100pxauto;
}
</style>三、實戰(zhàn)項目:電商后臺管理系統(tǒng)核心功能開發(fā)1.項目需求概述我們將開發(fā)一個包含以下核心功能的電商后臺管理系統(tǒng):
-用戶認(rèn)證:登錄/退出(Token管理)
-儀表盤:展示關(guān)鍵數(shù)據(jù)(如訂單數(shù)量、銷售額)
-商品管理:商品列表展示、添加/編輯/刪除商品
-訂單管理:訂單列表、訂單狀態(tài)更新
-用戶管理:管理員/用戶列表(權(quán)限控制)2.商品管理模塊開發(fā)(重點(diǎn)示例)(1)商品列表頁面(src/views/ProductList.vue)<scriptsetuplang="ts">
import{ref,onMounted}from'vue'
import{ElTable,ElTableColumn,ElButton,ElMessageBox}from'element-plus'
import{Plus,Edit,Delete}from'@element-plus/icons-vue'
import{useRouter}from'vue-router'
import{getProductList,deleteProduct}from'@/api/product'//假設(shè)的API方法
constproducts=ref<any[]>([])
constloading=ref(false)
//獲取商品列表
constfetchProducts=async()=>{
loading.value=true
try{
constdata=awaitgetProductList()
products.value=data.list
}catch(error){
console.error('獲取商品列表失敗:',error)
}finally{
loading.value=false
}
}
//刪除商品
consthandleDelete=async(id:number)=>{
try{
awaitElMessageBox.confirm('確定要刪除該商品嗎?','提示',{
confirmButtonText:'確定',
cancelButtonText:'取消',
type:'warning'
})
awaitdeleteProduct(id)
ElMessage.success('刪除成功')
fetchProducts()//刷新列表
}catch(error){
if(error!=='cancel'){
ElMessage.error('刪除失敗')
}
}
}
//跳轉(zhuǎn)到添加/編輯商品頁
constgoToEdit=(id?:number)=>{
router.push(`/products/edit/${id||'new'}`)
}
constrouter=useRouter()
onMounted(()=>{
fetchProducts()
})
</script>
<template>
<div>
<divstyle="margin-bottom:20px">
<el-buttontype="primary":icon="Plus"@click="goToEdit()">
添加商品
</el-button>
</div>
<el-table:data="products":loading="loading">
<el-table-columnprop="id"label="ID"width="80"/>
<el-table-columnprop="name"label="商品名稱"/>
<el-table-columnprop="price"label="價格"width="100">
<template#default="{row}">
¥{{row.price}}
</template>
</el-table-column>
<el-table-columnprop="stock"label="庫存"width="100"/>
<el-table-columnlabel="操作"width="180">
<template#default="{row}">
<el-buttonsize="small":icon="Edit"@click="goToEdit(row.id)">
編輯
</el-button>
<el-button
size="small"
type="danger"
:icon="Delete"
@click="handleDelete(row.id)"
>
刪除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>(2)API請求封裝(src/api/product.ts)importrequestfrom'@/utils/request'//假設(shè)的axios封裝實例
//獲取商品列表
exportconstgetProductList=():Promise<{list:any[]}>=>{
returnrequest({
url:'/api/products',
method:'get'
})
}
//刪除商品
exportconstdeleteProduct=(id:number):Promise<void>=>{
returnrequest({
url:`/api/products/${id}`,
method:'delete'
})
}
//添加/編輯商品(示例)
exportconstsaveProduct=(data:any):Promise<void>=>{
returnrequest({
url:'/api/products',
method:'post',
data
})
}(3)HTTP請求封裝(src/utils/request.ts)importaxiosfrom'axios'
import{ElMessage}from'element-plus'
importrouterfrom'@/router'
constrequest=axios.create({
baseURL:import.meta.env.VITE_API_BASE_URL||'http://localhost:3000',//API基礎(chǔ)地址(通過環(huán)境變量配置)
timeout:10000//請求超時時間
})
//請求攔截器(添加Token)
erceptors.request.use(
(config)=>{
consttoken=localStorage.getItem('token')
if(token){
config.headers.Authorization=`Bearer${token}`
}
returnconfig
},
(error)=>{
returnPromise.reject(error)
}
)
//響應(yīng)攔截器(處理錯誤)
erceptors.response.use(
(response)=>{
returnresponse.data//假設(shè)后端返回{success:boolean,data:any,message:string}
},
(error)=>{
if(error.response?.status===401){
localStorage.removeItem('token')
router.push('/login')
ElMessage.error('登錄已過期,請重新登錄')
}else{
ElMessage.error(error.response?.data?.message||'請求失敗')
}
returnPromise.reject(error)
}
)
exportdefaultrequest四、項目優(yōu)化與部署1.性能優(yōu)化路由懶加載:減少首屏加載時間//修改路由配置(src/router/index.ts)
constProductList=()=>import('@/views/ProductList.vue')//懶加載
constroutes=[
{
path:'/products',
name:'ProductList',
component:ProductList//使用懶加載組件
}
]代碼分割:Vite默認(rèn)支持ES模塊按需加載靜態(tài)資源優(yōu)化:壓縮圖片(使用工具如tinypng)、啟用Gzip壓縮(服務(wù)器配置)2.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 46871-2025二氧化碳捕集、運(yùn)輸和地質(zhì)封存提高原油采收率的二氧化碳封存
- 2025年中職(紡織技術(shù)基礎(chǔ))紡織工藝階段測試試題及答案
- 2025年高職烹調(diào)工藝與營養(yǎng)(菜品研發(fā))試題及答案
- 2025年中職第一學(xué)年(會展禮儀)VIP客戶接待禮儀階段測試試題及答案
- 2025年高職衛(wèi)生檢驗技術(shù)(衛(wèi)生檢驗應(yīng)用)試題及答案
- 2025年中職中國影視作品鑒賞(國產(chǎn)劇賞析)試題及答案
- 2025年高職第二學(xué)年(會展策劃)活動策劃專項測試試題及答案
- 2025年中職建設(shè)工程管理(工程安全管理)試題及答案
- 2025年大學(xué)生物(細(xì)胞結(jié)構(gòu)與功能)試題及答案
- 2025年高職編導(dǎo)(編導(dǎo)基礎(chǔ))試題及答案
- 酒店物業(yè)管理合同范本
- 醫(yī)療質(zhì)量改進(jìn)中文書書寫能力提升路徑
- 血乳酸在急危重癥應(yīng)用的專家共2026
- STM32G4入門與電機(jī)控制實戰(zhàn)
- 2025年中共深圳市龍華區(qū)委黨校博士后公開招聘(廣東)筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- (12)普通高中技術(shù)與工程課程標(biāo)準(zhǔn)日常修訂版(2017年版2025年修訂)
- 2025年個人個人工作總結(jié)工作總結(jié)模版(2篇)
- (完整文本版)新概念英語第一冊單詞表默寫版1-144
- 教育技術(shù)學(xué)課件
- 前列腺癌診治教學(xué)查房課件
- 《公路橋涵養(yǎng)護(hù)規(guī)范》(5120-2021)【可編輯】
評論
0/150
提交評論