Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用

2023-09-18 16:28:54


该栅格系统目前对 vue2 的支持是最好的,vue3 是需要用插件支持的,会在小节详细讲解。

1、官网简介

官网地址:https://madewithvuejs.com/vue-grid-layout
中文文档:https://github.com/jbaysolutions/vue-grid-layout/blob/master/README-zh_CN.md

该栅格布局有以下特点:

  • 可拖拽
  • 可调整大小
  • 静态部件(不可拖拽、调整大小)
  • 拖拽和调整大小时进行边界检查
  • 增减部件时避免重建栅格
  • 可序列化和还原的布局
  • 自动化RTL支持
  • 响应式
  • Min/max w/h per item

2、在vue3中使用

1)、需要导入vue3支持的版本插件

pnpm add vue-grid-layout@3.0.0-beta1
// 安装结果
"vue-grid-layout": "3.0.0-beta1"

2)、在mian.js里引入:

import gridLayout  from 'vue-grid-layout' 
app.use(gridLayout)

注:在main.js注册后,在具体使用的组件中不需要在 import 引入,可直接使用(App.vue)

因为vue-grid-layout是vue2版本的 但自己用的是vue3版本,所以要安装vue3的依赖和相关配置

3)、在组件中使用

<template>
 <grid-layout
      v-model:layout="layout"
      :col-num="24"
      :row-height="30"
      :is-draggable="true"
      :is-resizable="true"
      :is-mirrored="false"
      :vertical-compact="true"
      :margin="[10, 10]"
      :use-css-transforms="true"
    >
      <grid-item
        v-for="item in layout"
        :key="item.i"
        :x="item.x"
        :y="item.y"
        :w="item.w"
        :h="item.h"
        :i="item.i"
        :static="item.static"
      >
        <MyTasks
          v-if="item.name === '我的模块1'"
          :id="item.i"
          @deletePanelItemEvent="deletePanelItem"
        />
        <MyData
          v-if="item.name === '我的模块2'"
          :id="item.i"
          @deletePanelItemEvent="deletePanelItem"
        />
        <MyModel
          v-if="item.name === '我的模块3'"
          :id="item.i"
          @deletePanelItemEvent="deletePanelItem"
        />
        <ModelRun
          v-if="item.name === '我的模块4'"
          :id="item.i"
          @deletePanelItemEvent="deletePanelItem"
        />
      </grid-item>
    </grid-layout>
</template>

<script setup>
import { reactive } from "vue";

const layout= [
  { x: 0, y: 0, w: 12, h: 8, i: 0, name: '我的模块1', static: true,},
  { x: 12, y: 0, w: 12, h: 8, i: 1, name: '我的模块2' },
  { x: 0, y: 8, w: 12, h: 8, i: 2, name: '我的模块3' },
  { x: 12, y: 8, w: 12, h: 8, i: 3, name: '我的模块4' },
]
</script>

<style>
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
</style>

在这里插入图片描述

3、layout布局的计算逻辑

这是gridItem的数据项:{ “x”: 0, “y”: 0, “w”: 2, “h”: 2, “i”: “0” },包含x、y、w、h、i。

  1. i: 栅格中元素的ID
  2. x: 标识栅格元素位于第几列
  3. y: 标识栅格元素位于第几行
  4. w: 标识栅格元素的初始宽度(值为colWidth的倍数)
  5. h: 标识栅格元素的初始高度(值为rowHeight的倍数)
    理解基本概念后,详细说说参数含义(只取第一个数据项:{ “x”: 0, “y”: 0, “w”: 2, “h”: 2, “i”: “0” }):
  6. minW:栅格元素的最小宽度(值为colWidth的倍数)
  7. minH:栅格元素的最小高度(值为rowHeight的倍数)
  8. maxW:栅格元素的最大宽度(值为colWidth的倍数)
  9. maxH:栅格元素的最大高度(值为rowHeight的倍数)

宽度:设共可分为 n 列,那么, width - (n+1)*margin / n = 每个元素的实际宽度
高度:设共可分为 m 行,那么,row-height * m + (m + 1) * margin <= height
因此,元素的宽高,可以根据实际的拖拽区的宽高,动态计算出来

4、 gridLayout 的属性

  1. layout:栅格布局的数据源,数据源为数组Array,数据项为对象,必须包含 i, x, y, w 和 h 属性.
  2. colNum:定义栅格系统的列数
  3. rowHeight:每行的高度,单位像素
  4. maxRows:定义最大行数
  5. isDraggable:标识栅格中的元素是否可拖拽
  6. isResizable:标识栅格中的元素是否可调整大小
  7. preventCollision:防止碰撞属性,值设置为ture时,栅格只能拖动至空白处

(我们将数据项宽度高度设为1,便于查看效果)

colNum:是定义列数

rowHeight:是指每一行的高度(这个的单位是 px)

margin:定义栅格中的元素边距(数组中第一个元素表示水平边距,第二个表示垂直边距,单位为像素)

其他属性就比较简单了,不再大篇幅介绍了,后面遇到了我们再细说。主要大家一定要了解计算规则,这个框架就非常容易掌握了,遇到BUG,基本上是margin的问题。

更多推荐

利用 Python PyPDF2库轻松提取PDF文本(及其他高级操作)

当需要从PDF文件中提取文本时,Python中的PyPDF2库是一个非常有用的工具。无论您是需要分析PDF文档中的内容还是需要在文档中搜索特定的信息,PyPDF2都可以帮助您轻松实现这些任务。在本文中,我们将探讨如何使用PyPDF2库提取PDF文件中的文本,并提供一些示例代码来帮助您入门。安装PyPDF2库首先,您需要

全局异常处理+JSR303验证

一、前言我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全。因为前端很容易拜托,当测试使用PostMan来测试,如果后端没有校验,不就乱了吗?肯定会有很多异常的。今天小编和大家一起学习一下JSR303专门用于参

如何使用Jest生成中文测试报告

前言Jest是一个非常流行的JavaScript测试框架,它提供了丰富的功能和易于理解的测试报告。然而,默认情况下,Jest生成的测试报告是以英文展示的。如果需要生成中文测试报告,我们需要对Jest进行一些配置。以下是一种方法,可以在Jest中生成中文测试报告:安装相关依赖首先,确保已经安装了Node.js和npm。然

C语言 coding style

头文件The#defineGuard#define的保护文件的唯一性,防止被多重包含格式:<PROJECT>_<FILE>_H_PROJECT:XSFILE:MV_CTR头文件的包含顺序CSystemFilesOtherLibrariesUserLibraryConditionalinclude作用域局部变量-变量定义

VMware vCenter 从6.7跨版本升级至7.0U3N

本文尝试使用vCenterServerAppliance管理界面(VAMI)进行对vCenterServerAppliance7应用进行小版本升级,从6.7.0.47000升级到7.0.3.01600(7.0U3N)。一、升级前的准备工作1、检查当前运行环境(当前为6.7.0.47000)2、核实当前ESXi版本均在兼

提高接口自动化测试效率:使用 JMESPath 实现断言和数据提取!

前言做接口自动化,断言是比不可少的。如何快速巧妙的提取断言数据就成了关键,当然也可以提高用例的编写效率。笔者在工作中接触到了JMESPath,那到底该如何使用呢?带着疑惑一起往下看。JMESPath是啥?JMESPath是一种用于查询和转换JSON数据的简洁、强大的查询语言。它提供了一种灵活的方式来从复杂的JSON结构

思腾云计算

近年来,游戏行业发展迅猛,市场容量不断扩大。从游戏产业发展来看,玩家对于游戏内容和体验的需求不断攀升。那如何在同质化的游戏市场,通过AI来提高游戏探索和交互的趣味度?行业存在以下痛点:1、游戏迭代速度加快,如何加速研发创新,提供多元化的游戏体验;2、在线多人竞技类游戏因玩家能力不均,均衡对局匹配耗时长,对局质量差,再加

Spring注解家族介绍: @RequestMapping

前言:今天我们来介绍@RequestMapping这个注解,这个注解的内容相对来讲比较少,篇幅会比较短。目录前言:@RequestMapping应用场景:总结:@RequestMapping@RequestMapping是一个用于映射HTTP请求到处理方法的注解,它可以用在控制器类和处理方法上。当请求到达服务器时,根据

lv4 嵌入式开发-9 静态库与动态库的使用

目录1库的概念2库的知识3静态库特点4静态库4.1静态库创建4.2编译生成目标文件4.3创建静态库hello4.4查看库中符号信息4.5链接静态库5共享库特点6共享库6.1共享库创建6.2编译生成目标文件6.3创建共享库common6.4为共享库文件创建链接文件6.5编写应用程序6.6编译test.c并链接共享库lib

Java基于SpringBoot的漫画网站,附源码,教程

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌今天为大家带来的是基于SpringBoot+Vue的漫画之家系统,亲测可用,可以作为课程设计,毕业设计适用。文章目录1、前言介绍2.技术栈3系统分析3.

爬虫获取接口数据

上一讲讲的是获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获得,下面我就来讲讲如何爬取这类数据。以巨潮资讯网爬取比亚迪企业年报为例。正常人的操作打开巨潮资讯网官网找到比亚迪的公告在分类里面选择筛选信息,找到自己想要的信息爬虫的思路获取请求

热文推荐