Vue.js: مكتبات واجهة المستخدم

آخر تحديث: 2026-08-26

تتيح لك مكتبة مكونات واجهة المستخدم تجنب إعادة اختراع العجلة — حيث يمكن استخدام المكونات الشائعة مثل «Button» و«Table» و«Form» و«Modal» ببضع أسطر من الكود فقط. يضم نظام Vue 3 أكثر من خمس مكتبات رئيسية لواجهة المستخدم (Element Plus وNaive UI وVuetify وPrimeVue وAnt Design Vue)، ويمكن أن يوفر لك اختيار المكتبة المناسبة 50% من وقت التطوير.

عند اختيار مكتبة واجهة المستخدم، هناك خمسة عوامل رئيسية يجب أخذها في الاعتبار: تنوع المكونات / دعم TypeScript / تخصيص السمات / حجم الحزمة / نشاط المجتمع. سيساعدك هذا الدرس على اتخاذ القرار الصحيح.

1. ما ستتعلمه



2. كابوس مكون «5 طاولات» يتكرر 5 مرات

(1) المشكلة: الاضطرار إلى كتابة كل جدول من الصفر

كان لدى المسؤول عن حساب أليس 5 طرق عرض مختلفة للجدول، تم إنشاؤها جميعًا من الصفر:

VUE
<!-- ❌ 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 أماكن

VUE
<!-- ✅ 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:



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) التثبيت

BASH
npm install element-plus @element-plus/icons-vue

(2) التسجيل العالمي (بسيط)

JS
// 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% من الحجم)

BASH
npm install -D unplugin-vue-components unplugin-auto-import
TS
// 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'
    })
  ]
})
VUE
<!-- ✅ 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 مكونات أساسية

VUE
<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 (موصى به)

SCSS
// 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;
}
JS
// main.js
import './styles/element-plus.scss'
import 'element-plus/dist/index.css'

(2) متغيرات SCSS (التخصيص المتقدم)

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)
  )
);
JS
// main.js
import './styles/element-plus-vars.scss'
import 'element-plus/dist/index.css'

(3) الوضع المظلم

SCSS
// 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) مثال على مكون الأعمال

VUE 📖 للعرض فقط
<!-- 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>
45 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)
VUE
<!-- Usage:3 All set 1 A table -->
<BusinessTable :data="orders" :columns="orderColumns" :total="100" />

(2) 5 فوائد رئيسية للتغليف



7. دمج مكتبة الرموز

(1) التثبيت

BASH
npm install -D unplugin-icons @iconify-json/carbon

(2) التهيئة

TS
// 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) الاستخدام

VUE
<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. المكونات الأساسية الخمسة الرئيسية

VUE
<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. تخصيص الموضوعات الخمسة الرئيسية

SCSS
// 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


❓ أسئلة شائعة

س أي من مكتبات واجهة المستخدم الخمس الأبرز يجب أن أختار؟
ج بالنسبة لواجهات الخلفية والإدارة الداخلية → Element Plus (الأكثر شيوعًا). بالنسبة لخدمات SaaS الحديثة → Naive UI (صغيرة الحجم لكن أنيقة). بالنسبة للتطبيقات ذات نمط Material → Vuetify. بالنسبة لمنظومة Ant Design → Ant Design Vue.
س الاستيراد الكامل أم الاستيراد حسب الحاجة؟
ج الاستيراد الكامل بسيط، لكنه ينتج عنه حزمة كبيرة الحجم (500 كيلوبايت). نوصي باستخدام الاستيراد حسب الحاجة (unplugin-vue-components)، الذي يقلل الحجم بنسبة 50٪.
س كيف يمكنني تغيير ألوان سمة Element Plus؟
ج قم بتجاوز متغير CSS --el-color-primary. لتخصيص متغيرات SCSS، عليك ترجمة السمة باستخدام المكون الإضافي unplugin-element-plus.
س هل يدعم Element Plus لغة TypeScript بشكل كامل؟
ج نعم. تمت إعادة كتابة Element Plus 2.x بالكامل بلغة TypeScript، وهو يوفر استدلالًا كاملاً للأنواع.
س هل يمكن الجمع بين مكتبات واجهة المستخدم (على سبيل المثال، Element Plus + Naive UI)؟
ج من الناحية الفنية، نعم، لكن حل تعارضات الأنماط قد يكون صعبًا. لا نوصي بالجمع بينها؛ بل ننصح باختيار مكتبة رئيسية واحدة ومكتبة خفيفة الوزن (على سبيل المثال، Element Plus + Headless UI).
س unplugin-vue-components مقابل التسجيل العام؟
ج يقوم unplugin باستيراد المكونات تلقائيًا عند الحاجة، مما يؤدي إلى حزمة أصغر حجمًا بنسبة 50٪. التسجيل العام بسيط ولكنه يؤدي إلى حزمة أكبر حجمًا. نوصي بالتحميل عند الحاجة.
س كيف أختار مكتبة أيقونات؟
ج Iconify (أكثر من 200,000 أيقونة موزعة على مجموعات متعددة) + unplugin-icons حسب الحاجة. بدون أي عبء إضافي على وقت التشغيل.

📖 ملخص


📝 تمارين

  1. أسئلة أساسية (مستوى الصعوبة: ⭐)

    دمج Element Plus في مشروع Vue 3:

    • التثبيت + الاستيراد حسب الطلب
    • 5 مكونات أساسية (زر / نموذج / جدول / مربع حوار / رسالة)
    • تغيير لون السمة إلى اللون الأساسي للمشروع
  2. مسائل متقدمة (مستوى الصعوبة: ⭐⭐)

    تنفيذ التكامل الكامل مع Element Plus:

    • 5 عناصر متكاملة (زر / نموذج / جدول / مربع حوار / رسالة)
    • تشغيل/إيقاف «الوضع الداكن»
    • أيقونات Iconify (10 أيقونات مختلفة)
    • إعادة تغليف مكون BusinessTable
  3. مسألة التحدي (مستوى الصعوبة: ⭐⭐⭐)

    تحقيق «التكامل الكامل لمكتبة واجهة المستخدم على مستوى المؤسسة»:

    1. مزيج من Element Plus و Naive UI (الأساسي + الثانوي)
    2. 5 ألوان رئيسية (الأساسية / الثانوية / النجاح / التحذير / الخطر)
    3. الوضع المظلم + نظام المتابعة التلقائية
    4. أكثر من 10 مكونات تجارية للتغليف الثانوي
    5. تحويل أكثر من 200,000 رمز إلى أيقونات
    6. التعيين القوي للأنواع في TypeScript
    7. تحسين الأداء (حسب الطلب + «ترجيد الشجرة» + شبكة توزيع المحتوى (CDN))
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%