位置: IT常识 - 正文

VUE3 中实现拖拽和缩放自定义看板 vue-grid-layout(vue 拖拽到目标区域)

编辑:rootadmin
VUE3 中实现拖拽和缩放自定义看板 vue-grid-layout

推荐整理分享VUE3 中实现拖拽和缩放自定义看板 vue-grid-layout(vue 拖拽到目标区域),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue实现拖拽生成新的页面,vuejs拖拽,vue 拖拉拽,vue 拖拽到目标区域,vue 拖拽到目标区域,vue实现拖拽生成新的页面,vue实现拖拽生成新的页面,vue实现拖拽生成新的页面,内容如对您有帮助,希望把文章链接给更多的朋友!

Vue Grid Layout官方文档

Vue Grid Layout中文文档

1. npm下载拖拽缩放库

npm install vue-grid-layout@3.0.0-beta1 --save

2. vue3 使用 vue-grid-layout报错:external_commonjs_vue_commonjs2_vue_root_Vue_default.a is not a constructor

VUE3 中实现拖拽和缩放自定义看板 vue-grid-layout(vue 拖拽到目标区域)

 解决方案: vue3版本记得下载对应 vue-grid-layout@3.0.0-beta1版本的库,因为vue-grid-layout是vue2版本的,但用的是vue3版本,所以要安装vue3的依赖和相关配置

3.  在main.js中注册

// 将自动注册所有组件为全局组件import keycloakInit from '@/utils/util.keycloak'import VueGridLayout from 'vue-grid-layout'const app = createApp(App)app.use(store)app.use(router)app.use(ElementPlus)app.use(VueGridLayout)app.mount('#app')

4. 页面中使用组件 -- 控制保存和编辑

页面使用效果图:

点击布局进行自定义拖拽功能 ----- 效果图 ----- 箭头处可进行拖拽大小及位置:

 页面代码如下:

属性 GridLayout参数 和 GridItem参数 官网有详细介绍

<template> <div class="nav-wrapper-b"> <div class="bar-title-b"> {{getChangeLine + ' ' + barTitle}} </div> <div class="time-b"> <span style="margin-left: 20px">{{ date }} {{ time }}</span> <div style="display: inline-block;position: absolute;right: 12%;"> <el-button v-if="isEditDraggable" type="success" size="small" @click="saveDragDataHome">保存 </el-button> <el-button v-else type="primary" size="small" @click="editDragDataHome">布局 </el-button> </div> </div> </div> <div class="home-container-b"> <!--********************** 实现自定义组件 *********************--> <div class="drag-body" :class="isEditDraggable ? 'drag-body-edit' : ''"> <grid-layout :layout.sync="layoutDraggableList" :col-num="100" :row-height="5" :is-draggable="draggableLayout" :is-resizable="resizableLayout" :vertical-compact="true" :use-css-transforms="true"> <grid-item v-for="item in layoutDraggableList" :static="false" :x="item.x" :y="item.y" :w="item.w" :h="item.h" :i="item.i" style="overflow: auto"> <!--测试组件--> <div class="layout-component top-left-first-components" v-if="item.i == 'topLeftFirst'"> <box-container-is> 00001 </box-container-is> </div> <!--前五组件--> <div class="layout-component" v-if="item.i == 'topLeftSecond'"> <box-container :boxTitle="'测试1'"> 00002 </box-container> </div> <!--前五--> <div class="layout-component" v-if="item.i == 'topLeftThird'"> <box-container :boxTitle="'测试2'"> 00003 </box-container> </div> <!--信息组件--> <div class="layout-component" v-if="item.i == 'topRightFirst'"> <box-container-is> 00004 </box-container-is> </div> <!--组件--> <div class="layout-component" v-if="item.i == 'topRightSecond'"> <box-container> <topRightSecondBHome></topRightSecondBHome> </box-container> </div> <!--组件--> <div class="layout-component" v-if="item.i == 'topRightThird'"> <box-container-is> <topRightThirdBHome></topRightThirdBHome> </box-container-is> </div> </grid-item> </grid-layout> </div> </div></template><script setup> import emitter from '@/utils/eventbus' import {getDate, getTime, getTimeHours} from "@/utils/date"; import {useRoute, useRouter} from "vue-router"; import boxContainer from "@/components/boxContainer/index"; import boxContainerIs from "@/components/boxContainer/index1"; import { workOrderLine, topRightSecondBHome, topRightThirdBHome, } from "./components"; import {computed, ref} from "vue"; import {getCurrentInstance, nextTick} from "@vue/runtime-core"; import {onBeforeUnmount, onMounted, watch} from "vue"; import {saveTemplateApi} from '@/api/workOrderLineApi' import {ElMessage} from "element-plus"; const {proxy} = getCurrentInstance() //年月日 const date = ref(getDate()); //时分秒 const time = ref(getTime()); const getChangeLine = ref('') const hours = ref(getTimeHours()) const barTitle = ref("") const router = useRouter(); /*____________________________主页拖拽布局开始_______________________________*/ let isEditDraggable = ref(false) const draggableLayout = ref(false) const resizableLayout = ref(false) const layoutDraggableList = ref([]) //点击编辑布局 function editDragDataHome() { isEditDraggable.value = true } //保存布局 function saveDragDataHome() { isEditDraggable.value = false console.log(layoutDraggableList.value) saveTemplateApi(layoutDraggableList.value).then(response => { if (response.code == 200) { ElMessage({ message: '模板布局已保存成功', type: 'success', duration: 6 * 1000 }) } }) } /*_____________________________主页拖拽布局结束______________________________*/ //模拟后端请求到的数据 let demoData = ref({ "id": 162, "subjectId": 161, "name": "主页", "title": "生产分析", "description": "第一个看板菜单信息", "templateList": [ { "id": 163, "titleName": "人员信息", "disabled": true, "i": "topLeftFirst", "x": 0, "y": 0, "w": 41, "h": 10, "menuId": 162 }, { "id": 164, "titleName": "前五", "disabled": true, "i": "topLeftSecond", "x": 0, "y": 10, "w": 41, "h": 21, "menuId": 162 }, { "id": 165, "titleName": "吸嘴-抛料率前五", "disabled": true, "i": "topLeftThird", "x": 0, "y": 31, "w": 41, "h": 21, "menuId": 162 }, { "id": 166, "titleName": "", "disabled": true, "i": "topRightFirst", "x": 41, "y": 0, "w": 59, "h": 10, "menuId": 162 }, { "id": 167, "titleName": "", "disabled": true, "i": "topRightSecond", "x": 41, "y": 10, "w": 59, "h": 23, "menuId": 162 }, { "id": 168, "titleName": "", "disabled": true, "i": "topRightThird", "x": 41, "y": 33, "w": 59, "h": 19, "menuId": 162 } ] }) initialHeightFun(demoData.value) //根据高度进行调整尺寸 function initialHeightFun(data) { nextTick(() => { layoutDraggableList.value = data.templateList barTitle.value = data.title }) } onBeforeUnmount(() => {}) //监听拖拽功能 watch(isEditDraggable, (res) => { draggableLayout.value = !draggableLayout.value; resizableLayout.value = !resizableLayout.value; })</script><style lang="scss" scoped> /*----------------拖拽样式开始----------------*/ .drag-body { width: 100%; height: 100%; } .layout-component { width: 100%; height: 100%; display: flex; flex-wrap: wrap; align-content: space-between; } .layout-component-low-warning-second { width: 95%; height: 100%; margin-right: 1%; float: left; } .layout-component-low-warning-text { width: 4%; height: 100%; float: right; } .layout-component-low-throwing-second { width: 100%; height: 100%; } .drag-body-edit { .vue-grid-item:not(.vue-grid-placeholder) { outline: 2px solid rgba(255, 96, 28, 0.71); } } .vue-grid-item { box-sizing: border-box !important; } .vue-grid-layout { background: url("~@/assets/image/bg1.png"); -moz-background-size: 100% 100%; background-size: 100% 100%; } ::v-deep .vue-resizable-handle { background: url("~@/assets/image/ic_show_more.png") no-repeat 100% 100%; padding: 0 3px 3px 0; background-origin: content-box; -webkit-box-sizing: border-box; position: absolute; width: 45px; height: 45px; bottom: 0; right: 0; } .vue-grid-item:not(.vue-grid-placeholder) { //border: 1px solid #409eff; color: #ffffff; } .vue-grid-item .resizing { opacity: 0.9; } .vue-grid-item .static { background: transparent; } .vue-grid-item .text { font-size: 24px; text-align: center; position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; height: 100%; width: 100%; } .vue-grid-item .no-drag { height: 100%; width: 100%; } .vue-grid-item .minMax { font-size: 12px; } .vue-grid-item .add { cursor: pointer; } /*----------------拖拽样式结束----------------*/ .nav-wrapper-b { height: 60px; line-height: 60px; width: 100%; background: url("~@/assets/image/top.png") no-repeat; background-size: 100% 100%; text-align: center; position: relative; color: #d5dfe8; font-family: "黑体"; .bar-title-b { font-size: 32px; color: #ffffff; font-weight: bolder; } .time-b { position: absolute; right: 1%; top: 50%; transform: translateY(-35%); font-family: "Time Number"; font-weight: bold; font-size: 29px; width: 35%; } .mapChoose-b { position: absolute; left: 22px; bottom: 15px; color: #eee; } } .home-container-b { width: 100%; height: 100%; position: relative; margin-top: 0; } .nav_btn { position: absolute; top: 5px; width: 50%; height: auto; }</style>
本文链接地址:https://www.jiuchutong.com/zhishi/281310.html 转载请保留说明!

上一篇:win10电源图标不见了怎么办(win10电源图标灰色无法打开)

下一篇:Linux如何通过命令查看日志文件的某几行(中间几行或最后几行)(linux系统命令查询)

  • 单元格边距在哪里设置(单元格边距在哪里设置2016)

    单元格边距在哪里设置(单元格边距在哪里设置2016)

  • ipad2021多少毫安电池(ipad多少毫安电池)

    ipad2021多少毫安电池(ipad多少毫安电池)

  • 华为p40怎么截手机屏幕(华为p40怎么截截图)

    华为p40怎么截手机屏幕(华为p40怎么截截图)

  • 华为nova5手机型号怎么看(华为Nova5手机型号)

    华为nova5手机型号怎么看(华为Nova5手机型号)

  • 小米摄像头老是内存卡异常(小米摄像头老是自动休眠)

    小米摄像头老是内存卡异常(小米摄像头老是自动休眠)

  • 抖音聊天记录怎么删除(抖音聊天记录怎么恢复)

    抖音聊天记录怎么删除(抖音聊天记录怎么恢复)

  • 苹果手机证书过期(苹果手机证书过期了怎么重安装)

    苹果手机证书过期(苹果手机证书过期了怎么重安装)

  • 无线网络的ip地址是什么(无线网络的ip地址怎样由1变为0)

    无线网络的ip地址是什么(无线网络的ip地址怎样由1变为0)

  • 谷歌手机在国内能用吗(谷歌手机在国内怎么下载软件)

    谷歌手机在国内能用吗(谷歌手机在国内怎么下载软件)

  • 回复jz微信会被盗吗(微信你回复别人的会不会被别人看到)

    回复jz微信会被盗吗(微信你回复别人的会不会被别人看到)

  • 荣耀手表1代和2代区别(荣耀watch1和2区别)

    荣耀手表1代和2代区别(荣耀watch1和2区别)

  • 小米10pro反向充电怎么打开(小米10pro反向充电功率)

    小米10pro反向充电怎么打开(小米10pro反向充电功率)

  • 商品下架了还能退款吗(商品下架了还能评价吗)

    商品下架了还能退款吗(商品下架了还能评价吗)

  • 华为mate30能否无线充电(mate30带不带无线充电功能)

    华为mate30能否无线充电(mate30带不带无线充电功能)

  • 打开旁白怎么关闭(打开旁白后怎么关闭)

    打开旁白怎么关闭(打开旁白后怎么关闭)

  • 光纤灯一直闪蓝色(光纤灯一直闪蓝光)

    光纤灯一直闪蓝色(光纤灯一直闪蓝光)

  • 华为mate30 5G版怎么连接电脑(华为mate30 5g如何)

    华为mate30 5G版怎么连接电脑(华为mate30 5g如何)

  • OPPO k5手机自带贴膜吗(oppok5自带软件有哪些)

    OPPO k5手机自带贴膜吗(oppok5自带软件有哪些)

  • 电脑分盘怎么合并(电脑分盘怎么合并不了)

    电脑分盘怎么合并(电脑分盘怎么合并不了)

  • 苹果11有多重(苹果12pro多重)

    苹果11有多重(苹果12pro多重)

  • 华为p30参数(华为p30参数配置详细价格)

    华为p30参数(华为p30参数配置详细价格)

  • 手机qq自动回复咋关(手机QQ自动回复怎么取消)

    手机qq自动回复咋关(手机QQ自动回复怎么取消)

  • 修复同步推闪退(同步推正版闪退)

    修复同步推闪退(同步推正版闪退)

  • 小米6如何设置指纹支付(小米6如何设置老人模式)

    小米6如何设置指纹支付(小米6如何设置老人模式)

  • OPPO手机桌面怎样设置时钟(oppo手机桌面怎么恢复原来的桌面)

    OPPO手机桌面怎样设置时钟(oppo手机桌面怎么恢复原来的桌面)

  • 怎么把华为旧手机的东西导入华为新手机(怎么把华为旧手机的东西导入红米新手机)

    怎么把华为旧手机的东西导入华为新手机(怎么把华为旧手机的东西导入红米新手机)

  • 软件设计原则(软件设计原则与模式)

    软件设计原则(软件设计原则与模式)

  • 拉勾网如何投简历(拉勾网招聘怎样)

    拉勾网如何投简历(拉勾网招聘怎样)

  • 电脑开机弹出documents文件夹解决方法(电脑开机弹出documents文件夹)

    电脑开机弹出documents文件夹解决方法(电脑开机弹出documents文件夹)

  • Win11/10系统怎么增强蓝牙信号范围? 增强Win11蓝牙信号三种方法(win11 zen2)

    Win11/10系统怎么增强蓝牙信号范围? 增强Win11蓝牙信号三种方法(win11 zen2)

  • 增值税开票软件ukey版
  • 可以抵扣进项税额的增值税普通发票
  • 企业购进固定资产时增值税如何处理
  • 个人所得税孩子小学升初中要修改吗?
  • 缴纳个人社保在哪里可以缴
  • 原材料月末有余额吗
  • 按月按季申报
  • 固定资产管理中存在的问题及对策论文
  • 收到返还利润可以抵扣吗
  • 应收款未收到怎么做账
  • 免税销售额怎么算出来的
  • 年底进项税和销项税怎么记
  • 弥补以前年度亏损从哪里取数
  • 贸易公司收到货款会计分录
  • 代收水电费的会计分录
  • 公司账户收到车险怎么做账
  • 我的初级备考经验怎么写
  • 社保和公积金的钱可以取出来吗
  • 税负率一般控制在多少合适
  • 房产评估价偏低
  • 银行回单箱费会扣吗
  • 制药厂副产品
  • 组策略阻止了这个程序0x800704ec
  • .ctc文件
  • cpqdfwag.exe是什么进程 能结束吗 cpqdfwag进程查询
  • 纳汉双语
  • 小企业固定资产折旧方法包括
  • network python
  • css前端还是后端
  • php guzzle 异步
  • 以摊余成本计量和以公允价值计量的区别
  • php页面跳转方法
  • html文档基本结构包括哪几部分
  • vue fragment标签
  • vue怎么打断点
  • uniapp 手写识别
  • 发票开具使用要求
  • 联营企业分得的利润
  • 未开票收入为负数是什么意思
  • 财务费用的利息费用怎么算
  • 北京社保月平均工资
  • 营销策划费会计分录
  • 出口生产型企业
  • sqlsever日志在哪儿
  • 公司给员工交社保对公司有什么好处
  • 预收账款要预交税金吗
  • 应缴国库款和应缴专户款的区别
  • 核算产品的成本的表
  • 发票开错没有作废可以红字冲销吗?
  • 搞活动的现金红包怎么用
  • 网络竞价须知
  • 小企业会计准则2023电子版
  • 财税2009年87号文废止
  • 企业在销售过程中支付的消费税应通过什么账户进行核算
  • 年终奖通常怎么计算
  • sql server入门新手教程
  • 在linux2.4.0版本中
  • freebsd11.3安装教程
  • win8无线网络连接不上
  • linux系统输入法锁定了怎么解开
  • win10开机提醒
  • win7系统笔记本怎么连接蓝牙耳机
  • Win7系统打印机共享无法保存打印机设置0x000006d9
  • win7能装coreldraw2020吗
  • win7打开文件提示用户没有访问权限怎么办
  • windows8的ie浏览器在哪
  • win7微软账户
  • node copyfile
  • 快速掌握阅读题的技巧
  • perl use vars pragma使用技巧
  • 有哪些小工具
  • 什么是批处理模式
  • jquery按钮点击事件
  • python socket编程步骤
  • unity入门教学
  • jquery field
  • android实时获取微信聊天信息
  • python中fd
  • 河北税务怎么看自己绑定的银行卡号
  • 1.6t车船税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设