vue中echarts的用法及与elementui-select的协同绑定操作


Posted in Vue.js onNovember 17, 2020

1.vue中echarts的使用

引入echarts后

let myChart = echarts.init(document.getElementById('dsm'));//dsm为绑定的dom结构
   var option = {
    //backgroundColor:"#111c4e", 
     tooltip: {
      trigger: 'axis'
     },
     legend: {     //图表上方的图例显隐
      data:['光合有效辐射'],
       textStyle: {
        color: '#fff'
       }
     },
     color:['#E4FD0A'],
     grid: {     //图表里上下左右的空间 间隙
      left: '3%',
      right: '8%',
      bottom: '3%',
      containLabel: true
     },
     xAxis: {        //x轴属性
      type: 'category',
      name: '日期/时间',
      // boundaryGap: false,
      data: this.xZhou,
      axisLine:{
      lineStyle:{color:'#fff'} // x轴坐标轴颜色
      },
      axisLabel: {
       show: true,
       color: '#fff',
       fontSize:12,
       // rotate: 30
      }
     },
     yAxis: {      //y轴属性
      type: 'value',
      name: '光合有效辐射',
      axisLine:{
      lineStyle:{color:'#fff'} // x轴坐标轴颜色
      },
      axisLabel: {
       show: true,
       color: '#fff',
       fontSize:12,
       // rotate: 30
      }
     },
     series: [      //为鼠标在图表中划过时显示的数据
      {
       name:'光合有效辐射',
       type:'line',
       stack: '总量',
       data:this.yZhou,
       lineStyle:{
        normal:{
         color: '#E4FD0A'
        }
       }
      }
     ]
   };
   myChart.setOption(option)
   window.addEventListener("resize", function () { //设置图表因窗口大小的变化进行变化
    myChart.resize();
   });

上述图表的显示效果为:

vue中echarts的用法及与elementui-select的协同绑定操作

2.echarts与elementui-select的协同绑定

实现依据elementui-select的变化而变化图表。

<template>
 <div class="content">
 <div class="contentDetail" v-show="isXM">
 <div class="close" @click="close"></div>
 <div class="chartContent">
    <el-select
     v-model="defaultyAxis"  //利用v-model对默认数据defaultyAxis进行改变,实际绑定的数据是yAxisOption
     placeholder="请选择"
     class="chartSelect"
     popper-class="trsfChartSelect-popper"
     @change="renderChart()"
    >
     <el-option v-for="item in yAxisOption" :key="item" :label="item" :value="item"></el-option>
    </el-select>
 <div id="zsfChart"></div>
 </div>
 </div>
 </div>
</template>
<script>
import { zsfEntity} from '@/api/sfcl.js'

export default {
 name: 'Home',
 data() {
 return {
 isXM: true,
   yAxisOption: ['a', 'b'],
   defaultyAxis: '',
   dataOgj: {},
 }
 },
 mounted() {
  this.$comjs.addSimplePoint([100.62713539843939, 38.620863795306164]) //cesium挂载图标
  this.getChartDataAndRender()
 },
 methods: {
 close() {
   this.isXM = false
 this.$store.commit('getComponent1', '')
  },
  getChartDataAndRender(){ //axios获取异步数据
   var _this = this
   zsfEntity().then(res => {
    if(res.obj.length == 0){
     return
    }
    let keyArr = Object.keys(res.obj[0])
    for (let item of keyArr) {
  _this.dataOgj[item] = []
    }
    for (let item of res.obj) {
  for (let item1 of keyArr) {
  _this.dataOgj[item1].push(item[item1])
  }
    }
    _this.yAxisOption = keyArr.slice(1)//y轴实际数据 四项
    _this.defaultyAxis = _this.yAxisOption[0] //获取y轴默认数据
    _this.renderChart()
   })
  },
  //渲染图表
 renderChart() {
 let myChart = echarts.init(document.getElementById('zsfChart'))
 let option = {
 tooltip: {
  trigger: 'axis',
  axisPointer: {
  type: 'cross',
  label: {
  backgroundColor: '#6a7985'
  }
  }
    },
    legend: {
     data:[this.defaultyAxis],
     textStyle: {
      color: '#fff'
     }
    },
 grid: {
     right: '5%',
     left: '5%'
 },
 color: ['#E4FD0A'],
 xAxis: {
     name: "观测时间",
  type: 'category',
  boundaryGap: false,
     data: this.dataOgj.observeTime,
  axisLabel: {
  color: '#ffffff'
  // fontSize: 10,
  // rotate:30
  },
  axisLine: {
  lineStyle: {
  color: '#ffffff',
  type: 'dashed'
  }
  }
 },
 yAxis: {
     name: this.defaultyAxis,//挂载默认数据
  type: 'value',
  axisLabel: {
  color: '#ffffff',
  fontSize: 10
  // rotate:30
  },
  axisLine: {
  lineStyle: {
  color: '#ffffff',
  type: 'dashed'
  }
  }
 },
 series: [
  {
  data: this.dataOgj[this.defaultyAxis],
      type: 'line',
      name: this.defaultyAxis
  }
 ]
 }
   myChart.setOption(option)
 window.addEventListener('resize', function() {
 myChart.resize()
 })
 }
 },
 destroyed(){
  this.$comjs.removeSimplePoint()
 }
}
</script>
<style lang="stylus">
.trsfChartSelect-popper
 background: rgba(1,64,64,1)
 .el-select-dropdown__item.hover, .el-select-dropdown__item:hover
  background: rgba(0,0,0,0.5)
 .el-select-dropdown__item
  color: #fff
</style>
<style lang="stylus" scoped>
 @import '../../assets/styles/varibles.styl'
.content
 position: absolute
 right: vw(10)
 top:vh(71)
 z-index: 100
 color: #fff
 background: $bgColor
 .contentDetail
  width:vw(1500)
  height:vh(348)
  position: fixed
  right: 70px
  bottom: 27px
  margin:auto
  z-index: 100
  color: #fff
  background: $bgColor
  border: 1px solid rgba(3,240,240,1)
  .close
   position:absolute
   right:vw(15)
   top:vh(10)
   cursor: pointer
   background-image:url("/images/lanhu/close.png")
   width: 20px;
   height: 20px;
   z-index: 1 
  .baseInfo
   height: 75px;
   padding-top: 30px;
   .baseInfo-item
    width: 33%;
    display: inline-block;
    text-align: left;
    margin-bottom: 20px;
    padding-left: 80px;
    .baseInfo-item-icon
     vertical-align: middle
     margin-right: 14px
    .baseInfo-item-text
     vertical-align: middle
  .separator
   height: 1px
   background: #03F0F0
  .chartContent
   height: 100%
   .chartSelect
    position:absolute
    right: 63px
    margin-top: 20px
    width: 150px
    z-index: 1
    /deep/ .el-input__inner
     height: 28px;
     line-height: 28px;
     background:rgba(1,64,64,1);
     border-radius:2px;
     border:1px solid rgba(0,252,252,1);
     color: #fff
    /deep/ .el-input__icon
     line-height: 28px;
   #zsfChart
    height: 100%
    width:100%
</style>

效果实现

vue中echarts的用法及与elementui-select的协同绑定操作

vue中echarts的用法及与elementui-select的协同绑定操作

补充知识:vue项目在同一页面中引入多个echarts图表 ,并实现封装,自适应和动态数据改变

vue-Echarts

公司最近做项目需要用到图表,以前是使用echarts,现在也是用这个,没什么好纠结的! 但是最近发现以前每次做图表之类的都没有封装,每次做图表都要从新去配置之类的,写了好多重复代码,感觉很累啊,所以自己把图表封装成子组件使用,代码工作量减轻了很多,而且子组件使用了数据进行监听和图表自适应屏幕大小,这样以后会方便很多了!

当然公司的项目肯定不能发出来了,我会做个简单的demo出来

先截个图吧!

vue中echarts的用法及与elementui-select的协同绑定操作

其实我也未作什么太复杂的工作,以前工作中,页面中要2个图表,我在methods:{}中写两个方法配置之类的,类似这样子:

vue中echarts的用法及与elementui-select的协同绑定操作

好了,首先第一步,使用echarts当然要引用了

1. vue 项目中 引用echarts

cnpm install echarts -S

执行完毕后再 main.js中引入

vue中echarts的用法及与elementui-select的协同绑定操作

因为是pc端的项目,用了element ui (不重要),引入之后就可以在全局使用了,之前对这个不是很懂,每个要图表页面都引入echarts,就像这个样子:

vue中echarts的用法及与elementui-select的协同绑定操作

使代码写的乱七八糟的,现在在全局引用了,就不需要在每个用图表的页面中引入了

2. 父子组件中使用图表,现在我做的这个页面把他分成两个部分,这个页面整体为父,两个图表为子组件,这样子

vue中echarts的用法及与elementui-select的协同绑定操作

1.先看下父组件代码,样式类的请忽视

vue中echarts的用法及与elementui-select的协同绑定操作

import linegraph from '@/components/linegraph.vue'
export default {
 data(){
 return{
 notAccess:false,
 ChartLineGraph2:null,
 option:{
   title: {
     text: '全年产量趋势图',
     left: 'center'
   },
   tooltip: {
     trigger: 'item',
     formatter: '{a} <br/>{b} : {c}'
   },
   legend: {
     left: 'center',
     data: ['本年', '上年'],
     bottom:0
   },
   xAxis: {
     type: 'category',
     name: 'x',
     splitLine: {show: false},
     data: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
   },
   grid: {
     left: '1%',
     right: '2%',
     bottom: '8%',
     containLabel: true
   },
   yAxis: {
     type: 'category',
     name: 'y',
     splitLine: {show: true},
     data:['10%','20%','30%','40%','50%','60%','70%','80%','90%','100%']   
   },
   series: [
     {
       name: '本年',
       type: 'line',
       data: [0.8, 0.98, 0.96, 0.27, 0.81, 0.47, 0.74, 0.23, .69, 0.25, 0.36, 0.56]
     },
     {
       name: '上年',
       type: 'line',
       data: [1, 0.2, 0.4, 0.8, 0.16, 0.32, 0.64, 1.28, 5.6, 0.25, 0.63, 0.65, 0.12]
     },
   ]
 },
 option2:{
    title: {
     text: '全年设备产量对比图',
     left: 'center'
   },
   xAxis: {
     type: 'category',
     data: ['检品机1', '检品机2', '检品机3', '检品机4', '检品机5', '检品机6', '检品机7']
   },
   yAxis: {
     type: 'value'
   },
   legend: {
     left: 'center',
     data: ['本年', '上年'],
     bottom:0
   },
   grid: {
     left: '1%',
     right: '2%',
     bottom: '8%',
     containLabel: true
   },
   series: [
   {
   name: '本年',
     data: [120, 200, 150, 80, 70, 110, 130],
     type: 'bar',
     barWidth:30,
   },
   {
   name: '上年',
     data: [120, 200, 150, 80, 70, 110, 130],
     type: 'bar',
     barWidth:30,
   }]
 }
   
 }
 },
 mounted(){
 
 },
 components:{
 ErrorTip,
 linegraph,
 }

}

这是父组件代码,两个图表不管是折线图还是柱状图都是使用 linegraph.vue这个子组件来进行的,因为我把echarts图表生成的配置项都放在了父组件里面,然后通过父组件给子组件传值实现图表生成,

3.父组件我们看完了,现在我们看下是如何封装的图表类linegraph.vue子组件,我先截图一下,然后解释:

vue中echarts的用法及与elementui-select的协同绑定操作

这里需要注意一下这几个问题,

第一个: 父子组件传值问题 ,父组件需要传id值和配置项的值给子组件生成图表,通过vue的prop传过来的id和data(配置项) ,具体怎么传值可看父子组件传值代码或百度;

第二点: 我们首先设想这样一个场景: 当父组件的传值 option或者option2 (图表配置项),刚开始在data()里面是设置为option:null,或者是一个空的对象,或者配置项缺少数据这部分,在methods中通过ajax调用接口获取到数据然后赋值给option,例如:this.option = 一个对象,可以成图表之类的,当option值未改变时就把option=null的值传递给了子组件,这样图表生成不了,像这样

vue中echarts的用法及与elementui-select的协同绑定操作

vue中echarts的用法及与elementui-select的协同绑定操作

数据不能动态传值 ,数据不能动态传值! 要解决这个问题,必须用到vue watch的对象深度监听,我之前写了一篇watch,正好用上了

vue中echarts的用法及与elementui-select的协同绑定操作

对子组件接受到的data(配置项)进行深度监听,当父组件通过ajax改变了传过来的data的值,图表将会重新渲染。

3.第三个问题

图表自适应,当屏幕大小改变时,图表也需要进行自适应,本来挺简单的东西,被我头脑转不过来,搞了一个小时,总算搞好了啊,其实之前写的就是在 子组件的 drawLineGraph()方法里面写入一个方法,这个方法

window.onresize =this.ChartLineGraph.resize;

还是出问题了,这个页面两个图表,结果只有后面的图表会自适应,前面的那个没反应???,我就蒙了,还以为自己方法写错了,真是蛋疼, 改成这样,那个this一定要注意,我就是搞错对象了,然后两个图表都可以自适应

vue中echarts的用法及与elementui-select的协同绑定操作

好吧,这是我封装的echarts组件,没有进行ajax的对接操作,如果有问题,欢迎留言!

以上这篇vue中echarts的用法及与elementui-select的协同绑定操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
详解Vue router路由
Nov 20 Vue.js
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
vue项目支付功能代码详解
Feb 18 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
vue特效之翻牌动画
Apr 20 Vue.js
Vue Element plus使用方法梳理
Dec 24 Vue.js
vue+iview实现分页及查询功能
Nov 17 #Vue.js
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 #Vue.js
vue+iview分页组件的封装
Nov 17 #Vue.js
在vue中通过render函数给子组件设置ref操作
Nov 17 #Vue.js
vue+vant实现购物车全选和反选功能
Nov 17 #Vue.js
vue使用vant中的checkbox实现全选功能
Nov 17 #Vue.js
vue中音频wavesurfer.js的使用方法
Feb 20 #Vue.js
You might like
单位速度在实战中的运用
2020/03/04 星际争霸
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
vue-router单页面路由
2017/06/17 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
python实现简单的tcp 文件下载
2020/09/16 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
Python实现淘宝秒杀功能的示例代码
2021/01/19 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
会计毕业自我鉴定
2014/02/05 职场文书
安全目标管理责任书
2014/07/25 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python