用Vue搭建一个大屏数据可视化页面实战二(Vue实战系列)

简介: 用Vue搭建一个大屏数据可视化页面实战二(Vue实战系列)


接上文

把之前写的代码抽离成组件

把之前写的一个个的panel抽离成组件,方便后期复用,形状功能类似的我们考虑把他们统一封装成组件

whr-panel-c1为例

<!--whr-panel-c1  2021/4/15 @王浩然QQ378237242-->
<template>
  <div class="panel-hezi" ref="panelhezi">
    <div class="panel-hezi-background"></div>
    <!--    <svg class="svg-head"  preserveAspectRatio="xMaxYMax" viewBox="0,0,100,100" v-if="type=='triangle'">-->
    <svg class="svg-triangle-head" preserveAspectRatio="xMaxYMax" :viewBox="`0,0,${tipSize.width},${tipSize.height}`"
         v-if="type=='triangle'">
      <defs>
        <linearGradient :id="randomId" x1="0%" y1="0%" x2="0%" y2="100%">
          <stop offset="0%" :style="{stopColor:tipColor[0],stopOpacity:1}"/>
          <stop offset="100%" :style="{stopColor:tipColor[1],stopOpacity:1}"/>
        </linearGradient>
      </defs>
      <!--      <path d="M 0 0 l 90 0 l -90 90" :fill="`url(#${randomId})`"></path>-->
      <path :d="dpath" :fill="`url(#${randomId})`"></path>
    </svg>
    <div class="rectangle-head" v-if="type=='rectangle'">
      <div class="rectangle-head-box">
        <div>
          <img class="hezi-rectangle-icon" :src="tipIcon">
        </div>

        <div style="display: table">
          <div class="title" style="display: table-cell;vertical-align: middle">{{ title }}</div>
        </div>
      </div>
    </div>
    <img class="hezi-triangle-icon" :src="tipIcon" v-if="type=='triangle'">

    <div class="panel-hezi-triangle-title" v-if="type=='triangle'">
      <div class="title flex">
        <div class="triangle-title">{{ title }}</div>
        <div style="width: 100%;overflow: hidden">
          <svg preserveAspectRatio="xMaxYMax" :viewBox="`0,0,${panelSize.width - tipSize.width - 20},50`">
            <polyline points="0,15 50,15 60,10,65,18 70,15 90,15 95,5 100,25 105,15 120,15 130,15 140,5 150,20 160,15 190,15,200,8 210,20 220,15 230,15 250,15"
                      style="fill:none;stroke:white;stroke-width:1.5" />
            <!--          <path :d="dpath" :fill="`url(#${randomId})`"></path>-->
          </svg>
        </div>

      </div>
    </div>
    <div class="panel-hezi-triangle-body" v-if="type=='triangle'">
      <slot name="tbody"></slot>
    </div>
    <div class="panel-hezi-rectangle-body" v-if="type=='rectangle'">
      <slot name="tbody"></slot>
    </div>
  </div>
</template>

调用whr-panel-c1组件

  <whr-panel-c1 :tip-icon-size="{width:90,height:90}" :tip-size="{width:200,height:150}"
                    :tip-color="['#f61792','#c0d7e3']" :tip-icon="require('@/views/网络.svg')">
        <template v-slot:tbody>
          123
        </template>
      </whr-panel-c1>
      <whr-panel-c1 :panel-size="{width:200,height:200}" :tip-color="['#2a529d','#990ef1']"
                    :tip-icon="require('@/views/环动.svg')"></whr-panel-c1>
      <whr-panel-c1 type="triangle" :tip-size="{width:200,height:150}" :tip-color="['#f61792','#c0d7e3']"
                    :tip-icon="require('@/views/网络.svg')">
        <template v-slot:tbody>
          123
        </template>
      </whr-panel-c1>
      <whr-panel-c1 type="triangle" :tip-color="['#2a529d','#990ef1']"
                    :tip-icon="require('@/views/环动.svg')"></whr-panel-c1>

所涉及到的参数:

props: {
    //种类呗:triangle三角形rectangle矩形
    type: {
      required: true,
      type: String,
      default: "rectangle"
    },
    title: {
      type: String,
      default: "标题"
    },
    //背景色一个数组,传入俩颜色渐变
    backgroundColor: {
      type: Array,
      default: function () {
        return ["#1d6bfc", "#1eb1fd"]
      }
    },
    panelSize: {
      required: true,
      default: function () {
        return {
          width: 400,
          height: 300
        }
      }
    },
    //tip尺寸
    tipSize: {
      type: Object,
      default: function () {
        return {
          width: 100,
          height: 100
        }
      }
    },
    //tip
    tipIconSize: {
      type: Object,
      default: function () {
        return {
          width: 32,
          height: 32
        }
      }
    },
    //图标区域颜色,渐变色
    tipColor: {
      type: Array,
      default: function () {
        return ["#51acf6", "#59d6e3"]
      }
    },
    //图标
    tipIcon: {
      type: String,
      default: ""
    }
  },

这样我们所涉及到的参数基本都可以调整。

重写组织页面页面排版

这里遇到一个问题

谷歌浏览器里的样式



火狐浏览器里面没有问题。

这是什么原因,有小伙伴知道吗?

在Vue中搭建一个大屏数据可视化页面,通常涉及到组件的开发与整合。这里,我们将通过实战二来演示如何开发Vue组件,并整合到大屏页面中。

实战二:组件开发

步骤一:创建Vue组件

首先,在Vue项目中创建一个新的组件,比如DataVisualization.vue。这个组件将用于封装大屏数据可视化的逻辑和样式。

<template>
  <div class="data-visualization">
    <!-- 在这里添加数据可视化的图表元素 -->
  </div>
</template>

<script>
export default {
  name: 'DataVisualization',
  props: {
    // 定义传入的属性,比如数据、配置等
  },
  data() {
    return {
      // 组件内部数据
    };
  },
  mounted() {
    // 组件加载完成后执行的逻辑,比如初始化图表等
  },
  methods: {
    // 定义组件的方法
  }
};
</script>

<style scoped>
.data-visualization {
  /* 在这里添加组件的样式 */
}
</style>

步骤二:添加图表库

大屏数据可视化通常需要使用图表库来展示数据。你可以选择使用ECharts、Chart.js、D3.js等流行的图表库。

以ECharts为例,你可以通过npm安装ECharts:

npm install echarts --save

然后在组件中引入ECharts,并创建一个图表实例:

<template>
  <div class="data-visualization" ref="chartContainer"></div>
</template>

<script>
import * as echarts from 'echarts';

export default {
  // ...
  mounted() {
    this.initChart();
  },
  methods: {
    initChart() {
      // 基于准备好的dom,初始化echarts实例
      const myChart = echarts.init(this.$refs.chartContainer);
      // 绘制图表
      myChart.setOption({
        // 在这里配置图表选项
      });
    }
  }
};
</script>

步骤三:封装组件属性和方法

为了让组件更加通用和可复用,你可以封装组件的属性和方法。

比如,你可以定义一个chartData属性来接收父组件传入的数据,然后在组件内部使用这些数据来渲染图表:

<script>
export default {
  // ...
  props: {
    chartData: {
      type: Object,
      required: true
    }
  },
  methods: {
    initChart() {
      const myChart = echarts.init(this.$refs.chartContainer);
      myChart.setOption(this.getChartOption(this.chartData));
    },
    getChartOption(data) {
      // 根据传入的数据生成ECharts的配置选项
      return {
        // ...
      };
    }
  }
};
</script>

步骤四:在父组件中使用

最后,在父组件中使用DataVisualization组件,并传入相应的数据:

<template>
  <div class="dashboard">
    <DataVisualization :chartData="myChartData" />
  </div>
</template>

<script>
import DataVisualization from './DataVisualization.vue';

export default {
  components: {
    DataVisualization
  },
  data() {
    return {
      myChartData: {
        // 在这里准备图表所需的数据
      }
    };
  }
};
</script>

确保你的父组件中有myChartData这个数据属性,并且它的结构是DataVisualization组件所期望的。

通过以上的步骤,你就可以开发出Vue中的大屏数据可视化组件,并将其整合到大屏页面中。根据实际需要,你还可以添加更多的交互逻辑、样式和组件来提升用户体验和数据展示效果。

相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
439 0
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
3月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
313 17
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
161 1
|
3月前
|
JavaScript API 开发者
Vue框架中常见指令的应用概述。
通过以上的详细解析,你应该已经初窥Vue.js的指令的威力了。它们是Vue声明式编程模型的核心之一,无论是构建简单的静态网站还是复杂的单页面应用,你都会经常用到。记住,尽管Vue提供了大量预定义的指令,你还可以创建自定义指令以满足特定的需求。为你的Vue应用程序加上这些功能增强器,让编码变得更轻松、更愉快吧!
61 1
|
3月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
216 0
|
3月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
101 0
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
622 4
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
450 77
|
5月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍