vue3拖拽布局+动态组件+自适应布局

2023-05-16

1.拖拽布局插件

Vue Grid Layout -️ 适用Vue.js的栅格布局系统可拖动和可调整大小栅格布局的Vue组件。https://jbaysolutions.github.io/vue-grid-layout/zh/

//在package.json中dependencies下添加下面插件库,并执行命令npm install

 "vue-grid-layout": "^3.0.0-beta1",

 2.拖拽页面代码

<template>
  <div>
    <!-- 
        colNum: 定义栅格系统的列数,其值需为自然数.
        rowHeight:每行的高度,单位像素。
        isDraggable:标识栅格中的元素是否可拖拽.
        isResizable:标识栅格中的元素是否可调整大小。
        isMirrored:标识栅格中的元素是否可镜像反转。
        autoSize:标识容器是否自动调整大小
        verticalCompact:标识布局是否垂直压缩。
        preventCollision:防止碰撞属性,值设置为ture时,栅格只能拖动至空白处。
        useCssTransforms:标识是否使用CSS属性 transition-property: transform;
        responsive:标识布局是否为响应式
    -->
    <grid-layout :layout="layout"
                 :col-num="12"
                 :row-height="30"
                 :is-draggable="true"
                 :is-resizable="true"
                 :vertical-compact="true"
                 :margin="[10, 10]"
                 :use-css-transforms="true"
                 @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"
                 :key="item.i"
                 @move="moveEvent"
                 @resized="resizedEvent"
                 style="background:pink;">
        <keep-alive>
          <component :is="item.name"
                     :ref="`dragRef${index}`"
                     :key="item.name+index"
                     :id="item.name+index"
                     :width="item.Wpx"
                     :height="item.Hpx"></component>
        </keep-alive>
      </grid-item>
    </grid-layout>
  </div>
</template>
<script lang="ts">
import { BarChart, FunnelChart, PieChart, RadarChart } from './components';

export default {
  components: {
    BarChart,
    FunnelChart,
    PieChart,
    RadarChart
  }
};
</script>
<script setup lang="ts">
const layout = ref([
  { x: 0, y: 0, w: 2, h: 2, i: '0' },
  { x: 2, y: 0, w: 2, h: 4, i: '1' },
  { x: 4, y: 0, w: 2, h: 5, i: '2' },
  { x: 6, y: 0, w: 2, h: 3, i: '3' },
  { x: 8, y: 0, w: 2, h: 3, i: '4' },
  { x: 10, y: 0, w: 2, h: 3, i: '5' }
]);

const testLayout = [
  {
    x: 0,
    y: 0,
    w: 2,
    h: 8,
    i: '0',
    name: 'BarChart'
  },
  //   {
  //     x: 2,
  //     y: 0,
  //     w: 2,
  //     h: 8,
  //     i: '1',
  //     name: 'FunnelChart'
  //   },
  //   {
  //     x: 4,
  //     y: 0,
  //     w: 2,
  //     h: 8,
  //     i: '2',
  //     name: 'PieChart'
  //   },
  //   {
  //     x: 6,
  //     y: 0,
  //     w: 2,
  //     h: 8,
  //     i: '3',
  //     name: 'RadarChart'
  //   },
  {
    x: 8,
    y: 0,
    w: 2,
    h: 8,
    i: '4',
    name: 'BarChart'
  }
];
layout.value = testLayout;

//更新事件(布局更新或栅格元素的位置重新计算)
const layoutUpdatedEvent = (newLayout: any) => {
  console.log('布局更新了');
  console.log('Updated layout: ', newLayout);
  layout.value = newLayout;
  console.log(layout.value);
};
//移动时的事件
const moveEvent = (i: any, newX: any, newY: any) => {
  console.log('盒子移动了');
  console.log('MOVE i=' + i + ', X=' + newX + ', Y=' + newY);
};
//调整大小后的事件
/**
 *
 * @param i the item id/index
 * @param newH new height in grid rows
 * @param newW new width in grid columns
 * @param newHPx new height in pixels
 * @param newWPx new width in pixels
 *
 */
const resizedEvent = (
  i: any,
  newH: any,
  newW: any,
  newHPx: any,
  newWPx: any
) => {
  console.log('改变了尺寸');
  console.log(
    'RESIZED i=' +
      i +
      ', H=' +
      newH +
      ', W=' +
      newW +
      ', H(px)=' +
      newHPx +
      ', W(px)=' +
      newWPx
  );
  let newLayouts = layout.value.map(item => {
    console.log(item);
    console.log(item.i == i);

    if (item.i == i) {
      item.Wpx = newWPx + 'px';
      item.Hpx = newHPx + 'px';
    }
    return item;
  });
  layout.value = newLayouts;
};
</script>


<style scoped>
</style>

3.图表子组件代码

<template>
  <div class="box">
    <div :id="id"
         :class="className"
         :style="{ height, width }" />
  </div>
</template>

<script setup lang="ts">
import * as echarts from 'echarts';

const props = defineProps({
  id: {
    type: String,
    default: 'barChart'
  },
  className: {
    type: String,
    default: ''
  },
  width: {
    type: String,
    default: '100%',
    required: true
  },
  height: {
    type: String,
    default: '100%',
    required: true
  }
});
const options = {
  grid: {
    left: '2%',
    right: '2%',
    // top: '5%',
    bottom: '10%',
    containLabel: true
  },
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'cross',
      crossStyle: {
        color: '#999'
      }
    }
  },
  legend: {
    x: 'center',
    y: 'bottom',
    data: ['收入', '毛利润', '收入增长率', '利润增长率'],
    textStyle: {
      color: '#999'
    }
  },
  xAxis: [
    {
      type: 'category',
      data: ['浙江', '北京', '上海', '广东', '深圳'],
      axisPointer: {
        type: 'shadow'
      }
    }
  ],
  yAxis: [
    {
      type: 'value',
      min: 0,
      max: 10000,
      interval: 2000,
      axisLabel: {
        formatter: '{value} '
      }
    },
    {
      type: 'value',
      min: 0,
      max: 100,
      interval: 20,
      axisLabel: {
        formatter: '{value}%'
      }
    }
  ],
  series: [
    {
      name: '收入',
      type: 'bar',
      data: [7000, 7100, 7200, 7300, 7400],
      barWidth: 20,
      itemStyle: {
        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
          { offset: 0, color: '#83bff6' },
          { offset: 0.5, color: '#188df0' },
          { offset: 1, color: '#188df0' }
        ])
      }
    },
    {
      name: '毛利润',
      type: 'bar',
      data: [8000, 8200, 8400, 8600, 8800],
      barWidth: 20,
      itemStyle: {
        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
          { offset: 0, color: '#25d73c' },
          { offset: 0.5, color: '#1bc23d' },
          { offset: 1, color: '#179e61' }
        ])
      }
    },
    {
      name: '收入增长率',
      type: 'line',
      yAxisIndex: 1,
      data: [60, 65, 70, 75, 80],
      itemStyle: {
        color: '#67C23A'
      }
    },
    {
      name: '利润增长率',
      type: 'line',
      yAxisIndex: 1,
      data: [70, 75, 80, 85, 90],
      itemStyle: {
        color: '#409EFF'
      }
    }
  ]
};
const initEcharts = () => {
  console.log('123');
  echarts.init(document.getElementById(props.id) as HTMLDivElement).dispose(); //先销毁

  // 图表初始化
  var chart = echarts.init(document.getElementById(props.id) as HTMLDivElement);

  chart.setOption(options);

  // 大小自适应
  setTimeout(() => {
    //由于网格布局拖拽放大缩小图表不能自适应,这里设置一个定时器使得echart加载为一个异步过程
    console.log('111');
    chart.resize();
  }, 0);
};

watch(
  () => props,
  (newVal, oldVal) => {
    console.log('监听传值', newVal);
    initEcharts();
  },
  {
    deep: true
  }
);

onMounted(() => {
  console.log('图表初始化');
  initEcharts();
});
</script>
<style lang="scss" scoped>
.box {
  width: 100%;
  height: 100%;
  background: #fff;
}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3拖拽布局+动态组件+自适应布局 的相关文章

  • 华为交换机恢复出厂设置

    华为交换机恢复出厂设置 方法一 xff1a 已知用户名和密码场景 lt SW gt reset saved configuration Warning The action will delete the saved configurati
  • 常用网络工具5:网络抓包工具wireshark

    Wireshark xff08 前称Ethereal xff09 是一个网络数据包分析软件 网络数据包分析软件的功能是截取网络数据包 xff0c 并尽可能显示出最为详细的网络数据包数据 Wireshark使用WinPCAP作为接口 xff0
  • OpenHarmony 3.0 虚拟机开发环境

    本文介绍一种简单的OpenHarmony环境搭建方法 首先我们要知道环境搭建包括哪些内容 xff0c 这样我们才好知道如何去搭建 通常来说 xff0c 环境搭建包括这3大部分 xff1a 代码编写 代码编译 代码下载 烧录程序 在OpenH
  • 程序员如何更好的提升自己

    首先你得明白 xff0c 一个人的能力就像一个池塘 xff0c 不断的输入又不断地输出 xff0c 水池的容量以及水的质量决定了输出的高效与否 xff0c 输入大于输出 xff0c 你的池塘就会不断扩大 xff0c 换句话说你会的技能就越来
  • error:D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题解决

    VS调试中出现上述问题 进入 项目 gt 属性 gt C C 43 43 xff08 1 xff09 gt 常规 gt 调试信息格式 gt 选择 程序数据库 Zi 或 无 xff08 2 xff09 gt 代码生成 gt 启用函数集链接 g
  • Linux驱动程序开发用户态和内核态 模块机制

    Linux驱动程序开发 用户态和内核态 Linux操作系统分为用户态和内核态 用户态处理上层的软件工作 内核态用来管理用户态的程序 xff0c 完成用户态请求的工作 驱动程序与底层的硬件交互 xff0c 所以工作在内核态 Linux操作系统
  • QT学习第一步 QT下载及安装详细步骤

    下载地址 xff1a QT官方网站 QT下载安装地址 选择的这个 xff1a QT下载安装地址 文件名称选择 xff0c 图中红色箭头详解 xff1a 选择archive QT开发工具安装包文件夹 xff1a 进入之后显示的文件夹 xff1
  • RT-Thread临界段的保护

    临界段的保护 什么是临界段 临界段 xff0c 用一句话概括就是一段在执行时不能被中断的代码段 在RT Thread中 xff0c 临界段最常出现的场景就是对全局变量的操作 xff0c 全局变量就好像是一个靶子 xff0c 谁都可以对其开枪
  • Oracle中expdp与impdp--导入和导出操作步骤

    Oracle expdp 与impdp 一 根据用户导出导入数据 用户和表空间都相同 这些命令必须在Oracle 工具执行 create directory dpdata1 as E oracle home product backup 这
  • 编写Linux设备驱动程序的注意事项

    编写设备驱动程序的注意事项 应用程序开发与驱动程序开发的差异 在Linux上的程序开发一般分为两种 xff0c 一种是内核及驱动程序开发 xff0c 另一种是应用程序开发 这两种开发种类对应Linux的两种状态 xff0c 分别是内核态和用
  • 单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案

    基于STM32 BLDC直流无刷电机控制器设计 xff0c 并附上原理图和源码等 源代码是基于免费开源CoOS UCOS类似 操作系统上写的 xff0c 在学习无刷电机的控制同时还能学习到操作系统的知识 同时提供用Matlab的GUI编写的
  • 构建嵌入式Linux操作系统 Linux操作系统的介绍

    目前流行的嵌入式操作系统有Linux WinCE VxWorks等 Linux作为一种免费的类UNIX操作系统 xff0c 由于其功能强大 xff0c 在嵌入式产品的应用中非常广泛 Linux操作系统的介绍 Linux操作系统 Linux操
  • Linux内核子系统 内核配置选项

    Linux内核子系统 编写设备驱动程序 xff0c 涉及Linux内核的许多子系统 xff0c 了解这些子系统对于了解Linux操作系统和编写设备驱动程序都非常有用 这些主要的子系统包括进程管理 内存管理 文件管理 设备管理和网络管理 现对
  • Linux命令格式 帮助信息 man命令笔记

    命令的格式 打开终端的方式 ubuntu中的命令基本都是在终端执行的 1 桌面右击打开终端 2 ctrl 43 alt 43 t 3 搜索框 终端提示符 stu 64 shy virtual machine stu xff1a 用户名 sh
  • Linux系统 自动补全管道命令学习

    自动补全 输入命令的一部分 xff0c 然后按tab键 xff0c 就自动补全命令 xff0c 如果有多个相同开头的命令多按一次tab键 xff0c 它会将所有你输入开头的命令提示出来 例 xff1a ifconfig 输入 if 按两下t
  • C++简介 C语言编程原理

    C 43 43 简介 C 43 43 融合了3种不同的编程方式 xff1a C语言代表的过程性语言 C 43 43 在C语言基础上添加的类代表的面向对象语言 C 43 43 模板支持的泛型编程 本章将简要介绍这些传统 不过首先 xff0c
  • FTP命令不同系统之间传输文件

    有时可能需要在不同的系统 xff08 甚至不同类型的操作系统 xff09 之间传输文件 xff0c 如将微软的Windows系统中的文件传给Linux或UNIX系统 xff0c 或反过来将Linux或UNIX系统中的文件传给微软的Windo
  • NFC技术的定义通信方式

    NFC技术的定义 什么是NFC NFC xff08 Near Field Communication xff0c 近场通信 xff09 xff0c 是一种工作频率为13 56MHz xff0c 通信距离只有0 xff5e 20cm xff0
  • RFID系统工作原理

    RFID系统由两部分组成 xff0c 其工作原理 xff1a 应答器 xff1a 也称为电子标签 xff0c 由天线 耦合元件及芯片组成 一般来说 xff0c 都是用标签作为应答器 每个标签具有唯一的电子编码 xff0c 附着在物体上标识目
  • 一台linux服务器配置两个tomcat安装包

    准备前 xff1a 一台linux服务器 2个tomcat7应用包 xff08 tomcat 7 0 56 tomcat idc 开始配置 xff1a tomcat idc应用jdk配置绝对路径 tomcat 7 0 56应用jdk配相对路

随机推荐

  • NFC通信基本原理 主动和被动通信

    NFC通信基本原理 近场通信原理 对于天线产生的电磁场 xff0c 根据其特性的不同 xff0c 划分为三个不同的区域 xff1a 感应近场 辐射近场和辐射远场 它们主要通过与天线的距离来区分 感应近场区指最靠近天线的区域 在此区域内 xf
  • NFC协议概述

    NFC协议概述 NFC相关的标准化组织 ISO 国际标准化组织 xff08 International Organization for Standardization xff09 简称ISO xff0c 是世界上最大的非政府性标准化机构
  • 计算机网络

    计算机网络 计算机网络是利用通信线路和通信设备 xff0c 把地理上分散并且具有独立功能的多个计算机系统互相连接 xff0c 按照网络协议进行数据通信 xff0c 通过功能完善的网络软件实现资源共享的计算机系统集合 计算机网络的功能 计算机
  • html标签手册

    完整的HTML页面 x1f4d1 基础标签 x1f4d1 x1f4d1 x1f4d1 HTML lt DOCTYPE gt 声明 DOCTYPE声明必须是 HTML 文档的第一行 xff0c 位于 html标签之前 DOCTYPE 声明不是
  • BCD码的作用和实现

    内容部分摘抄于朱有朋老师 BCD码本质是对数字的一种编码 xff0c 用来解决这种问题 xff1a 由56得到0x56 或者反过来 也就是说我们希望十进制的56被编码成56 xff08 这里56不是十进制的56 xff0c 而是两个数字5和
  • window和虚拟机(Linux)通过串口通讯

    准备工具 虚拟串口驱动 虚拟机 xff08 我的是乌班图版本 xff09 串口调试助手 xff08 以上网上自己找来下载 xff09 利用虚拟机串口驱动添加2个虚拟串口 xff08 com1和com2 xff09 xff0c 然后打开串口调
  • 关于‘QByteArray::operator QNoImplicitBoolCast() const’ is private

    home hins Qt5 9 8 5 9 8 gcc 64 include QtCore qbytearray h 436 error QByteArray operator QNoImplicitBoolCast const is pr
  • Linux创建虚拟CAN

    创建 xff1a 加载vcan内核模块 sudo modprobe vcan创建虚拟CAN接口 sudo ip link add dev can0 type vcan xff08 can0就是你要创建的设备 xff09 将虚拟CAN接口处于
  • 解决ubuntu20.04 连接xshell显示ssh拒绝服务

    近两天在弄linux系统 xff0c 突然xshell就连接不上了 xff0c 连接的时候一直显示ssh拒绝访问 折腾几个小时总算解决了 xff0c 现对其进行记录 报错情况 xff1a 手动分界效果 首先看下本机IP和虚拟机设置的IP是否
  • C++文件的建立

    C 43 43 文件的建立 include include int main using namespace std ofstream ofs jar txt ios out ofs lt lt 小明 lt lt endl ofs lt l
  • DB2数据库的安装-for linux

    DB2的安装 1 安装DB2服务端 将db2v8 iso文件 FP6 tar 安装响应文件db2ese rsp 复制到 home install 目录下 root cd home install mkdir iso fp root moun
  • ROS学习笔记-Gazebo安装与闪退、卡顿问题解决

    1 安装 在安装完整版的ROS后 xff0c 就包括了Gazebo的安装了 xff0c 因此在终端输入下载指令时 xff0c 出现已存在的反馈信息 安装完整版ROS的指令是 xff1a sudo apt get install ros me
  • win10+vs2015+Intel RealSense D435i深度相机配置

    第一步 xff1a Intel RealSense D435i的SDK下载 链接 xff1a https pan baidu com s 1sIDlkbk8U9PFmJLhGJndxg 提取码 xff1a lppa 第二步 xff1a 测试
  • Vue中使用element-ui的el-dialog对话框,实现拖拽效果

    效果图 xff1a element ui的el dialog对话框 xff0c 没有拖拽移动的效果 xff0c 需要自定义指令来实现对话框拖拽 1 准备 xff1a 在准备一个vue组件 xff08 点击按钮弹出对话框 xff09 功能 x
  • 前端知识点(六):网页中有大量图片时加载很慢,如何优化?

    1 图片懒加载 在图片未可视区域加一个滚动条事件 xff0c 判断图片位置与浏览器顶端和页面的距离 xff0c 当图片到浏览器顶端的距离 xff0c 小于图片到页面的距离时 xff0c 优先加载 2 图片预加载 将当前展示图片的前一张和后一
  • 请求类型get,delete,post,put 的用法(传参)

    1 get delete传参 注意 xff1a xff08 1 xff09 传参格式 xff1a 96 URL key 61 value amp key2 61 value2 96 xff08 2 xff09 注意使用反引号 xff0c 而
  • 关于前端--RSA加密(对登录密码加密)

    安装 npm install jsencrypt 1 在utils文件中封装一个jsencrypt js文件 密匙对生成链接 xff1a http web chacuo net netrsakeypair import JSEncrypt
  • Vue+Uniapp实现直播功能(推流拉流)

    提示 xff1a 前言 目前有一个项目 需要做一个APP和一个PC端网页 xff0c 主要功能是类似直播 xff0c 经查阅资料 xff0c 可采用uniapp 43 vue 43 推流拉流的技术 xff0c 前端使用uniapp打开摄像头
  • web菜单--自定义样式

    1 文件src styles variables scss 定义变量 sidebar menuText var menuText bfcbd9 menuActiveText var menuActiveText 409EFF subMenu
  • vue3拖拽布局+动态组件+自适应布局

    1 拖拽布局插件 Vue Grid Layout 适用Vue js的栅格布局系统 可拖动和可调整大小栅格布局的Vue组件 https jbaysolutions github io vue grid layout zh 在package j