拿来就用vue-gird-layout组件封装示例

 更新时间:2023年08月01日 11:31:58   作者:Xbbing  
这篇文章主要介绍了vue-gird-layout组件封装示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

先来效果图展示

展示

拖拽尺寸

拖拽后

移动

组件封装

大家这块直接复制使用就OK

<template>
    <grid-layout
            :layout="layout"
            :col-num="colNum"
            :row-height="rowHeight"
            :is-mirrored="isMirrored"
            :vertical-compact="verticalCompact"
            :margin="margin"
            :use-css-transforms="useCssTransforms"
            :useStyleCursor="useStyleCursor"
            :is-draggable="isDraggable"
            :is-resizable="isResizable"
            @layout-updated="layoutUpdatedEvent"
    >
        <grid-item v-for="(item, index) in layout"
            :x="item.x"
            :y="item.y"
            :w="item.w"
            :h="item.h"
            :i="item.i"
            :minW="minW"
            :minH="minH"
            :key="index"
            @resized="resize(item.i)">
            <slot name="chart" :item="item" :index="index"></slot>
        </grid-item>
    </grid-layout>
</template>
<script>
import VueGridLayout from 'vue-grid-layout';
// import Chart from "@/components/chart/index.vue";
export default {
    components: {
        GridLayout: VueGridLayout.GridLayout,
        GridItem: VueGridLayout.GridItem,
        // Chart
    },
    props: {
        // 布局数据
        layout: {
            type: Array,
            default: () => []
        },
        // 是否可拖拽
        isDraggable: {
            type: Boolean,
            default: true
        },
        // 是否可改变大小
        isResizable: {
            type: Boolean,
            default: true
        },
        // 多少列
        colNum: {
            type: Number,
            default: 12
        },
        // 每行得高度
        rowHeight: {
            type: Number,
            default: 30
        },
        // 是否可镜像反转
        isMirrored: {
            type: Boolean,
            default: false
        },
        // 标识布局是否垂直压缩
        verticalCompact: {
            type: Boolean,
            default: true
        },
        // 定义栅格中的元素边距
        margin: {
            type: Array,
            default: () => [10,10]
        },
        // 标识是否使用CSS属性 transition-property: transform;
        useCssTransforms: {
            type: Boolean,
            default: true
        },
        // 是否使用动态鼠标指针样式
        useStyleCursor: {
            type: Boolean,
            default: true
        },
        // 元素最小宽
        minW: {
            type: Number,
            default: 1
        },
        // 最小高
        minH: {
            type: Number,
            default: 1
        },
        show: {
            type: Boolean,
            default: false
        }
    },
    data() {
        return {
            height: '',
            option: {},
            gridShow: false
        }
    },
    methods: {
        layoutUpdatedEvent(newLayout) {
            this.$emit('layoutUpdatedEvent',newLayout)
        },
        // 更新resize
        resize(i) {
            this.$emit('resize',i)
        }
    }
}
</script>
<style lang="scss" scoped>
:deep(.el-card__body) {
    height: 100%;
}
</style>

组件的调用

(主要是使用这块 上面的直接复制即可)

<template>
    <div>
        <gridCanvas :layout="layout" @layoutUpdatedEvent="layoutUpdatedEvent" @resize="resize">
            <template #chart="{item,index}">
                <el-card v-if="show" ref="elCard" style="height: 100%" :key="item.i">
                    <Chart :ref="'echarts'+item.i" :chartsData="item.data" :radioShow="false" :height="'100%'" :id="index"></Chart>
                </el-card>
            </template>
        </gridCanvas>
    </div>
</template>
<script>
import gridCanvas from "@/components/gridCanvas/index.vue";
import Chart from "@/components/chart/index.vue";
export default {
    components: {
        gridCanvas,
        Chart
    },
    data() {
        return {
            show: false,
            layout: [
                {"x":0,"y":0,"w":6,"h":10,"i":"0",
                    data: {
                        descData: ["广东省", "江苏省", "北京市", "浙江省", "山东省", "四川省", "河南省", "上海市12345", "河北省", "其他", "福建省", "安徽省", "湖北省", "辽宁省"],
                        dis_type: "barh",
                        label_desc: "最近一次测试",
                        label_id: 5,
                        subtext: "99.99%",
                        text: "图标1",
                        xData: [2211, 333, 372, 226, 248, 218, 103, 199, 174, 177, 146, 148, 171, 162],
                        yData: ["广东省", "江苏省", "北京市", "浙江省", "山东省", "四川省", "河南省", "上海市", "河北省", "其他", "福建省", "安徽省", "湖北省", "辽宁省"],
                    }
                },
                {"x":4,"y":0,"w":4,"h":8,"i":"1",
                    data: {
                        descData: ["广东省", "江苏省", "北京市", "浙江省", "山东省", "四川省", "河南省", "上海市12345", "河北省", "其他", "福建省", "安徽省", "湖北省", "辽宁省"],
                        dis_type: "pie",
                        label_desc: "最近二次测试",
                        label_id: 5,
                        subtext: "99.99%",
                        text: "图标2",
                        xData: [810, 357, 372, 226, 248, 218, 193, 189, 174, 477, 146, 148, 131, 162],
                        yData: ["广东省", "江苏省", "北京市", "浙江省", "山东省", "四川省", "河南省", "上海市", "河北省", "其他", "福建省", "安徽省", "湖北省", "辽宁省"],
                    }
                },
                {"x":0,"y":5,"w":4,"h":8,"i":"6",
                    data: {
                        descData: ["广东省", "江苏省", "北京市", "浙江省", "山东省", "四川省", "河南省", "上海市12345", "河北省", "其他", "福建省", "安徽省", "湖北省", "辽宁省"],
                        dis_type: "bar",
                        label_desc: "最近三次测试",
                        label_id: 5,
                        subtext: "99.99%",
                        text: "图标3",
                        xData: [810, 377, 342, 286, 274, 219, 190, 199, 174, 147, 146, 438, 171, 162],
                        yData: ["广东省", "江苏省", "北京市", "浙江省", "山东省", "四川省", "河南省", "上海市", "河北省", "其他", "福建省", "安徽省", "湖北省", "辽宁省"],
                    }
                },
            ]
        }
    },
    methods: {
        // 拖拽之后触发
        layoutUpdatedEvent(newLayout) {
            console.log(newLayout)
        },
        resize(i) {
            this.$nextTick(() => {
                const chart = eval(`this.$refs.echarts${i}`)
                if(chart) {
                    chart.resize()
                }
            })
        }
    },
    mounted() {
        setTimeout(() => {
            this.show = true
        })
    }
}
</script>
<style lang="scss" scoped>
:deep(.el-card__body) {
    height: 100%;
}
</style>

使用讲解

直接引用我们自己封装的组件 代码中chart组件为我自己封装的echarts组件,后续我会更新,你只需讲chart组件换为你自己封装的组件 其中#chart为插槽参数 (其实就是每块的数据)layout变量为grid的核心数据,分别代表x轴坐标y轴坐标宽度和高度其中data为你需要渲染的数据 还不能使用的

相关文章

  • vue3项目vite.config.js配置代理、端口、打包名以及图片压缩

    vue3项目vite.config.js配置代理、端口、打包名以及图片压缩

    这篇文章主要给大家介绍了关于vue3项目vite.config.js配置代理、端口、打包名以及图片压缩的相关资料,因为3.0版本中vue已经内置了很多关于webpack的配置,一般情况下开箱即用,需要修改则可以在vue.config.js文件中完成,需要的朋友可以参考下
    2023-12-12
  • Vue2.x Todo之自定义指令实现自动聚焦的方法

    Vue2.x Todo之自定义指令实现自动聚焦的方法

    我们希望用户双击 todo 进入编辑状态后输入框自动获取焦点,而不是需要先手动点一下。这篇文章主要介绍了Vue 2.x Todo之自定义指令实现自动聚焦,非常具有实用价值,需要的朋友可以参考下
    2019-01-01
  • vue路由缓存的几种实现方式小结

    vue路由缓存的几种实现方式小结

    这篇文章主要介绍了vue路由缓存的几种实现方式,结合实例形式详细分析了vue.js路由缓存常见实现方式、使用技巧与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • 一文详解Vue响应式数据的原理

    一文详解Vue响应式数据的原理

    在vue2的响应式中,存在着添加属性、删除属性、以及通过下标修改数组,但页面不会自动更新的问题,而这些问题在vue3中都得以解决,本文就给大家详细的介绍一下Vue响应式数据原理,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • vue 二维码长按保存和复制内容操作

    vue 二维码长按保存和复制内容操作

    这篇文章主要介绍了vue 二维码长按保存和复制内容操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • vue.config.js打包优化配置

    vue.config.js打包优化配置

    这篇文章主要介绍了vue.config.js打包优化配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • vue3+ts+axios+pinia实现无感刷新方式

    vue3+ts+axios+pinia实现无感刷新方式

    这篇文章主要介绍了vue3+ts+axios+pinia实现无感刷新方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue从一个页面跳转到另一个页面并携带参数的解决方法

    vue从一个页面跳转到另一个页面并携带参数的解决方法

    这篇文章主要介绍了vue从一个页面跳转到另一个页面并携带参数的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Vue3+TypeScript+Vite使用require动态引入图片等静态资源

    Vue3+TypeScript+Vite使用require动态引入图片等静态资源

    本文主要介绍了Vue3+TypeScript+Vite使用require动态引入图片等静态资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • vue3解决各场景loading过度的五种方法

    vue3解决各场景loading过度的五种方法

    这篇文章主要为大家详细介绍了vue3中解决各场景loading过度的五种方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-11-11

最新评论