Vue Grid Layout -️ 适用 Vue.js 的栅格布局系统 (相关使用记录)
安装
npm install vue-grid-layout --save
或
yarn add vue-grid-layout
导入组件
import VueGridLayout from 'vue-grid-layout';
注册组件
export default {
components: {
GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem
},
// ... data, methods, mounted (), etc.
}
grid-layout 属性说明
属性名称 | 属性说明 |
---|
col-num | 画布占几列,默认 12 列 |
row-height | 每行的高度,默认 150px |
is-draggable | 是否允许拖拽布局中的单元格,默认 true |
is-resizable | 是否允许缩放布局中的单元格,默认 true |
max-rows | 定义最大行数,你把它设置成 1 拖拽试试就知道它的作用了 |
margin | 布局中单元格之间的间距,如果[10,10] |
responsive | 是否是响应式布局,比如大屏下显示 5 列,小屏幕下将会根据屏幕大小显示多少列。默认为 false |
is-mirrored | 镜像反转,就是布局是从左到右还是从右到左 |
auto-size | 布局的容器是否自动自动大小 |
vertical-compact | 是否开启垂直压缩,设置 true 或 false 试试看 |
prevent-collision | 防止碰撞,设置为 ture 时,单元格只能拖动到空白处 |
use-css-transforms | 否使用 CSS 属性 transition-property: transform |
breakpoints | 为响应式布局设置断点,默认为 { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 },里面的单位为像素 px |
cols | 设置每个断点对应的列数,默认{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }。 |
use-style-cursor | 是否使用动态鼠标指针样式,当拖动出现卡顿时,将此值设为 false 也许可以缓解布局问题。 |
grid-item 属性说明
属性名称 | 属性说明 |
---|
i | 单元格的 id,字符串类型 |
x | 单元格起始列 |
y | 单元格起始行 |
w | 单元格占几列 |
h | 单元格占几行 |
min-w | 单元格最小宽度占几列,缩放单元格时起作用 |
min-h | 单元格最小宽度占几行,缩放单元格时起作用 |
max-w | 单元格最大宽度占几列,缩放单元格时起作用 |
max-h | 单元格最大宽度占几行,缩放单元格时起作用 |
is-draggable | 单元格是否允许拖拽,如果为 null 取决父容器 |
is-resizable | 单元格是否允许缩放,如果为 null 取决父容器 |
static | 单元格是否是静态的,默认为 false,如果是那么无法缩放、拖动、被其他元素影响 |
drag-ignore-from | css 筛选器,设置那些元素无法触发拖拽事件,比如’a, button’ |
drag-allow-from | css 筛选器,那些元素可以触发拖拽事件,默认为 null,全部元素 |
resize-ignore-from | css 筛选器,那些元素无法触发调整大小事件 |
相关事件方法
<grid-layout
:layout="layout"
:col-num="12"
:row-height="30"
@layout-created="layoutCreatedEvent"
@layout-before-mount="layoutBeforeMountEvent"
@layout-mounted="layoutMountedEvent"
@layout-ready="layoutReadyEvent"
@layout-updated="layoutUpdatedEvent"
@breakpoint-changed="breakpointChangedEvent"
>
<grid-item
v-for="item in layout"
:x="item.x"
:y="item.y"
:w="item.w"
:h="item.h"
:i="item.i"
:key="item.i"
@resize="resizeEvent"
@move="moveEvent"
@resized="resizedEvent"
@container-resized="containerResizedEvent"
@moved="movedEvent"
>
{{item.i}}
</grid-item>
</grid-layout>
<script>
var app = new Vue({
el: "#app",
methods: {
layoutCreatedEvent: function (newLayout) {
console.log("Created layout: ", newLayout);
},
layoutBeforeMountEvent: function (newLayout) {
console.log("beforeMount layout: ", newLayout);
},
layoutMountedEvent: function (newLayout) {
console.log("Mounted layout: ", newLayout);
},
layoutReadyEvent: function (newLayout) {
console.log("Ready layout: ", newLayout);
},
layoutUpdatedEvent: function (newLayout) {
console.log("Updated layout: ", newLayout);
},
breakpointChangedEvent: function (newBreakpoint, newLayout) {
console.log("断点=", newBreakpoint, ", layout: ", newLayout);
},
moveEvent: function (i, newX, newY) {
console.log("移动中 i=" + i + ", X=" + newX + ", Y=" + newY);
},
resizeEvent: function (i, newH, newW, newHPx, newWPx) {
console.log("调整大小中 i=" + i);
},
movedEvent: function (i, newX, newY) {
console.log("移动完成 i=" + i);
},
resizedEvent: function (i, newH, newW, newHPx, newWPx) {
console.log("调整大小完成 i=" + i);
},
containerResizedEvent: function (i, newH, newW, newHPx, newWPx) {
console.log("容器大小改变了 i=" + i);
},
},
});
</script>
项目示例(简易)
<template>
<div class="customhome-container">
<grid-layout
:layout.sync="layout"
:col-num="12"
:row-height="30"
:is-draggable="true"
:is-resizable="true"
:is-mirrored="false"
:vertical-compact="true"
:margin="[10, 10]"
:use-css-transforms="true"
>
<grid-item
class="gridItem"
v-for="item in layout"
:x="item.x"
:y="item.y"
:w="item.w"
:h="item.h"
:i="item.i"
:key="item.i"
>
{{ item.i }}
</grid-item>
</grid-layout>
</div>
</template>
<script>
import { GridLayout, GridItem } from "vue-grid-layout";
export default {
components: {
GridLayout,
GridItem,
},
data() {
return {
layout: [
{ x: 0, y: 0, w: 2, h: 2, i: "0" },
{ x: 2, y: 0, w: 2, h: 4, i: "1" },
{ x: 4, y: 0, w: 2, h: 5, i: "2" },
{ x: 6, y: 0, w: 2, h: 3, i: "3" },
{ x: 8, y: 0, w: 2, h: 3, i: "4" },
{ x: 10, y: 0, w: 2, h: 3, i: "5" },
{ x: 0, y: 5, w: 2, h: 5, i: "6" },
{ x: 2, y: 5, w: 2, h: 5, i: "7" },
{ x: 4, y: 5, w: 2, h: 5, i: "8" },
{ x: 6, y: 3, w: 2, h: 4, i: "9" },
{ x: 8, y: 4, w: 2, h: 4, i: "10" },
{ x: 10, y: 4, w: 2, h: 4, i: "11" },
{ x: 0, y: 10, w: 2, h: 5, i: "12" },
{ x: 2, y: 10, w: 2, h: 5, i: "13" },
{ x: 4, y: 8, w: 2, h: 4, i: "14" },
{ x: 6, y: 8, w: 2, h: 4, i: "15" },
{ x: 8, y: 10, w: 2, h: 5, i: "16" },
{ x: 10, y: 4, w: 2, h: 2, i: "17" },
{ x: 0, y: 9, w: 2, h: 3, i: "18" },
{ x: 2, y: 6, w: 2, h: 2, i: "19" },
],
};
},
methods: {},
mounted() {},
};
</script>
<style lang="scss" scoped>
.gridItem {
border: solid black 1px;
background-color: #cccccc;
}
</style>