Для использования Gridstack.js в проекте на Vue.js требуется подключить саму библиотеку и её стили. Обычно это делается через npm:
npm install gridstack
npm install gridstack-vue
После установки подключение в компоненте Vue выглядит следующим образом:
import { GridStack } from 'gridstack';
import 'gridstack/dist/gridstack.min.css';
Для Vue 3 существует официальная обёртка gridstack-vue,
которая позволяет использовать компоненты <GridStack>
и <GridStackItem> как нативные Vue-компоненты.
import { GridStack, GridStackItem } from 'gridstack-vue';
Регистрация компонентов в components:
export default {
components: {
GridStack,
GridStackItem
}
}
Gridstack.js использует контейнер сетки и элементы, которые располагаются внутри неё. В Vue это выглядит следующим образом:
<template>
<GridStack :options="gridOptions">
<GridStackItem v-for="item in items" :key="item.id" :gs-x="item.x" :gs-y="item.y" :gs-w="item.w" :gs-h="item.h">
<div class="grid-item-content">
{{ item.content }}
</div>
</GridStackItem>
</GridStack>
</template>
<script>
export default {
data() {
return {
gridOptions: {
float: true,
cellHeight: 80,
margin: 10,
},
items: [
{ id: 1, x: 0, y: 0, w: 2, h: 2, content: 'Элемент 1' },
{ id: 2, x: 2, y: 0, w: 2, h: 2, content: 'Элемент 2' },
]
}
}
}
</script>
Ключевые моменты:
:gs-x, :gs-y — позиция элемента в сетке по
координатам.:gs-w, :gs-h — размеры элемента в ячейках
сетки.gridOptions позволяет задавать поведение всей сетки:
float, cellHeight, margin и
др.Gridstack.js поддерживает множество событий, которые позволяют реагировать на перемещение, изменение размеров или удаление элементов. В Vue.js их можно подключать через директивы или методы компонента.
<GridStack ref="grid" :options="gridOptions" @change="onChange">
</GridStack>
<script>
export default {
methods: {
onChange(event, items) {
console.log('Состояние сетки изменилось:', items);
}
}
}
</script>
Важные события:
added — добавление нового элемента.removed — удаление элемента.change — изменение позиции или размеров элемента.Gridstack.js позволяет динамически добавлять элементы без перезагрузки страницы. В Vue.js это реализуется через реактивные данные:
<button @click="addItem">Добавить элемент</button>
<script>
export default {
data() {
return {
items: []
}
},
methods: {
addItem() {
const id = this.items.length + 1;
this.items.push({ id, x: 0, y: 0, w: 2, h: 2, content: `Элемент ${id}` });
},
removeItem(id) {
this.items = this.items.filter(item => item.id !== id);
}
}
}
</script>
Элементы автоматически добавляются в сетку благодаря реактивности Vue.
Gridstack.js предоставляет множество опций для тонкой настройки сетки:
Пример конфигурации:
gridOptions: {
cellHeight: 100,
margin: 8,
float: true,
disableResize: false,
disableDrag: false,
animate: true
}
Для прямого управления сеткой и элементами можно использовать
экземпляр Gridstack через ref:
<GridStack ref="grid" :options="gridOptions">
</GridStack>
<script>
export default {
mounted() {
const grid = this.$refs.grid.grid; // доступ к экземпляру GridStack
grid.addWidget('<div><div class="grid-item-content">Новый элемент</div></div>', { x: 0, y: 0, w: 2, h: 2 });
}
}
</script>
Основные методы API:
addWidget(el, opts) — добавить новый элемент.removeWidget(el) — удалить элемент.makeWidget(el) — сделать существующий элемент
сеточным.batchUpdate() / commit() — группировка
изменений для оптимизации перерисовки.serialize() — получить текущее состояние сетки в виде
массива объектов.Каждый элемент Gridstack можно стилизовать через CSS. Для Vue
рекомендуется оборачивать содержимое в
<div class="grid-item-content"> и использовать
локальные или глобальные стили:
.grid-item-content {
background-color: #f0f0f0;
border: 1px solid #ccc;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
}
Для динамического изменения классов можно использовать
:class или :style внутри
<GridStackItem>.
Gridstack.js поддерживает адаптивность через настройку
minWidth, maxWidth и использование
responsiveGrid:
gridOptions: {
cellHeight: 80,
margin: 10,
float: true,
column: 12,
disableOneColumnMode: false
}
column задаёт количество колонок.disableOneColumnMode отключает переход в режим одной
колонки на малых экранах.Элементы автоматически перестраиваются при изменении ширины контейнера, сохраняя пропорции и расположение.
Для больших проектов полезно хранить состояние сетки в глобальном хранилище:
// В store
state: {
gridItems: []
},
mutations: {
setItems(state, items) { state.gridItems = items; }
},
actions: {
addItem({ commit, state }, item) {
commit('setItems', [...state.gridItems, item]);
}
}
В компоненте Vue данные сетки становятся реактивными, и любые изменения в хранилище автоматически отображаются в сетке Gridstack.
batchUpdate() и commit() при
массовом добавлении элементов.Эти подходы позволяют построить полностью интерактивные, динамичные и адаптивные дашборды и интерфейсы на Vue.js с использованием возможностей Gridstack.js, сохраняя высокую производительность и управляемость состояния.