Vue3.0利用vue-grid-layout插件实现拖拽布局

 更新时间:2021年11月11日 10:30:01   作者:wzp123321  
这篇文章主要介绍了Vue3.0利用vue-grid-layout插件实现拖拽布局,工作中难免遇到需要对页面布局进行拖拽然后改变布局,保存布局,下面文章就围绕Vue3.0利用vue-grid-layout插件实现拖拽布局的相关资料展开详细内容,需要的朋友可以参考一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

1、插件

首先,我们选择的插件是vue-grid-layout

npm i vue-grid-layout --save

官网:https://jbaysolutions.github....

2、插曲

安装完依赖,发现项目能启动起来,按照官网demo发现页面空白,控制台提示没有找到子组件

改变思路,不使用局部引入组件,使用全局引入组件。

3、实现

 

const layout = ref<LayoutItem[]>([
      { x: 0, y: 0, w: 1, h: 1, i: 0 },
      { x: 1, y: 0, w: 2, h: 1, i: 1 },
      { x: 0, y: 1, w: 2, h: 1, i: 2 },
      { x: 0, y: 2, w: 3, h: 1, i: 3 },
      { x: 2, y: 1, w: 1, h: 1, i: 4 },
    ]);

    <grid-layout
      :layout="layout"
      :col-num="3"
      :row-height="240"
      :is-draggable="true"
      :is-resizable="true"
      :is-mirrored="false"
      :maxRows="3"
      :vertical-compact="true"
      :margin="[10, 10]"
      :use-css-transforms="true"
    >
      <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"
        @moved="onItemMoved"
      >{{ item.i }}</grid-item>
    </grid-layout>

效果:

但是!!
这里拖拽完没有判断每一行是否填充满且拖拽后有模块会被覆盖导致出现空白区域,如下:

思考:

我们需要增加校验,校验每一行是否填充满

4、校验函数

import { LayoutItem } from '../types/index';
import { cloneDeep } from 'lodash'
/**
 * 校验布局是否合法
 * 1.深拷贝数组,避免污染原数组
 * 2.拿到y的最大值 用于遍历
 * 3.拿到每个y的分数组 按照x升序排列
 * 4.如果数组长度为1判断w是否等于最大x
 * 5.如果数组长度不为1 遍历数组 判断每个元素的w是否等于下一个元素的x 累加w判断总和是否等于最大x
 * 6.如果合法则返回false
 * @param list 
 * @returns 
 */
export const verifyLayout = (list: Array<LayoutItem>): boolean => {
    let yList = list.map(item => { return item.y });
    yList = yList.sort((a, b) => { return a - b });
    console.log(list);
    const newArr = cloneDeep(list);
    let flag = false;
    const maxY = yList[yList.length - 1];
    const maxX = 3;
    console.log(maxY);
    for (let i = 0; i <= maxY; i++) {
        let arr = newArr.filter((item: LayoutItem) => {
            return item.y === i;
        });
        console.log(arr, arr.length);
        if (arr && arr.length > 1) {
            console.log('多个个-------------------', i);
            let calValue = 0;
            arr = arr.sort((a: LayoutItem, b: LayoutItem) => { return a.x - b.x })
            arr.forEach((childItem: LayoutItem, index: number) => {
                calValue += childItem.w;
                console.log('calValue--------------', calValue, index);
                if (index !== arr.length - 1 && calValue !== arr[index + 1].x) {
                    flag = true;
                }
                if (index === arr.length - 1 && calValue !== maxX) {
                    flag = true;
                }
            })
        } else {
            console.log('只有一个-------------------', i);
            if (arr[0].w !== maxX) {
                flag = true
            }
        }
    }
    console.log(flag);
    return flag;
}

思路的话就是我在函数上的注释。
在每次拖拽完成的回调函数中进行校验

    /**
     * 拖拽完成事件
     * 1.将之前的数据存储到history数据中
     * 2.然后再将移动完成的数据存储到nowlayout数据中
     */
    const onItemMoved = () => {
      console.log('moved--------------------')
      historyDataList.value.push(cloneDeep(nowLayoutData.value));
      nowLayoutData.value = cloneDeep(layout.value);
      // const flag = verifyLayout(layout.value);
      // if (flag) {
      //   goBack()
      // }
    };
    const goBack = () => {
      console.log(historyDataList.value[historyDataList.value.length - 1]);
      layout.value = historyDataList.value[historyDataList.value.length - 1];
      nowLayoutData.value = cloneDeep(layout.value);
      historyDataList.value.pop();
    }


这样的话每次我们拖拽完校验如果不合法就会回滚,就能保证每一行填充满了!!!!

到此这篇关于Vue3.0利用vue-grid-layout插件实现拖拽布局的文章就介绍到这了,更多相关Vue3 利用vue-grid-layout插件实现拖拽布局内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • vue封装的Tag标签双击编辑单击选中可删除

    vue封装的Tag标签双击编辑单击选中可删除

    项目中需要制作一个双击编辑单击选中可删除Tag标签,本文就来介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • vue自定义封装指令以及实际使用

    vue自定义封装指令以及实际使用

    市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,下面这篇文章主要给大家介绍了关于vue自定义封装指令以及实际使用的相关资料,需要的朋友可以参考下
    2022-01-01
  • Vue?webpack的基本使用示例教程

    Vue?webpack的基本使用示例教程

    这篇文章主要介绍了Vue?webpack的基本使用,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Vue.js实现简单计时器应用

    Vue.js实现简单计时器应用

    这篇文章主要为大家详细介绍了Vue.js实现简单计时器应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Element实现表格分页数据选择+全选所有完善批量操作

    Element实现表格分页数据选择+全选所有完善批量操作

    这篇文章主要介绍了Element实现表格分页数据选择+全选所有完善批量操作,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • vue请求本地自己编写的json文件的方法

    vue请求本地自己编写的json文件的方法

    这篇文章主要介绍了vue请求本地自己编写的json文件,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • 深入了解Vue.js中的Vuex状态管理模式

    深入了解Vue.js中的Vuex状态管理模式

    Vuex是Vue.js的官方状态管理模式,它为Vue.js应用程序提供了一个集中式的状态管理解决方案,Vuex可以帮助我们管理应用程序中所有组件的状态,使得状态管理变得更加简单和可靠,需要详细了解可以参考下文
    2023-05-05
  • vue转electron项目及解决使用fs报错:Module?not?found:?Error:?Can't?resolve?'fs'?in

    vue转electron项目及解决使用fs报错:Module?not?found:?Error:?Can&apo

    这篇文章主要给大家介绍了关于vue转electron项目及解决使用fs报错:Module?not?found:?Error:?Can‘t?resolve?‘fs‘?in的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vue使用mui遇到的坑及解决

    vue使用mui遇到的坑及解决

    这篇文章主要介绍了vue使用mui遇到的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Vue中的baseurl如何配置

    Vue中的baseurl如何配置

    这篇文章主要介绍了Vue中的baseurl如何配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论

?


http://www.vxiaotou.com