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

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
数据可视化DataV,5个大屏 1个月
简介: 用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中的大屏数据可视化组件,并将其整合到大屏页面中。根据实际需要,你还可以添加更多的交互逻辑、样式和组件来提升用户体验和数据展示效果。

相关实践学习
Github实时数据分析与可视化
基于Github Archive公开数据集,将项目、行为等20+种事件类型数据实时采集至Hologres进行分析,并搭建可视化大屏。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
3天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
3天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
3天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
3天前
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
3天前
|
JavaScript
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
该博客文章介绍了如何在Vue 2框架下实现前后端分离的商品信息展示和详情页跳转,包括排序筛选、详情展示、加入购物车和分享功能。
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
|
3天前
|
JavaScript
如何查看Vue使用的版本
这篇文章介绍了如何在项目中查看Vue及其相关库的版本信息,比如element-ui和element-china-area-data。要查看Vue的版本,需要查看项目中的`package.json`文件,在`dependencies`部分可以找到Vue的版本号。如果需要查询不同版本的兼容性,可以访问相应的官方文档或资源网站。
|
3天前
|
存储 JavaScript 前端开发
Vue中如何通过三元运算符来展示不同的操作
这篇文章讲述了在Vue中如何使用三元运算符结合v-if指令来根据订单的不同状态展示不同的操作按钮,例如在待发货状态显示退款按钮,在待付款或完成状态显示删除按钮。
|
JavaScript 数据安全/隐私保护
work02_vue页面打印水印
work02_vue页面打印水印
317 0
work02_vue页面打印水印
|
3天前
|
JavaScript 编译器
成功解决:Module build failed: Error: Vue packages version mismatch
这篇文章记录了解决Vue项目中遇到的"Module build failed: Error: Vue packages version mismatch"错误的步骤,原因是项目中Vue依赖的版本不一致,解决方法是删除`node_modules`后重新安装指定版本的Vue和`vue-template-compiler`,确保版本匹配,最终成功运行项目。
成功解决:Module build failed: Error: Vue packages version mismatch
|
3天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用