A grid layout for Vue.js using CSS Grid Layout.
This library was created since both vue-grid-layout and gridstack.js didn’t fit the requirements for the use in the AAC application AsTeRICS Grid. The main features are:
[!NOTE]
Currently only Vue2.7is supported, but it should be no problem to make the library compatible with Vue 3
There are the following examples (see folder examples):
To use this library via npm and with Vue’s Single-File Components (SFC), follow these steps:
First install via npm install vue-css-grid-layout --save or yarn add vue-css-grid-layout.
Create a custom component for rendering a single grid element like this, e.g. as render-component.vue:
<template>
<div class="render-component"></div>
</template>
<script>
export default {
props: {
element: Object
}
}
</script>
<style scoped>
.render-component {
border: 1px solid black;
display: flex;
flex-grow: 1;
}
</style>
Use GridLayout from this library in order to render a grid:
<template>
<grid-layout :elements="elements" :render-component="RenderComponent"/>
</template>
<script>
import { GridLayout } from 'vue-css-grid-layout';
import RenderComponent from './render-component.vue';
export default {
components: { GridLayout, RenderComponent},
data() {
return {
RenderComponent: RenderComponent,
elements: [
{ x: 0, y: 0, width: 1, height: 1, id: 1 },
{ x: 1, y: 1, width: 1, height: 1, id: 2 }
]
}
}
}
</script>
<style src="vue-css-grid-layout/dist/vue-css-grid-layout.css"></style>
You can also use the files from CDN (or use the files from the dist folder of this repository).
Include the CSS:
<link rel="stylesheet" href="https://unpkg.com/vue-css-grid-layout/dist/vue-css-grid-layout.css">
Create some HTML using the grid-layout element`:
<div id="app">
<grid-layout :elements="elements" render-component="render-component"/>
</div>
Import the GridLayout class in a script and use it:
<script type="module">
import { GridLayout } from 'https://unpkg.com/vue-css-grid-layout/dist/vue-css-grid-layout.es.js';
Vue.component('render-component', {
template: '<div class="render-component"></div>',
props: {
element: Object
}
});
new Vue({
el: '#app',
components: { GridLayout },
data() {
return {
elements: [
{ x: 0, y: 0, width: 1, height: 1, id: 1 },
{ x: 1, y: 1, width: 1, height: 1, id: 2 }
]
};
}
});
</script>
See minimum-example.html for the full example.
There are two components that can be used:
GridLayout: the Vue component rendering a grid using CSS GridgridLayoutUtil: a collection of utils for actions on the grid elements, e.g. collision handling or moving multiple elements. This component is used internally by GridLayout, but can also be used externally for manual collision handling or moving of multiple elements.The GridLayout Vue component has the following props and events.
renderComponent: [Object, String]: a Vue component that renders a single element of the grid. A prop element is passed to this component containing the data of the current element to render.elements: Array: an array of elements to render in the grid. Every element must have the properties id, x, y, width, height where the id must be unique. The single elements are passed to renderComponent as prop element.rows: Number: the minimum number of rows of the grid. Actual shown rows are the maximum of rows and rows defined by given elements.columns: Number: the minimum number of columns of the grid. Actual shown columns are the maximum of columns and columns defined by given elements.backgroundColor: String: the background color of the grid in any format valid in CSS (e.g. lightblue or #f5f5f5).baseTag: String: the name of the HTML tag the base element of the grid should have, e.g. div, defaults to an ordered list (ol).elementTag: String: the name of the HTML tag the grid elements should have, e.g. div, defaults to a list item (li).editable: Boolean: if true the grid can be edited, elements can be dragged and resized.resizeHandleSelector: String: a CSS selector for selecting resize handles (at the bottom right) of the elements which make it clearer / easier to resize elements. Resize handles have to be added to the renderComponent, if desired.backgroundLines: Boolean: if true the grid shows lines in the background indicating the rows and columns of the gridanimationDurationMs: Number: the duration of the animations when elements are dragged / resized (editable: true), defaults to 200ms.Any additional props can be passed to GridLayout which are passed on to the renderComponent. So e.g. if passing some generic options to grid-layout like this:
<grid-layout :elements="elements" render-component="render-component" :generic-options="{ color: 'green' }"/>
These options can be used within the render-component along with the element passed by default:
props: {
element: Object,
genericOptions: Object
}
Two events can be emitted by GridLayout with editable: true:
changed (newElements): the event changed is emitted after the layout has changed by dragging or resizing. In the handler the rendered elements should be set to the new elements like this.elements = newElements.interacted (x,y): the event interacted is emitted after a click or tap anywhere on the grid returning the coordinates of this event. This makes it easily possible to create new elements at the position of the last user interaction.The component gridLayoutUtil can be used for manually doing actions on the grid elements like moving all elements or resolving conflicts.
Import it along with GridLayout, if needed:
import { GridLayout, gridLayoutUtil } from 'vue-css-grid-layout';
// or
import { GridLayout, gridLayoutUtil } from 'https://unpkg.com/vue-css-grid-layout/dist/vue-css-grid-layout.es.js';
These are the most important methods, for more details look at the JSDoc comments in the implementation:
gridLayoutUtil.moveAsPossible = function(allElements = [], moveElements = [], direction, options = {})
allElements: array of all elementsmoveElements: the elements to movedirection: the direction to move, see gridLayoutUtil.DIR_* or 1-4 (UP, RIGHT, DOWN, RIGHT)options.gridWidth standard width of the grid, can be overruled by given grid elementsoptions.gridHeight standard height of the grid, can be overruled by given grid elementsgridLayoutUtil.resolveCollisions = function(gridElements, newElement, options = {})
gridElements array of all grid elements (including newElement)newElement element changed / added (already at new position)This library was initially developed within a netidee project funding.
This library uses interact.js as dependency.