Element Plus предоставляет компонент ElTable, который широко используется для отображения больших массивов данных в интерфейсах. Одной из ключевых задач при работе с таблицами является оптимизация производительности при загрузке и обновлении данных. Кэширование данных позволяет уменьшить количество сетевых запросов, ускорить рендеринг и обеспечить плавную работу с большими таблицами.
Кэш на уровне компонента
ref или
reactive для хранения полученного массива.import { ref, onMounted } from 'vue';
import { ElTable } from 'element-plus';
export default {
setup() {
const tableData = ref([]);
const fetchData = async () => {
const response = await fetch('/api/items');
tableData.value = await response.json();
};
onMounted(fetchData);
return { tableData };
}
};
Особенность: повторный рендер таблицы использует уже загруженные данные, что сокращает количество запросов к серверу.
Кэш на уровне Vuex или Pinia
import { defineStore } from 'pinia';
export const useTableStore = defineStore('table', {
state: () => ({
cachedData: []
}),
actions: {
async fetchTableData() {
if (this.cachedData.length === 0) {
const response = await fetch('/api/items');
this.cachedData = await response.json();
}
return this.cachedData;
}
}
});
Преимущество: экономия ресурсов и согласованность данных между разными компонентами.
При работе с пагинацией целесообразно кэшировать страницы отдельно, чтобы при переходе назад не выполнять повторный запрос. Для этого можно использовать объект, где ключ — номер страницы, а значение — данные.
const pageCache = reactive({});
const fetchPage = async (page) => {
if (!pageCache[page]) {
const response = await fetch(`/api/items?page=${page}`);
pageCache[page] = await response.json();
}
return pageCache[page];
};
Рекомендация: лимитировать размер кэша или использовать стратегию LRU (Least Recently Used) для предотвращения чрезмерного потребления памяти.
Виртуализация строк
import VirtualTable from 'vue-virtual-table';
<virtual-table :data="tableData" :row-height="40">
<template #default="{ row }">
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
</tr>
</template>
</virtual-table>
Декларативное обновление
splice, map или
реактивные присваивания для сохранения реактивности.const originalData = ref([]);
const filteredData = computed(() => {
return originalData.value
.filter(item => item.status === 'active')
.sort((a, b) => a.name.localeCompare(b.name));
});
Автоматическое обновление
setInterval(fetchData, 30000); — обновление
каждые 30 секунд.Обновление по событию
Кэширование данных в Element Plus существенно повышает производительность, уменьшает сетевую нагрузку и улучшает UX при работе с большими таблицами. Правильная стратегия кэширования — это сочетание реактивности Vue, контроля объема кэша и эффективного обновления данных.