# جدول Table

جدول بيانات. يدعم الفرز (متحكمًا به / غير متحكَّم به)، وفلترة الأعمدة، وسحب عرض العمود، والترويسات متعددة المستويات (تضمين children بلا حدود)، والأعمدة الثابتة؛ وعند ضبط height يُفعَّل التمرير الافتراضي (rowHeight يجب أن يطابق ارتفاع الصف الفعلي).

جدول
<template>
  <div style="max-width: 760px">
    <p class="demo-note">size="small" + maxHeight + فرز افتراضي (defaultSortProp/defaultSortOrder) + فلترة</p>
    <LhTable
      :data="rows"
      :columns="columns"
      size="small"
      stripe
      border
      :max-height="200"
      row-key="name"
      default-sort-prop="dynasty"
      default-sort-order="asc"
      :default-filtered-values="{ dynasty: ['سونغ'] }"
    >
      <template #price="{ value }">
        <span style="color: var(--lh-primary-color); font-weight: 600">{{ value }}</span>
      </template>
    </LhTable>
    <p class="demo-note">عمود «السلالة» مُرتَّب تصاعديًا افتراضيًا ومُفلتر مسبقًا بـ«سونغ»؛ زر الفلترة في الترويسة يتيح تغيير الشرط.</p>
    <p class="demo-note" style="margin-top: 16px">ترويسة متداخلة (children) + سحب العرض resizable + formatter + sorter مخصص</p>
    <LhTable :data="rows2" :columns="groupColumns" border :height="180" :row-height="40" :sorter="dynastySorter">
      <template #price="{ value }">
        <span style="color: var(--lh-primary-color); font-weight: 600">{{ value }}</span>
      </template>
    </LhTable>
    <p class="demo-note">عمود «المنشأ» يُنسَّق عبر formatter إلى «محفوظ في القصر / شعبي»؛ وعمود «التقييم» قابل لسحب العرض (resizable).</p>
  </div>
</template>

<script>
export default {
  data: () => ({
    rows: [
      { name: 'المسافرون بين الجبال والوديان', dynasty: 'سونغ', price: 1800 },
      { name: 'الإقامة في جبال فوتشون', dynasty: 'يوان', price: 2600 },
      { name: 'ألف ميل من الأنهار والجبال', dynasty: 'سونغ', price: 3200 },
      { name: 'على ضفاف النهر في تشينغ مينغ', dynasty: 'سونغ', price: 1500 },
      { name: 'مأدبة هان شي زاي الليلية', dynasty: 'السلالات الخمس', price: 2100 },
    ],
    rows2: [
      { name: 'المسافرون بين الجبال والوديان', dynasty: 'سونغ', provenance: 'محفوظ في القصر', price: 1800 },
      { name: 'الإقامة في جبال فوتشون', dynasty: 'يوان', provenance: 'محفوظ في القصر', price: 2600 },
      { name: 'على ضفاف النهر في تشينغ مينغ', dynasty: 'سونغ', provenance: 'محفوظ في القصر', price: 1500 },
      { name: 'الحصان الأبيض الساطع ليلًا', dynasty: 'تانغ', provenance: 'شعبي', price: 980 },
    ],
    columns: [
      { prop: 'name', label: 'اللوحة', width: 160 },
      {
        prop: 'dynasty',
        label: 'السلالة',
        width: 120,
        sortable: true,
        filters: [
          { text: 'سونغ', value: 'سونغ' },
          { text: 'يوان', value: 'يوان' },
          { text: 'السلالات الخمس', value: 'السلالات الخمس' },
        ],
      },
      { prop: 'price', label: 'التقييم (عشر آلاف)', width: 140, align: 'right', slot: 'price' },
    ],
    groupColumns: [
      {
        label: 'معلومات المقتنيات',
        children: [
          { prop: 'name', label: 'اللوحة', width: 150 },
          {
            prop: 'provenance',
            label: 'المنشأ',
            width: 100,
            formatter: (r) => (r.provenance === 'محفوظ في القصر' ? 'محفوظ في القصر' : 'شعبي'),
          },
        ],
      },
      {
        label: 'التقييم',
        children: [
          { prop: 'dynasty', label: 'السلالة', width: 90, sortable: true },
          { prop: 'price', label: 'التقييم (عشر آلاف)', width: 130, align: 'right', resizable: true, slot: 'price' },
        ],
      },
    ],
  }),
  methods: {
    dynastySorter(a, b) {
      const order = ['تانغ', 'السلالات الخمس', 'سونغ', 'يوان']
      return order.indexOf(String(a.dynasty)) - order.indexOf(String(b.dynasty))
    },
  },
}
</script>

# Props

خاصية الوصف النوع الافتراضي
data بيانات الصفوف LhTableRow[] []
columns إعداد الأعمدة LhTableColumn[] []
height ارتفاع جسم الجدول (ضبطه يُفعِّل التمرير الافتراضي؛ الرقم بوحدة px) number \| string —
maxHeight أقصى ارتفاع في الوضع غير الافتراضي number \| string —
rowHeight ارتفاع الصف في التمرير الافتراضي (يجب أن يطابق الارتفاع الفعلي) number —
stripe / border خطوط السرد / حدود الخلايا boolean false
size الحجم 'small' \| 'default' \| 'large' 'default'
rowKey اسم حقل مفتاح الصف string —
defaultSortProp / defaultSortOrder عمود الفرز الافتراضي / الاتجاه string / LhTableSortOrder —
sorter دالة فرز مخصصة (a, b) => number —
resizable تفعيل سحب عرض العمود (يتطلب أيضًا resizable على مستوى العمود، وأن يكون للعمود width رقمي) boolean false
defaultFilteredValues حالة الفلترة الافتراضية (غير متحكَّم بها، والمفاتيح هي prop الخاص بالعمود) Record<string, (string \| number)[]> —
filteredValues حالة الفلترة المتحكَّم بها (:filtered-values.sync) Record<string, (string \| number)[]> —
sx خاصية sx المختصرة للتخطيط — —

# Events

sortChange ({ prop, order }) و filterChange ({ prop, values }) و columnResize ({ prop, width }) و update:filteredValues و rowClick (row, index)

# Slots

فتحة الوصف
<اسم slot العمود> خلية مخصصة، مع المعاملات النطاقية { row, column, index, value } (يُحدَّد العمود عبر column.slot)
empty المحتوى عند انعدام البيانات (الافتراضي: 「暂无数据」)

# إمكانية الوصول

الترويسة role="row" + aria-sort للأعمدة القابلة للفرز، وجسم الجدول role="row"؛ لوحة الفلترة role="menu"، ومقابض سحب العرض تحمل aria-label و tabindex، مع دعم ضبط العرض عبر لوحة المفاتيح.

Copyright © 2024-2026 FengMo WenXue