個人主頁:Guiat
歸屬專欄:Vue
文章目錄
- 1. Vue UI 框架概述
- 1.1 主流Vue UI框架簡介
- 1.2 選擇UI框架的考慮因素
- 2. Element Plus詳解
- 2.1 Element Plus基礎使用
- 2.1.1 安裝與引入
- 2.1.2 基礎組件示例
- 2.2 Element Plus主題定制
- 2.3 Element Plus的優缺點分析
- 3. Ant Design Vue詳解
- 3.1 Ant Design Vue基礎使用
- 3.1.1 安裝與引入
- 3.1.2 基礎組件示例
- 3.2 Ant Design Vue主題定制
- 3.3 Ant Design Vue的優缺點分析
- 4. Vant詳解
- 4.1 Vant基礎使用
- 4.1.1 安裝與引入
- 4.1.2 基礎組件示例
- 4.2 Vant主題定制
- 4.3 Vant的優缺點分析
- 5. 三大框架性能對比
- 5.1 包體積對比
- 5.2 渲染性能對比
- 5.3 按需加載優化
- 6. 項目實踐中的框架選擇
- 6.1 不同業務場景下的選擇建議
- 6.2 混合使用多個框架
- 7. 實戰案例
- 7.1 使用Element Plus開發后臺管理系統
- 7.2 使用Vant開發移動端商城頁面
- 8. 總結與最佳實踐
- 8.1 框架選擇建議
- 8.2 提升開發效率的最佳實踐
- 8.3 未來發展趨勢
正文
1. Vue UI 框架概述
1.1 主流Vue UI框架簡介
Vue生態系統中有多個優秀的UI組件庫,幫助開發者快速構建美觀、一致且功能豐富的用戶界面。以下是三個最受歡迎的框架:
- Element Plus:基于Vue 3的桌面端組件庫,適用于中后臺系統
- Ant Design Vue:阿里巴巴推出的企業級UI組件庫,基于Ant Design設計規范
- Vant:有贊前端團隊開源的移動端組件庫,專注于移動應用開發
這些框架的市場份額如下:
// Vue UI框架流行度數據模擬
const frameworkPopularity = {"Element Plus": 38,"Ant Design Vue": 32,"Vant": 22,"其他": 8
};
1.2 選擇UI框架的考慮因素
選擇合適的UI框架需要考慮以下幾個關鍵因素:
- 應用場景:桌面端或移動端
- 組件豐富度:是否提供所需的全部組件
- 活躍度:維護頻率和社區支持
- 定制性:易于主題定制的程度
- 性能:包體積和渲染性能
- 兼容性:與Vue版本的兼容性
2. Element Plus詳解
2.1 Element Plus基礎使用
Element Plus是基于Vue 3的組件庫,提供了豐富的桌面端UI組件。
2.1.1 安裝與引入
# 使用npm安裝
npm install element-plus# 使用yarn安裝
yarn add element-plus
完整引入方式:
// main.js
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')
按需引入方式:
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import { ElButton, ElSelect } from 'element-plus'
import 'element-plus/es/components/button/style/css'
import 'element-plus/es/components/select/style/css'const app = createApp(App)
app.component(ElButton.name, ElButton)
app.component(ElSelect.name, ElSelect)
app.mount('#app')
2.1.2 基礎組件示例
<template><div class="container"><el-row><el-button>默認按鈕</el-button><el-button type="primary">主要按鈕</el-button><el-button type="success">成功按鈕</el-button><el-button type="danger">危險按鈕</el-button></el-row><el-form :model="form" label-width="120px"><el-form-item label="用戶名"><el-input v-model="form.name"></el-input></el-form-item><el-form-item label="活動區域"><el-select v-model="form.region" placeholder="請選擇活動區域"><el-option label="上海" value="shanghai"></el-option><el-option label="北京" value="beijing"></el-option></el-select></el-form-item></el-form></div>
</template><script setup>
import { reactive } from 'vue'const form = reactive({name: '',region: ''
})
</script>
2.2 Element Plus主題定制
Element Plus支持通過CSS變量快速定制主題:
/* 在:root作用域下定義CSS變量 */
:root {--el-color-primary: #6b48ff;--el-color-success: #67c23a;--el-color-warning: #e6a23c;--el-color-danger: #f56c6c;--el-color-info: #909399;--el-font-size-base: 14px;
}
也可以通過SCSS變量進行深度定制:
// styles/element-variables.scss
@forward 'element-plus/theme-chalk/src/common/var.scss' with ($colors: ('primary': ('base': #6b48ff,),),
);// 導入Element Plus樣式
@use "element-plus/theme-chalk/src/index.scss" as *;
2.3 Element Plus的優缺點分析
優點:
- 組件豐富,覆蓋大部分中后臺場景
- 文檔詳盡,案例豐富
- 社區活躍度高,更新頻繁
- 基于Vue 3,支持Composition API
- 支持TypeScript和國際化
缺點:
- 默認樣式偏向簡約,設計感不如Ant Design
- 部分組件在移動端適配不佳
- 完整引入包體積較大
- 高級定制需要較深的SCSS知識
3. Ant Design Vue詳解
3.1 Ant Design Vue基礎使用
Ant Design Vue是螞蟻金服設計規范的Vue實現,提供了企業級UI設計語言和高質量組件。
3.1.1 安裝與引入
# 使用npm安裝
npm install ant-design-vue@next# 使用yarn安裝
yarn add ant-design-vue@next
完整引入:
// main.js
import { createApp } from 'vue'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'
import App from './App.vue'const app = createApp(App)
app.use(Antd)
app.mount('#app')
按需引入:
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import { Button, Select } from 'ant-design-vue'
import 'ant-design-vue/es/button/style/css'
import 'ant-design-vue/es/select/style/css'const app = createApp(App)
app.component(Button.name, Button)
app.component(Select.name, Select)
app.mount('#app')
3.1.2 基礎組件示例
<template><div class="container"><a-row><a-button>默認按鈕</a-button><a-button type="primary">主要按鈕</a-button><a-button type="dashed">虛線按鈕</a-button><a-button type="danger">危險按鈕</a-button></a-row><a-form :model="formState" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }"><a-form-item label="用戶名"><a-input v-model:value="formState.username" /></a-form-item><a-form-item label="部門"><a-select v-model:value="formState.department" placeholder="請選擇部門"><a-select-option value="技術部">技術部</a-select-option><a-select-option value="市場部">市場部</a-select-option></a-select></a-form-item></a-form></div>
</template><script setup>
import { reactive } from 'vue'const formState = reactive({username: '',department: undefined
})
</script>
3.2 Ant Design Vue主題定制
Ant Design Vue支持通過Less變量進行主題定制:
// vue.config.js
module.exports = {css: {loaderOptions: {less: {lessOptions: {modifyVars: {'primary-color': '#1DA57A','link-color': '#1DA57A','border-radius-base': '2px',},javascriptEnabled: true,},},},},
};
3.3 Ant Design Vue的優缺點分析
優點:
- 企業級設計語言,設計感強
- 組件豐富且質量高
- 設計規范完整,一致性好
- 提供完善的設計資源(Sketch、Figma)
- 大廠背景,質量有保障
缺點:
- 學習曲線相對較陡
- 包體積較大
- 定制主題比Element Plus復雜
- 有些組件使用方式與Vue風格不太一致
- Less依賴使配置略顯繁瑣
4. Vant詳解
4.1 Vant基礎使用
Vant是有贊前端團隊推出的移動端UI組件庫,專為移動應用場景設計。
4.1.1 安裝與引入
# 使用npm安裝
npm i vant# 使用yarn安裝
yarn add vant
完整引入:
// main.js
import { createApp } from 'vue';
import Vant from 'vant';
import 'vant/lib/index.css';
import App from './App.vue';const app = createApp(App);
app.use(Vant);
app.mount('#app');
按需引入(推薦,配合unplugin-vue-components自動導入):
// vite.config.js
import vue from '@vitejs/plugin-vue';
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';export default {plugins: [vue(),Components({resolvers: [VantResolver()],}),],
};
4.1.2 基礎組件示例
<template><div class="container"><van-button type="default">默認按鈕</van-button><van-button type="primary">主要按鈕</van-button><van-button type="success">成功按鈕</van-button><van-button type="danger">危險按鈕</van-button><van-form @submit="onSubmit"><van-cell-group inset><van-fieldv-model="username"name="用戶名"label="用戶名"placeholder="請輸入用戶名":rules="[{ required: true, message: '請填寫用戶名' }]"/><van-fieldv-model="password"type="password"name="密碼"label="密碼"placeholder="請輸入密碼":rules="[{ required: true, message: '請填寫密碼' }]"/></van-cell-group><div style="margin: 16px;"><van-button round block type="primary" native-type="submit">提交</van-button></div></van-form></div>
</template><script setup>
import { ref } from 'vue';
import { showToast } from 'vant';const username = ref('');
const password = ref('');
const onSubmit = (values) => {showToast('提交成功');
};
</script>
4.2 Vant主題定制
Vant提供了CSS變量方式進行主題定制:
:root {--van-primary-color: #1989fa;--van-success-color: #07c160;--van-danger-color: #ee0a24;--van-warning-color: #ff976a;--van-text-color: #323233;--van-border-radius: 4px;
}
4.3 Vant的優缺點分析
優點:
- 專為移動端設計,移動端適配完美
- 組件輕量化,性能出色
- 中文文檔詳盡,上手容易
- 組件風格統一,符合移動端交互習慣
- 更新頻繁,跟進Vue版本快
缺點:
- 主要針對移動端,桌面端使用有限
- 定制化程度不如桌面端框架
- 企業級組件相對較少
- 設計風格固定,對于特殊UI要求的項目不夠靈活
5. 三大框架性能對比
5.1 包體積對比
不同框架的包體積大小(完整引入版本):
// 包體積大小(KB)
const packageSizes = {"Element Plus": 2580,"Ant Design Vue": 3150,"Vant": 1620
};
5.2 渲染性能對比
基于1000個組件同時渲染的場景下的平均渲染時間(毫秒):
// 渲染性能(毫秒,越低越好)
const renderPerformance = {"Element Plus": 380,"Ant Design Vue": 420,"Vant": 210
};
5.3 按需加載優化
三個框架都支持組件按需加載,可有效減少生產環境的包體積:
// 按需加載后的包體積減少百分比
const lazyLoadImprovement = {"Element Plus": "65%","Ant Design Vue": "70%","Vant": "60%"
};
6. 項目實踐中的框架選擇
6.1 不同業務場景下的選擇建議
- 中后臺管理系統:Element Plus 或 Ant Design Vue
- 企業級應用:Ant Design Vue
- 移動端應用:Vant
- 輕量級桌面應用:Element Plus
- 快速原型開發:Element Plus
- 設計驅動的項目:Ant Design Vue
6.2 混合使用多個框架
在某些特殊場景下,可能需要混合使用多個UI框架。例如在一個同時包含管理后臺和H5頁面的項目中:
// main.js - 桌面端入口
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')// mobile.js - 移動端入口
import { createApp } from 'vue'
import Vant from 'vant'
import 'vant/lib/index.css'
import MobileApp from './MobileApp.vue'const mobileApp = createApp(MobileApp)
mobileApp.use(Vant)
mobileApp.mount('#mobile-app')
但混合使用會造成包體積增大,建議使用動態導入和路由懶加載優化:
// router.js
const Desktop = () => import('./views/Desktop.vue')
const Mobile = () => import('./views/Mobile.vue')const routes = [{path: '/admin',component: Desktop,// 動態加載Element PlusbeforeEnter: (to, from, next) => {import('element-plus').then(module => {app.use(module.default)next()})}},{path: '/mobile',component: Mobile,// 動態加載VantbeforeEnter: (to, from, next) => {import('vant').then(module => {app.use(module.default)next()})}}
]
7. 實戰案例
7.1 使用Element Plus開發后臺管理系統
<template><el-container><el-header><div class="logo">管理系統</div><el-menu mode="horizontal" :router="true" class="nav-menu"><el-menu-item index="/dashboard">首頁</el-menu-item><el-menu-item index="/users">用戶管理</el-menu-item><el-menu-item index="/products">產品管理</el-menu-item></el-menu><div class="user-info"><el-dropdown><span class="el-dropdown-link">管理員 <el-icon><arrow-down /></el-icon></span><template #dropdown><el-dropdown-menu><el-dropdown-item>個人信息</el-dropdown-item><el-dropdown-item>退出登錄</el-dropdown-item></el-dropdown-menu></template></el-dropdown></div></el-header><el-container><el-aside width="200px"><el-menu default-active="1" class="side-menu"><el-sub-menu index="1"><template #title><el-icon><location /></el-icon><span>導航一</span></template><el-menu-item index="1-1">選項1</el-menu-item><el-menu-item index="1-2">選項2</el-menu-item></el-sub-menu><el-menu-item index="2"><el-icon><document /></el-icon><span>導航二</span></el-menu-item></el-menu></el-aside><el-main><el-table :data="tableData" style="width: 100%"><el-table-column prop="date" label="日期" width="180" /><el-table-column prop="name" label="姓名" width="180" /><el-table-column prop="address" label="地址" /><el-table-column fixed="right" label="操作" width="120"><template #default><el-button type="text" size="small">編輯</el-button><el-button type="text" size="small">刪除</el-button></template></el-table-column></el-table><el-paginationlayout="prev, pager, next":total="100"@current-change="handlePageChange"/></el-main></el-container></el-container>
</template><script setup>
import { ref } from 'vue'
import { ArrowDown, Location, Document } from '@element-plus/icons-vue'const tableData = ref([{date: '2023-01-01',name: '張三',address: '北京市朝陽區'},{date: '2023-01-02',name: '李四',address: '上海市浦東新區'}
])const handlePageChange = (page) => {console.log('當前頁:', page)
}
</script><style scoped>
.el-header {display: flex;align-items: center;background-color: #409EFF;color: #fff;
}
.logo {font-size: 20px;font-weight: bold;margin-right: 20px;
}
.nav-menu {flex: 1;background-color: transparent;
}
.user-info {margin-left: 20px;
}
.el-dropdown-link {color: #fff;cursor: pointer;
}
.side-menu {height: 100%;
}
</style>
7.2 使用Vant開發移動端商城頁面
<template><div class="app"><van-nav-bar title="商品列表" left-arrow @click-left="onBack" /><van-search v-model="searchValue" placeholder="請輸入搜索關鍵詞" /><van-pull-refresh v-model="refreshing" @refresh="onRefresh"><van-listv-model:loading="loading":finished="finished"finished-text="沒有更多了"@load="onLoad"><van-cardv-for="item in goodsList":key="item.id":price="item.price":desc="item.desc":title="item.title":thumb="item.thumb"><template #footer><van-button size="mini">加入購物車</van-button><van-button size="mini" type="primary">立即購買</van-button></template></van-card></van-list></van-pull-refresh><van-tabbar v-model="activeTabbar"><van-tabbar-item icon="home-o">首頁</van-tabbar-item><van-tabbar-item icon="search">分類</van-tabbar-item><van-tabbar-item icon="cart-o" badge="2">購物車</van-tabbar-item><van-tabbar-item icon="user-o">我的</van-tabbar-item></van-tabbar></div>
</template><script setup>
import { ref } from 'vue';
import { showToast } from 'vant';const searchValue = ref('');
const activeTabbar = ref(0);
const loading = ref(false);
const finished = ref(false);
const refreshing = ref(false);
const goodsList = ref([]);const onBack = () => {showToast('返回上一頁');
};const onLoad = () => {// 模擬異步請求setTimeout(() => {const lastItem = goodsList.value.length;for (let i = 0; i < 10; i++) {goodsList.value.push({id: lastItem + i,title: `商品${lastItem + i + 1}`,desc: '商品描述信息',price: '199.99',thumb: 'https://fastly.jsdelivr.net/npm/@vant/assets/ipad.jpeg',});}loading.value = false;// 判斷是否已加載完成if (goodsList.value.length >= 40) {finished.value = true;}}, 1000);
};const onRefresh = () => {// 重置列表狀態finished.value = false;loading.value = true;goodsList.value = [];// 重新加載數據onLoad();refreshing.value = false;
};
</script><style>
.app {min-height: 100vh;padding-bottom: 50px;box-sizing: border-box;
}
</style>
8. 總結與最佳實踐
8.1 框架選擇建議
-
基于項目需求選擇:
- 中后臺管理系統 → Element Plus 或 Ant Design Vue
- 移動端應用 → Vant
- 設計風格要求高 → Ant Design Vue
- 簡潔快速開發 → Element Plus
-
考慮團隊熟悉度:
- 已有Element使用經驗 → Element Plus
- 熟悉Ant Design → Ant Design Vue
- 移動端開發經驗 → Vant
8.2 提升開發效率的最佳實踐
- 按需加載組件:使用自動導入插件減少手動引入的工作
- 封裝通用組件:基于UI框架二次封裝業務組件
- 主題定制:統一設計變量,創建一致的品牌體驗
- VS Code插件支持:使用相應組件庫的代碼提示插件
- 結合狀態管理:配合Pinia或Vuex管理復雜組件狀態
8.3 未來發展趨勢
- 組件庫更加輕量化:按需引入和Tree Shaking優化
- Composition API支持增強:更好地支持Vue 3特性
- TypeScript集成深化:類型定義更加完善
- 設計系統生態完善:更強大的設計工具和資源
- 跨框架組件:同時支持Vue、React等多框架的組件庫崛起
結語
感謝您的閱讀!期待您的一鍵三連!歡迎指正!