Vue: таблица с группировкой рядом стоящих строк с одинаковым значением

от автора

в
Время чтения: 2 мин.

Для создания компонента Vue, который выводит элементы в таблицу с возможностью группировки рядом стоящих строк, можно использовать следующий подход:

  1. Создадим компонент GroupedTable, который будет принимать массив items и имя свойства, по которому будет происходить группировка.
  2. Внутри компонета будем проходить по массиву items и формировать новый массив, в который будем добавлять строки для группировки, если значение свойства для группировки изменилось.

Пример реализации:

<template>
  <table>
    <thead>
      <tr>
        <th>Name</th>
        <th>Category</th>
        <th>Value</th>
      </tr>
    </thead>
    <tbody>
      <template v-for="(item, index) in groupedItems">
        <tr v-if="item.isGroupHeader" class="group-header">
          <td colspan="3">{{ item.groupValue }}</td>
        </tr>
        <tr v-else>
          <td>{{ item.name }}</td>
          <td>{{ item.category }}</td>
          <td>{{ item.value }}</td>
        </tr>
      </template>
    </tbody>
  </table>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true
    },
    groupBy: {
      type: String,
      required: true
    }
  },
  computed: {
    groupedItems() {
      const grouped = [];
      let lastGroupValue = null;

      this.items.forEach(item => {
        const currentGroupValue = item[this.groupBy];

        if (currentGroupValue !== lastGroupValue) {
          grouped.push({
            isGroupHeader: true,
            groupValue: currentGroupValue
          });
          lastGroupValue = currentGroupValue;
        }

        grouped.push(item);
      });

      return grouped;
    }
  }
};
</script>

<style>
.group-header {
  background-color: #f0f0f0;
  font-weight: bold;
}
</style>

Как это работает:

  1. Props:
    • items: Массив объектов, которые нужно отобразить в таблице.
    • groupBy: Имя свойства, по которому будет происходить группировка.
  2. Computed Property groupedItems:
    • Проходим по массиву items и проверяем, изменилось ли значение свойства, по которому происходит группировка.
    • Если значение изменилось, добавляем строку-заголовок группы в массив grouped.
    • После этого добавляем текущий элемент в массив grouped.
  3. Template:
    • Используем v-for для отображения элементов массива groupedItems.
    • Если элемент является заголовком группы (isGroupHeader: true), отображаем строку с заголовком группы, которая занимает всю ширину таблицы.
    • Иначе отображаем обычную строку таблицы с данными.
  4. Стили:
    • Добавляем стиль для строки-заголовка группы, чтобы она выделялась.

Пример использования компонента:

<template>
  <div>
    <GroupedTable :items="items" groupBy="category" />
  </div>
</template>

<script>
import GroupedTable from './GroupedTable.vue';

export default {
  components: {
    GroupedTable
  },
  data() {
    return {
      items: [
        { name: 'Item 1', category: 'Category A', value: 10 },
        { name: 'Item 2', category: 'Category A', value: 20 },
        { name: 'Item 3', category: 'Category B', value: 30 },
        { name: 'Item 4', category: 'Category B', value: 40 },
        { name: 'Item 5', category: 'Category C', value: 50 }
      ]
    };
  }
};
</script>

В этом примере таблица будет сгруппирована по категориям, и перед каждой группой будет отображаться строка с названием категории.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 9 + 8?