Vue.js: مكتبات واجهة المستخدم
آخر تحديث: 2026-08-26
تتيح لك مكتبة مكونات واجهة المستخدم تجنب إعادة اختراع العجلة — حيث يمكن استخدام المكونات الشائعة مثل «Button» و«Table» و«Form» و«Modal» ببضع أسطر من الكود فقط. يضم نظام Vue 3 أكثر من خمس مكتبات رئيسية لواجهة المستخدم (Element Plus وNaive UI وVuetify وPrimeVue وAnt Design Vue)، ويمكن أن يوفر لك اختيار المكتبة المناسبة 50% من وقت التطوير.
عند اختيار مكتبة واجهة المستخدم، هناك خمسة عوامل رئيسية يجب أخذها في الاعتبار: تنوع المكونات / دعم TypeScript / تخصيص السمات / حجم الحزمة / نشاط المجتمع. سيساعدك هذا الدرس على اتخاذ القرار الصحيح.
1. ما ستتعلمه
- مقارنة بين 5 مكتبات واجهة مستخدم لـ Vue 3 (Element Plus / Naive UI / Vuetify / PrimeVue / Ant Design Vue)
- الاستيراد عند الطلب (unplugin-vue-components)
- تخصيص القوالب (متغيرات CSS / متغيرات SCSS)
- التغليف الثانوي للمكونات (مصمم خصيصًا لتلبية احتياجات الأعمال)
- دمج مكتبة الرموز (@iconify / unplugin-icons)
- 5 أخطاء شائعة
2. كابوس مكون «5 طاولات» يتكرر 5 مرات
(1) المشكلة: الاضطرار إلى كتابة كل جدول من الصفر
كان لدى المسؤول عن حساب أليس 5 طرق عرض مختلفة للجدول، تم إنشاؤها جميعًا من الصفر:
<!-- ❌ The "Broken" Version:5 A table,5 Different code snippets -->
<!-- OrdersTable.vue -->
<template>
<table>
<thead><tr><th>ID</th><th>User</th><th>Total</th></tr></thead>
<tbody>
<tr v-for="order in orders" :key="order.id">
<td>{{ order.id }}</td>
<td>{{ order.user }}</td>
<td>${{ order.total }}</td>
</tr>
</tbody>
</table>
</template>
<!-- ProductsTable.vue - Similar -->
<!-- UsersTable.vue - Similar -->
<!-- ... And also 3 more ... -->
5 جداول × 200 صفًا = 1,000 سطر من الكود المكرر. في كل مرة تقوم فيها بتغيير نمط واحد، يتعين عليك إجراء 5 تغييرات.
(2) حل مكتبة مكونات واجهة المستخدم: جدول واحد (el-table)، أعيد استخدامه في 5 أماكن
<!-- ✅ Correct Version: Use Element Plus el-table -->
<template>
<el-table :data="orders" stripe>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="user" label="User" />
<el-table-column prop="total" label="Total" :formatter="formatTotal" />
</el-table>
</template>
<script setup>
import { ElTable, ElTableColumn } from 'element-plus'
const orders = ref([...])
function formatTotal(row) { return `$${row.total}` }
</script>
1 جدول، تم إعادة استخدامه في 5 أماكن. تتميز جميع الجداول بنمط موحد وتفاعلية متسقة.
(3) الإيرادات
بعد استخدام Element Plus:
- حجم الكود: 1,000 سطر → 200 سطر (-80%)
- اتساق الأسلوب: متسق بنسبة 100%
- جدول جديد: قالب مكون من صف واحد
- TypeScript: استدلال الأنواع الكامل
- إمكانية الوصول: إمكانية الوصول المدمجة
3. مقارنة بين أفضل 5 مكتبات واجهة المستخدم لـ Vue 3
(1) دليل مرجعي سريع لقواعد البيانات الخمس الرئيسية
| المكتبة | النمط | عدد المكونات | حجم الحزمة | TypeScript | التوافق |
|---|---|---|---|---|---|
| Element Plus | سطح المكتب | 80+ | ~250 كيلوبايت | ✅ | الأكثر شعبية في الصين، الخلفية |
| واجهة مستخدم بسيطة | سطح المكتب | 80+ | ~150 كيلوبايت | ✅ | نمط حديث، يُفضل استخدام Vue 3 |
| Vuetify | Material | 80+ | ~300 كيلوبايت | ✅ | تطبيقات بتصميم Material |
| PrimeVue | أنماط متعددة | 90+ | ~200 كيلوبايت | ✅ | مجموعة متنوعة من القوالب ومكونات شاملة |
| Ant Design Vue | Ant Design | 70+ | ~180 كيلوبايت | ✅ | نمط Ant Design، مخصص للمؤسسات |
(2) مقارنة تفصيلية عبر 5 أبعاد
| الجانب | Element Plus | Naive UI | Vuetify | PrimeVue | Ant Design Vue |
|---|---|---|---|---|---|
| GitHub ⭐ | 24 ألف+ | 16 ألف+ | 40 ألف+ | 11 ألف+ | 20 ألف+ |
| Vue 3: مواطن من الدرجة الأولى | ✅ | ✅ | ✅ | ✅ | ✅ |
| TypeScript | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| تخصيص القوالب | متغيرات CSS | متغيرات CSS | SCSS | SCSS + القالب | LESS + القالب |
| حجم الحقيبة | متوسط | صغير | كبير | متوسط | متوسط |
| الوثائق باللغة الصينية | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| النشاط المجتمعي | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| منحنى التعلم | سهل | سهل | متوسط | متوسط | متوسط |
(3) 5 نصائح أساسية لاختيار المفتاح
| السيناريو | التوصية |
|---|---|
| أنظمة الدعم الإداري المحلية (التجارة الإلكترونية/إدارة علاقات العملاء/تخطيط موارد المؤسسات) | Element Plus ⭐⭐⭐⭐⭐ |
| خدمة SaaS ذات طابع عصري | واجهة مستخدم بسيطة ⭐⭐⭐⭐ |
| تطبيقات Material Design | Vuetify ⭐⭐⭐⭐ |
| أنماط عرض متعددة (داكن/فاتح/تباين عالٍ) | PrimeVue ⭐⭐⭐⭐ |
| منظومة Ant Design | Ant Design Vue ⭐⭐⭐⭐ |
4. تطبيق «إليمنت بلس» عمليًّا
(1) التثبيت
npm install element-plus @element-plus/icons-vue
(2) التسجيل العالمي (بسيط)
// main.js
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import App from './App.vue'
const app = createApp(App)
app.use(ElementPlus)
// Register All Icons
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
}
app.mount('#app')
(3) الاستيراد عند الطلب (موصى به؛ يوفر 50% من الحجم)
npm install -D unplugin-vue-components unplugin-auto-import
// vite.config.ts
import AutoImport from 'unplugin-auto-import'
import Components from 'unplugin-vue-components'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default defineConfig({
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()],
dts: 'src/auto-imports.d.ts'
}),
Components({
resolvers: [ElementPlusResolver()],
dts: 'src/components.d.ts'
})
]
})
<!-- ✅ Not required import,Automatic On-Demand Import -->
<template>
<el-button>Click</el-button>
<el-input v-model="search" />
<el-table :data="list">
<el-table-column prop="name" label="Name" />
</el-table>
</template>
(4) 5 مكونات أساسية
<template>
<!-- 1. Button -->
<el-button type="primary" @click="onClick">Primary</el-button>
<!-- 2. Form -->
<el-form :model="form" :rules="rules" ref="formRef">
<el-form-item label="Name" prop="name">
<el-input v-model="form.name" />
</el-form-item>
</el-form>
<!-- 3. Table -->
<el-table :data="list" stripe>
<el-table-column prop="name" label="Name" />
</el-table>
<!-- 4. Dialog -->
<el-dialog v-model="visible" title="Edit">
<p>Content</p>
</el-dialog>
<!-- 5. Message -->
<el-button @click="$message.success('Saved!')">Click</el-button>
</template>
5. تخصيص السمة
(1) تجاوزات متغيرات CSS (موصى به)
// src/styles/element-plus.scss
:root {
--el-color-primary: #42b883; // Change the primary color to Vue Green
--el-color-success: #67c23a;
--el-color-warning: #e6a23c;
--el-color-danger: #f56c6c;
--el-color-info: #909399;
--el-border-radius-base: 8px; // Increase Corner Radius
--el-font-size-base: 14px;
}
// main.js
import './styles/element-plus.scss'
import 'element-plus/dist/index.css'
(2) متغيرات SCSS (التخصيص المتقدم)
// src/styles/element-plus-vars.scss
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
$colors: (
'primary': ('base': #42b883),
'success': ('base': #67c23a),
'warning': ('base': #e6a23c),
'danger': ('base': #f56c6c),
'info': ('base': #909399)
)
);
// main.js
import './styles/element-plus-vars.scss'
import 'element-plus/dist/index.css'
(3) الوضع المظلم
// Dark Theme
:root {
--el-color-primary: #42b883;
--el-bg-color: #1a1a1a;
--el-text-color-primary: #ffffff;
}
html.dark {
--el-bg-color: #1a1a1a;
--el-text-color-primary: #ffffff;
}
6. التغليف الثانوي للمكونات
(1) مثال على مكون الأعمال
<!-- components/BusinessTable.vue -->
<template>
<el-table
:data="data"
v-loading="loading"
stripe
border
:max-height="maxHeight"
>
<el-table-column type="index" label="#" width="60" />
<el-table-column
v-for="col in columns"
:key="col.key"
:prop="col.key"
:label="col.label"
:width="col.width"
:formatter="col.formatter"
/>
</el-table>
<el-pagination
v-model:current-page="page"
v-model:page-size="size"
:total="total"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next"
@current-change="onPage"
@size-change="onSize"
/>
</template>
<script setup lang="ts">
// Business Encapsulation:Automatic loading + Pagination + Column Definition
const props = defineProps<{
data: any[]
columns: Array<{ key: string; label: string; width?: number; formatter?: Function }>
total: number
loading?: boolean
maxHeight?: number
}>()
const emit = defineEmits<{
'update:page': [page: number]
'update:size': [size: number]
}>()
const page = ref(1)
const size = ref(20)
function onPage(p) { emit('update:page', p) }
function onSize(s) { emit('update:size', s) }
</script>
<!-- Usage:3 All set 1 A table -->
<BusinessTable :data="orders" :columns="orderColumns" :total="100" />
(2) 5 فوائد رئيسية للتغليف
- تقليل تكرار الكود: أكثر من 50 جدولًا مشتركًا
- أسلوب موحد: جميع الجداول تتبع نفس الأسلوب
- التخصيص التجاري: التحميل التلقائي + ترقيم الصفحات + الstatus الفارغة
- TypeScript: الخصائص ذات الأنواع المحددة بدقة
- قابلية الصيانة: إذا تم إجراء تغيير في مكان واحد، فإنه يسري مفعوله في N أماكن
7. دمج مكتبة الرموز
(1) التثبيت
npm install -D unplugin-icons @iconify-json/carbon
(2) التهيئة
// vite.config.ts
import Icons from 'unplugin-icons/vite'
import { FileSystemIconLoader } from 'unplugin-icons/dist/loader'
export default defineConfig({
plugins: [
Icons({
compiler: 'vue3',
autoInstall: true, // Automatically Install Icon Sets
collections: {
carbon: () => import('@iconify-json/carbon/icons.json').then(i => i.default)
}
})
]
})
(3) الاستخدام
<template>
<!-- Carbon Icon (100,000+) -->
<IconCarbonUser size="20" />
<IconCarbonShoppingCart size="24" color="green" />
<IconCarbonTrashCan size="20" @click="delete" />
</template>
(4) مقارنة بين أفضل 5 مكتبات أيقونات
| المكتبة | عدد الرموز | طريقة التحميل | حجم الحزمة |
|---|---|---|---|
| Iconify | 200,000+ | حسب الطلب (موصى به) | 0 |
| أيقونات العناصر | 300+ | الكل / حسب الطلب | 100 كيلوبايت |
| أيقونات المواد | 2,000+ | جميعها / حسب الطلب | 300 كيلوبايت |
| Font Awesome | 7,000+ | الكل | 1 ميغابايت+ |
| Heroicons | 300+ | حسب الطلب | 50 كيلوبايت |
8. أمثلة كاملة: 5 سيناريوهات باستخدام مكتبات واجهة المستخدم الرئيسية
▶ مثال: 1. مقارنة بين أفضل 5 مكتبات واجهة المستخدم
| المكتبة | ⭐ | حجم الحزمة | النمط |
|---|---|---|---|
| Element Plus | 24k | متوسط | سطح المكتب |
| واجهة مستخدم بسيطة | 16 كيلوبايت | صغيرة | حديثة |
| Vuetify | 40 ألف | كبير | Material |
| PrimeVue | 11k | متوسط | أنماط متعددة |
| Ant Design Vue | 20 ألف | Medium | Ant Design |
▶ مثال: 2. المكونات الأساسية الخمسة الرئيسية
<el-button>Button</el-button>
<el-form>Form</el-form>
<el-table>Table</el-table>
<el-dialog>Dialog</el-dialog>
<el-message>Message</el-message>
▶ مثال: 3. تخصيص الموضوعات الخمسة الرئيسية
// 1. CSS Variable
:root { --el-color-primary: #42b883; }
// 2. SCSS Variable
@forward 'var.scss' with ($colors: ...);
// 3. Dark Mode
:root.dark { --el-bg-color: #1a1a1a; }
// 4. Custom Themes
@import 'element-plus/theme-chalk/dark/css-vars.css';
// 5. Change Theme(Runtime)
document.documentElement.classList.toggle('dark')
▶ مثال: 4. 5 مكتبات أيقونات رئيسية
| المكتبة | عدد الرموز |
|---|---|
| Iconify | أكثر من 200,000 |
| أيقونات العناصر | أكثر من 300 |
| المادة | 2,000+ |
| Font Awesome | 7,000+ |
| Heroicons | 300+ |
▶ مثال: 5. مرجع سريع لـ 5 أخطاء شائعة
| الخطأ | الأعراض | الحل |
|---|---|---|
| استيراد حزمة Baoda بالكامل | الحزمة 500 كيلوبايت | استخدام unplugin-vue-components عند الحاجة |
| لا يمكن تغيير لون السمة | استخدام SCSS | التبديل إلى متغيرات CSS |
| لا تظهر الرموز | فشل تحميل الخط | استخدام ملف SVG الخاص بـ unplugin-icons |
| خطأ في النوع TS | النوع مفقود في الاستيراد | قم بتثبيت حزمة @types |
| فشل الترجمة | الإعدادات الإقليمية غير الصحيحة | تهيئة i18n |
❓ أسئلة شائعة
--el-color-primary. لتخصيص متغيرات SCSS، عليك ترجمة السمة باستخدام المكون الإضافي unplugin-element-plus.📖 ملخص
- 5 مكتبات واجهة مستخدم لـ Vue 3: Element Plus / Naive UI / Vuetify / PrimeVue / Ant Design Vue
- يُعد «Element Plus» الأكثر شيوعًا في الصين، حيث يوفر مجموعة غنية من المكونات (أكثر من 80 مكونًا) ودعمًا لـ TypeScript
- الاستيراد حسب الطلب: unplugin-vue-components + ElementPlusResolver
- تخصيص القوالب: تجاوز متغيرات CSS (موصى به) + متغيرات SCSS (شرح متعمق)
- التغليف الثانوي: يقلل من تكرار الكود في مكونات الأعمال
- تحويل أكثر من 200,000 رمز إلى أيقونات + أيقونات unplugin-icons حسب الطلب
- 5 مكتبات أيقونات: Iconify / Element / Material / Font Awesome / Heroicons
📝 تمارين
-
أسئلة أساسية (مستوى الصعوبة: ⭐)
دمج Element Plus في مشروع Vue 3:
- التثبيت + الاستيراد حسب الطلب
- 5 مكونات أساسية (زر / نموذج / جدول / مربع حوار / رسالة)
- تغيير لون السمة إلى اللون الأساسي للمشروع
-
مسائل متقدمة (مستوى الصعوبة: ⭐⭐)
تنفيذ التكامل الكامل مع Element Plus:
- 5 عناصر متكاملة (زر / نموذج / جدول / مربع حوار / رسالة)
- تشغيل/إيقاف «الوضع الداكن»
- أيقونات Iconify (10 أيقونات مختلفة)
- إعادة تغليف مكون BusinessTable
-
مسألة التحدي (مستوى الصعوبة: ⭐⭐⭐)
تحقيق «التكامل الكامل لمكتبة واجهة المستخدم على مستوى المؤسسة»:
- مزيج من Element Plus و Naive UI (الأساسي + الثانوي)
- 5 ألوان رئيسية (الأساسية / الثانوية / النجاح / التحذير / الخطر)
- الوضع المظلم + نظام المتابعة التلقائية
- أكثر من 10 مكونات تجارية للتغليف الثانوي
- تحويل أكثر من 200,000 رمز إلى أيقونات
- التعيين القوي للأنواع في TypeScript
- تحسين الأداء (حسب الطلب + «ترجيد الشجرة» + شبكة توزيع المحتوى (CDN))