前端Vue3項目實戰(zhàn)教程_第1頁
前端Vue3項目實戰(zhàn)教程_第2頁
前端Vue3項目實戰(zhàn)教程_第3頁
前端Vue3項目實戰(zhàn)教程_第4頁
前端Vue3項目實戰(zhàn)教程_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論