# vue实现拖拉拽效果,类似于禅道首页可拖拽排布展示内容(插件-Grid Layout)

vue实现拖拉拽效果,类似于禅道首页可拖拽排布展示内容(插件-Grid Layout)

这个是类似与禅道那种首页有多个指标模块,允许用户自己拼装内容的那种感觉。

实现效果

插件资料

vue3版本

如果项目是vue3 的话使用的是 Grid Layout Plus

官网:grid-layout-plus.netlify.app/zh/

文档:grid-layout-plus.netlify.app/zh/guide/in...

vue2版本

如果项目是vue2版本的话,可以使用 Vue Grid Layout

官网:jbaysolutions.github.io/vue-grid-la...

文档:jbaysolutions.github.io/vue-grid-la...

vue3项目使用Grid Layout

使用的话也比较简单,现在以vue3使用为例介绍。

安装插件

安装的话只需要一行命令就可以执行:

bash 复制代码
npm i grid-layout-plus

or

yarn add grid-layout-plus

导入插件

导入的话直接在需要的页面导入就可以了:

javascript 复制代码
import {GridLayout, GridItem} from 'grid-layout-plus';

当然,也可以挂在到全局上面:

javascript 复制代码
app.component('GridLayout', GridLayout).component('GridItem', GridItem)

开发

引入之后就可以直接用了,这里可以根据官网文档进行开发,下面给一个小的案例:

javascript 复制代码
<template>
	<div class="ed-page">
		<GridLayout v-model:layout="layout" :col-num="24" :restore-on-drag="true" :vertical-compact="true" :row-height="50">
			<GridItem v-for="item in layout"
			          :key="item.i"
			          :x="item.x"
			          :y="item.y"
			          :w="item.w"
			          :h="item.h"
			          :i="item.i"
			          :is-resizable="item.isResizable">
				<p class="text">{{ item.i }}</p>
				<p class="text">{{ item.title }}</p>
				<p class="text">{{ item.url }}</p>
			</GridItem>
		</GridLayout>
	</div>
</template>
<script setup>
import {GridLayout, GridItem} from 'grid-layout-plus';
import {ref} from "vue";

const layout = ref([
	{
		x: 0,
		y: 0,
		w: 12,
		h: 5,
		i: '0',
		static: false,
		isResizable: false,
		url: "https://grid-layout-plus.netlify.app/zh/",
		title: "grid-layout-plus"
	},
	{x: 12, y: 0, w: 12, h: 5, i: '2', static: false},
]);

</script>
<style scoped lang="scss">
.ed-page {
	height: 100%;
	overflow-y: auto;
	overflow-x: hidden;
}

.vgl-layout {
	//background-color: #eee;
}

.vgl-layout::before {
	position: absolute;
	width: calc(100% - 5px);
	height: calc(100% - 5px);
	margin: 5px;
	content: '';
	background-image: linear-gradient(to right, #E9E9EB 1px, transparent 1px),
	linear-gradient(to bottom, #E9E9EB 1px, transparent 1px);
	background-repeat: repeat;
	background-size: calc(calc(100% - 5px) / 24) 60px;
}

:deep(.vgl-item:not(.vgl-item--placeholder)) {
	background-color: #FFF;
	border: 1px solid #909399;
}

:deep(.vgl-item--resizing) {
	opacity: 90%;
}

:deep(.vgl-item--static) {
	background-color: #cce;
}
</style>

看一下效果:

gif 动图可能有点卡顿,但是实际效果还是不错的,希望有用!拜拜!

相关推荐
漂流瓶jz8 小时前
Webpack中各种devtool配置的含义与SourceMap生成逻辑
前端·javascript·webpack
前端架构师-老李8 小时前
React 中 useCallback 的基本使用和原理解析
前端·react.js·前端框架
木易 士心8 小时前
CSS 中 `data-status` 的使用详解
前端·css
明月与玄武8 小时前
前端缓存战争:回车与刷新按钮的终极对决!
前端·缓存·回车 vs 点击刷新
牧马少女9 小时前
css 画一个圆角渐变色边框
前端·css
zy happy9 小时前
RuoyiApp 在vuex,state存储nickname vue2
前端·javascript·小程序·uni-app·vue·ruoyi
小雨青年9 小时前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
小光学长10 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
meichaoWen10 小时前
【Vue】Vue框架的基础知识强化
前端·javascript·vue.js
jingling55510 小时前
Flutter | 基础环境配置和创建flutter项目
前端·flutter