vue-grid-layout

阅读数:101 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、概述

它允许你创建一个可拖拽和可调整大小的网格布局,非常适合用于仪表板、表单布局等需要灵活布局的场景。

https://jbaysolutions.github.io/vue-grid-layout/zh/guide/

二、使用

1、安装

npm install vue-grid-layout

2、基本使用

(1)创建一个新的Vue组件

<template>
  <grid-layout
    :layout="layout"
    :col-num="12"
    :row-height="30"
    :is-draggable="true"
    :is-resizable="true"
    :vertical-compact="true"
    :margin="[10, 10]"
    @layout-updated="onLayoutUpdated"
  >
    <grid-item
      v-for="item in layout"
      :key="item.i"
      :x="item.x"
      :y="item.y"
      :w="item.w"
      :h="item.h"
    >
      <div class="grid-item-content">{{ item.i }}</div>
    </grid-item>
  </grid-layout>
</template>

<script>
import { GridLayout, GridItem } from 'vue-grid-layout';

export default {
  name: 'MyGridLayout',
  components: {
    GridLayout,
    GridItem,
  },
  data() {
    return {
      layout: [
        { i: '0', x: 0, y: 0, w: 2, h: 2 },
        { i: '1', x: 2, y: 0, w: 2, h: 4 },
        { i: '2', x: 4, y: 0, w: 2, h: 5 },
        { i: '3', x: 6, y: 0, w: 2, h: 3 },
        { i: '4', x: 8, y: 0, w: 2, h: 3 },
        { i: '5', x: 10, y: 0, w: 2, h: 3 },
      ],
    };
  },
  methods: {
    onLayoutUpdated(newLayout) {
      console.log('Layout updated:', newLayout);
    },
  },
};
</script>

<style scoped>
.grid-item-content {
  background: #ccc;
  border: 1px solid #ddd;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}
</style>

(2)解释

  • GridLayout 组件:这是网格布局的容器组件,负责管理所有的网格项。
  • GridItem 组件:这是单个网格项组件,可以拖拽和调整大小。
  • layout 数据:这是一个数组,定义了每个网格项的初始位置和大小。每个对象包含以下属性:
    • i:网格项的唯一标识符。
    • x:网格项的初始横向位置(列索引)。
    • y:网格项的初始纵向位置(行索引)。
    • w:网格项的宽度(跨越的列数)。
    • h:网格项的高度(跨越的行数)。

(3)主要属性和事件

  • col-num:定义网格的列数。
  • row-height:定义每行的高度,以像素为单位。
  • is-draggable:布尔值,控制网格项是否可拖拽。
  • is-resizable:布尔值,控制网格项是否可调整大小。
  • vertical-compact:布尔值,控制网格项是否垂直紧凑排列。
  • margin:数组,定义网格项之间的间距,以像素为单位。
  • layout-updated 事件:当网格布局更新时触发,可以用来获取新的布局信息。

3、高级用法

(1)动态添加和移除网格项

<template>
  <div>
    <button @click="addItem">Add Item</button>
    <button @click="removeItem">Remove Item</button>
    <grid-layout
      :layout="layout"
      :col-num="12"
      :row-height="30"
      :is-draggable="true"
      :is-resizable="true"
      :vertical-compact="true"
      :margin="[10, 10]"
      @layout-updated="onLayoutUpdated"
    >
      <grid-item
        v-for="item in layout"
        :key="item.i"
        :x="item.x"
        :y="item.y"
        :w="item.w"
        :h="item.h"
      >
        <div class="grid-item-content">{{ item.i }}</div>
      </grid-item>
    </grid-layout>
  </div>
</template>

<script>
import { GridLayout, GridItem } from 'vue-grid-layout';

export default {
  name: 'MyGridLayout',
  components: {
    GridLayout,
    GridItem,
  },
  data() {
    return {
      layout: [
        { i: '0', x: 0, y: 0, w: 2, h: 2 },
        { i: '1', x: 2, y: 0, w: 2, h: 4 },
        { i: '2', x: 4, y: 0, w: 2, h: 5 },
        { i: '3', x: 6, y: 0, w: 2, h: 3 },
        { i: '4', x: 8, y: 0, w: 2, h: 3 },
        { i: '5', x: 10, y: 0, w: 2, h: 3 },
      ],
      nextId: 6,
    };
  },
  methods: {
    addItem() {
      this.layout.push({ i: `${this.nextId}`, x: 0, y: 0, w: 2, h: 2 });
      this.nextId++;
    },
    removeItem() {
      this.layout.pop();
    },
    onLayoutUpdated(newLayout) {
      console.log('Layout updated:', newLayout);
    },
  },
};
</script>

<style scoped>
.grid-item-content {
  background: #ccc;
  border: 1px solid #ddd;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}
</style>



相关推荐