SwTable
Компонент SwTable представляет собой динамическую таблицу с поддержкой сложных заголовков, объединения ячеек и кастомизации содержимого через слоты.
Свойства / Properties
| Имя | Тип | По умолчанию | Значения/Описание |
|---|---|---|---|
data | Array | required | Содержание таблицы - обязательный массив объектов. |
Слоты / Slots
#<prop> - именованный слот для конкретной колонки (приоритет выше default). Доступные параметры: { row, $index, value }
#default - универсальный слот для всех колонок. Доступные параметры: { row, $index, column, value }
row- весь объект строки данных$index- индекс строки (начиная с 0)column- имя колонки (prop)value- значение ячейки
Пример использования / Example Usage
Базовый пример с вложенными колонками:
<script>
let table = [
{city:{label:'Moscow', rowspan:2},district:'Center',speed:{max:80,min:50,midl:70}},
{city:'Moscow',district:'MRCR',speed:{max:130,min:90,midl:120}},
]
</script>
<sw-table :data="table">
<sw-table-column label="Label">
<sw-table-column label="City" prop="city"/>
<sw-table-column label="District" prop="district"/>
</sw-table-column>
<sw-table-column label="Speed" prop="speed.midl"/>
</sw-table>
Пример с v-for для динамических колонок:
<script setup>
import { ref } from 'vue'
const columns = ref([
{ prop: 'name', label: 'Имя', width: '150px' },
{ prop: 'age', label: 'Возраст', width: '100px' },
{ prop: 'email', label: 'Email', width: '200px' }
])
const tableData = ref([
{ name: 'Иван', age: 25, email: 'ivan@example.com' },
{ name: 'Мария', age: 30, email: 'maria@example.com' },
{ name: 'Петр', age: 35, email: 'petr@example.com' }
])
</script>
<sw-table :data="tableData">
<sw-table-column
v-for="column in columns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:width="column.width"
/>
</sw-table>
Пример с кастомизацией через слоты:
<script setup>
import { ref } from 'vue'
const users = ref([
{ id: 1, name: 'Иван Петров', age: 25, status: 'active', email: 'ivan@example.com' },
{ id: 2, name: 'Мария Сидорова', age: 30, status: 'inactive', email: 'maria@example.com' },
{ id: 3, name: 'Петр Иванов', age: 35, status: 'active', email: 'petr@example.com' }
])
const deleteUser = (id) => {
console.log('Delete user:', id)
}
</script>
<sw-table :data="users">
<sw-table-column prop="name" label="Имя" />
<sw-table-column prop="age" label="Возраст" />
<sw-table-column prop="status" label="Статус" />
<sw-table-column prop="actions" label="Действия" width="150px" />
<!-- Именованный слот для конкретной колонки -->
<template #name="{ row, value }">
<strong>{{ value }}</strong>
</template>
<template #age="{ value }">
<span style="color: blue">{{ value }} лет</span>
</template>
<template #status="{ value }">
<span :style="{ color: value === 'active' ? 'green' : 'red' }">
{{ value === 'active' ? '✓ Активен' : '✗ Неактивен' }}
</span>
</template>
<!-- Default слот для колонки actions -->
<template #actions="{ row }">
<button @click="deleteUser(row.id)">Удалить</button>
<a :href="`mailto:${row.email}`">Написать</a>
</template>
</sw-table>
Пример с универсальным default слотом:
<script setup>
import { ref } from 'vue'
const products = ref([
{ name: 'Товар 1', price: 1000, quantity: 5 },
{ name: 'Товар 2', price: 2500, quantity: 3 },
{ name: 'Товар 3', price: 750, quantity: 10 }
])
</script>
<sw-table :data="products">
<sw-table-column prop="name" label="Название" />
<sw-table-column prop="price" label="Цена" />
<sw-table-column prop="quantity" label="Количество" />
<!-- Универсальный слот для всех колонок -->
<template #default="{ row, column, value }">
<span v-if="column === 'price'" style="font-weight: bold">
{{ value }} ₽
</span>
<span v-else-if="column === 'quantity' && value < 5" style="color: red">
{{ value }} ⚠️ Мало
</span>
<span v-else>{{ value }}</span>
</template>
</sw-table>
Пример с объединением ячеек (rowspan/colspan):
<script setup>
import { ref } from 'vue'
const complexData = ref([
{
city: { label: 'Москва', rowspan: 2 },
district: 'Центр',
population: 500000
},
{
city: 'Москва', // будет скрыта из-за rowspan
district: 'Север',
population: 300000
},
{
region: { label: 'Общая статистика', colspan: 2 },
total: 800000
}
])
</script>
<sw-table :data="complexData">
<sw-table-column label="Город" prop="city" />
<sw-table-column label="Район" prop="district" />
<sw-table-column label="Население" prop="population" />
</sw-table>