讲讲项目里的仪表盘编辑器(三)布局组件

这篇具有很好参考价值的文章主要介绍了讲讲项目里的仪表盘编辑器(三)布局组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

布局容器处理

        看完前面两章的讲解,我们对仪表盘系统有了一个大概的理解。接着我们讲讲更深入的应用。

        上文讲解的编辑器只是局限于平铺的组件集。而在编辑器中,还会有一种组件是布局容器。它允许其他组件拖拽进入在里面形成自己的一套布局。典型的有分页卡、布局容器等组件。

讲讲项目里的仪表盘编辑器(三)布局组件,三叠云项目,编辑器,前端,html,javascript,vue.js

布局组件的放置

        与前两章提到的普通组件一致。

放置后添加普通组件到布局组件内

        添加普通组件到布局组件内有两种方式:

        第一种:点击添加(选用先选中布局组件)

        怎么实现选中布局组件可以看前面的文章。选中后仓库state的selectedField为当前高亮的布局组件。

        点击添加普通组件,根据仓库里的selectedField判断是否当前选中了布局组件,如果选中,则往选中的布局组件里添加普通组件,如果没有选中的组件或者选中的组件不是布局组件,则按前面章节的点击添加组件生成默认布局属性进入到整体布局之中。

async handleClickAddField(type) {
    // 布局组件类型
    const limitType = [
      // 布局容器
      DashboardControlTypeEnum.Container,
     // 分页卡
      DashboardControlTypeEnum.Tabs,
    ];
    // 创建普通组件
    let field = createDashboardField(type);
    // 当前选择了组件,且选择的组件是布局组件
    if (this.selectedField && limitType.includes(this.selectedField.type)) {
      // 新增的普通组件添加父组件属性
      field.parentId = this.selectedField.pkId;
    }
    ...

}

        上面的代码。只是判断了添加方式为往现有布局组件里添加了普通组件。

        我们先看看如果是嵌套布局(布局容器里有普通组件),此时的this.layout是什么样的?

讲讲项目里的仪表盘编辑器(三)布局组件,三叠云项目,编辑器,前端,html,javascript,vue.js

        现在这个设计器里只有一个布局容器,布局容器里有一个普通组件

讲讲项目里的仪表盘编辑器(三)布局组件,三叠云项目,编辑器,前端,html,javascript,vue.js

        此时this.layout只有一个元素。也就是说grid-layout不承认重叠关系。那么这个画中画是怎么实现的呢?讲讲项目里的仪表盘编辑器(三)布局组件,三叠云项目,编辑器,前端,html,javascript,vue.js

         也就是布局组件自己内部是个grid-layout,拖拽进去的普通组件被存储到布局组件自身属性上。设计器的grid-layout不关心布局组件内部有多少普通组件,也不关心布局组件内部普通组件怎么排列。

// 最外层布局的组件排列
var layoutFieleds = [
    // 布局组件
    {
        layout:{x:0,y:0,w:30,h:30},
        // 自身属性
        widget: {
            // 布局组件内的组件排列
            layoutFields: [
               layout:{x:0,y:0,w:10,h:10},
               ....
            ]
        }
    }
]

         那么布局组件的内部怎么实现,我们放到后面讲

         第二种:拖拽添加

        拖拽模型是这样:

讲讲项目里的仪表盘编辑器(三)布局组件,三叠云项目,编辑器,前端,html,javascript,vue.js

// index.vue
<div>
    <a-card>
          <control-list :dragType.sync="dragType" @add="handleClickAddField" />
    </a-card>
    <a-card :class="$style.main">
          <drag-container
            :dragType.sync="dragType"
          />
     </a-card>
</div>


dragType = null;
// control-list.vue

...
 <div :class="$style.list">
        <div
          v-for="control in group.list"
          :key="control.type"
          :draggable="true"
          @dragstart="handleDragStart(control.type)"
          @dragend="handleDragEnd"
          @click.stop="handleAdd(control)"
        >
          <x-icon :type="control.icon" />
          <span>{{ control.label }}</span>
        </div>
</div>

  handleDragStart(type) {
      this.$emit('update:dragType', type);
  }

  handleDragEnd() {
      this.$emit('update:dragType', null);
  }

        左边的组件栏拖拽事件只要关注抛出的dragType就行了(要么是空要么是拖拽过去的组件类型)

        index.vue负责把dragType传入到<drag-container>组件里。其他不理会。

// drag-container.vue
<grid-layout
          @dragover.native="handleDrag"
          @dragleave.native="handleDragLeave"
          @drop.native="handleDrop"
        >
          <grid-item
            v-for="layoutItem in layout"
            :key="layoutItem.i"
            v-bind="getLayoutProps(layoutItem)"
          >
           <component
             :is="getComponent(layoutItem)"
             v-bind="getComponentProps(layoutItem)"
             @inChildComponent="inChildComponent"
            />
          </grid-item>
</grid-layout>

        可以看到,拖拽到布局容器里也是在grid-layout层里处理,而不是gird-item层中特殊处理。

        要看gird-layout上三个drag事件之前,我们需要先搞懂一个叫isInChildCom属性的判断逻辑

// drag-container.vue
@Watch('dragType')
handleDragTypeChange(type) {
    this.isInChildCom = false; // 重新拖动需要重置
    ...
}

        每次左侧组件栏成功触发/结束拖拽事件,drag-container里的isInChildCom属性就会初始化为false.

        普通组件:

        虽然vue-gird-layout里的item是不支持重叠的。 但是我们依然需要当拖拽组件进入普通组件里面,去emit inChildComponent事件,使drag-cpntainer里的isInChildCom为true。从而阻断后面的放置操作。

// 普通组件
  <div
    @dragenter="dragenter"
    @dragover="dragover"
    @dragleave="dragleave"
    @drop="drop"
  >
   ...
  </div>

  /** @name 进入-有效目标 **/
  dragenter() {
    this.$emit('inChildComponent', true);
  }
 dragleave(e) {
    this.$emit('inChildComponent', false);
 }

         布局组件:

         布局组件也一样。通过改变isInChildCom 的值为ture,让index.vue拦截拖拽事务。把添加组件的逻辑遗留在布局组件内部进行处理。

// 布局组件
  <div
    @dragenter="dragenter"
    @dragover="dragover"
    @dragleave="dragleave"
    @drop="drop"
  >
   ...
  </div>

  /** @name 进入-有效目标 **/
  dragenter() {
    // 当拖拽的组件是布局组件或无效组件时
    if (this.limited) this.$emit('inChildComponent', true);
    this.$emit('inChildComponent', true);
  }
    /** @name 离开-有效目标 **/
  dragleave(e) {
    if (this.limit) return;
    const rect = this.$el.getBoundingClientRect();
    const inside = rectContainPoint(rect, {
      x: e.clientX,
      y: e.clientY,
    });
    // 确认拖拽组件已经离开布局
    if (!inside) {
      this.$emit('inChildComponent', false);
      // 更新内部布局
      this.updateInside(e);
    }
  }
  drop(e) {
    if (this.limit) return
    ...
    // 添加组件到布局组件内部属性
  }

             具体的实现请看最后一篇推文

放置后禁止拖拽布局组件到布局组件内

        上一节已经说到了,在布局组件内部的drop系列事件里通过limit去限制(limit的逻辑就是判断拖拽进来的是不是布局组件)。如果是的话,把isInChildCom改成true拦截index层处理,同时布局组件内部也通过limit拦截处理。

删除布局组件内的普通组件

        由布局组件内部控制。详情请最后一篇推文文章来源地址https://www.toymoban.com/news/detail-727938.html

到了这里,关于讲讲项目里的仪表盘编辑器(三)布局组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Grafana增加仪表盘

    grafana 是一款采用Go语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。 Grafana下载地址:https://grafana.com/grafana/download Grafana仪表盘模板下载地址:https://grafana.com/grafa

    2024年02月04日
    浏览(35)
  • 新版Grafana仪表盘

    一 Grafana 是什么         Grafana 是一个开源的指标量监测和可视化工具,常用于展示基础设施的时序数据和应用 程序运行分析。         官网指路: https://grafana.com/         与前文相关的两个概念:         1)数据源(Datasource):定义了将用方式来查询数据展

    2024年02月13日
    浏览(31)
  • ChatGPT实现仪表盘生成

    Grafana是开源社区最流行的数据可视化软件,一定程度上也和 superset 一起被视为 tableau 等商业 BI 的开源替代品,很多IT 团队、科研团队,都会使用 Grafana 来做数据监控、挖掘分析。Grafana社区也有很多贡献者,在 github 上分享自己针对不同场景制作的数据分析仪表盘效果和配置

    2024年02月02日
    浏览(22)
  • QML 仪表盘小示例

    本次项目已发布在CSDN-GitCode,下载方便,安全,可在我主页进行下载即可,后面的项目和素材都会发布这个平台。 个人主页:https://gitcode.com/user/m0_45463480 怎么下载:在项目中点击克隆,windows:zip linux:tar.gz tar # .pro

    2024年02月05日
    浏览(34)
  • Prometheus + Grafana 搭建监控仪表盘

    目标要求 1、需要展现的仪表盘: SpringBoot或JVM仪表盘 Centos物理机服务器(实际为物理分割的虚拟服务器)仪表盘 2、展现要求: 探索Prometheus + Grafana搭建起来的展示效果,尽可能展示能展示的部分。 监控系统核心:prometheus-2.45.0.linux-amd64.tar 下载地址:https://github.com/prometheus

    2024年04月23日
    浏览(38)
  • 15. Canvas制作汽车油耗仪表盘

    1. 说明 本篇文章在14. 利用Canvas组件制作时钟的基础上进行一些更改,想查看全面的代码可以点击链接查看即可。 效果展示: 2. 整体代码

    2024年02月11日
    浏览(30)
  • QPaint绘制自定义仪表盘组件01

    网上抄别人的,只是放这里自己看一下,看完就删掉 ui Dashboard.pro  mainwindow.h  mainwindow.cpp main.cpp 

    2024年02月22日
    浏览(28)
  • 安装istio和部署实例以及仪表盘

    安装Istio 接下来我们将介绍如何在 Kubernetes 集群中安装 Istio,这里我们使用的是最新的 1.10.3 版本。 下面的命令可以下载指定的 1.10.3 版本的 Istio: 如果安装失败,可以用手动方式进行安装,在 GitHub Release 页面获取对应系统的下载地址: 其中 samples/ 目录下面是一些示例应用程

    2024年02月13日
    浏览(33)
  • 纯JS+Vue实现一个仪表盘

    在使用canvas的时候发现数值变化,每次都要重新渲染,值都从0开始,这和我的需求冲突。 利用 border-radius ,就可将正方形变成圆形 一共100个值,每两个刻度就要有线,到10线的长度会更长一点。其实和画钟表一样,0的位置是坐标轴的225°,到100的位置,总共是180°+45° 静下心

    2024年02月14日
    浏览(39)
  • 【监控仪表系统】Grafana 中文入门教程 | 构建你的第一个仪表盘

    Grafana 读音:/grəˈfɑːnˌɑː/ 在大厂工作久了,时常对一些工具的存在觉得理所当然。 比如说,需要计算资源的时候,一个配置文件就可以要来两百台虚拟化好的机子。需要试下缓存?点下鼠标就可以要到几十个配置好的 Redis 结点。 最省心的是,这些工具都已经根据工作流

    2024年02月02日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包