Echarts 的食用方式

栏目: 数据库 · 发布时间: 5年前

内容简介:虽说如此,但是因此就来专门讲一讲这配置项的坑以及如何通过组件的方式正确的”食用“。
Echarts 的食用方式

ECharts ,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上。可以这么说,在国内,是个前端都知道这个玩意是干嘛用的,毕竟它还是出自于国人之手。

虽说如此,但是 Echarts 涵盖的类型实在是太广了,它给我们提供了很多配置项,但呼之而来的问题是会有点让刚接触的人有点茫然… 哪些参数是必要的?哪个参数又跟什么地方的 key 值相对应,缺失后就无法正常的显示…

因此就来专门讲一讲这配置项的坑以及如何通过组件的方式正确的”食用“。

其实 Echarts 也有自己的使用教程,但本文的重心并不是从零开始讲解 Echarts ,至于更多使用细节可以看官方的 文档

这里姑且先用折线图作示例。首先需要先引入 ECharts , 我们选择好自己所需的版本后(tips: 如何选择版本,可以去看看 这里 ),然后在 </body> 前插入脚本: <script src="echarts.min.js"></script>

随后通过 echarts 提供的 API 初始化目标容器节点:

// 初始化 echarts
var myChart = echarts.init(document.getElementById('main'));

接着我们需要填写配置项:

var config = {
  // 全局 tooltip ,
  tooltip: {
    show: true,
    // 坐标轴触发
    trigger: 'axis'
  },
  // 图例组件,也就是提供显示或隐藏某一条数据信息开关
  legend: {
    // 组件在底部显示
    bottom: '0px',
    // 图例每项之间的间隔
    itemGap: 46,
    // 图例的数据数组, 省略则自动从 series.name 中获取
    // 但我们需要定制样式,因此我们添上去上去
    data: [
      {
        name: '曝光量',
        icon: 'circle'
      },
      {
        name: '点击量',
        icon: 'circle'
      }
    ],
    // 文字样式
    textStyle: {
      color: '#276dcc',
      fontSize: 14
    }
  },
  // 重设全局调色盘的颜色,比如当前涉嫌图示例中有两条数据
  // 那这两条数据就会取得我们当前设置颜色作为展示
  color: ['#42a66a', '#276dcc'],
  // 网格布局
  grid: {
    // 下面三个是离容器的位置
    left: '3%',
    right: '4%',
    bottom: '40px',
    // 坐标刻度,默认是false
    containLabel: true
  },
  // X轴配置
  xAxis: {
    type: 'category',
    boundaryGap: false,
    // 坐标轴配置
    axisLine: {
      lineStyle: {
        color: '#d6dfea'
      }
    },
    // 坐标轴上的 label 样式
    axisLabel: {
      margin: 18,
      fontSize: 14,
      color: '#56749d'
    },
    // 类目数据,只有在 type: 'category' 中有效。
    // 一般情况下我们并不会手动写死数据进去,而是通过 Ajax 请求数据来展示
    data: []
  },
  // Y轴配置
  yAxis: [
    {
      // 数值轴
      type: 'value',
      name: '点击量',
      // 左侧显示
      position: 'left',
      // 下面的样式不再多说
      axisLine: {
        lineStyle: {
          color: '#d6dfea'
        }
      },
      axisLabel: {
        margin: 18,
        fontSize: 14,
        color: '#56749d'
      }
    },
    {
      type: 'value',
      name: '曝光量',
      position: 'right',
      axisLine: {
        lineStyle: {
          color: '#d6dfea'
        }
      },
      axisLabel: {
        margin: 18,
        fontSize: 14,
        color: '#56749d'
      }
    }
  ],
  // 系列列表, 这个是数据的关键所在
  series: [
    // 如果 legend.data 设置了数据的话,那么 series 的数目需要和 legend.data 的数目一致。
    // 否则图表会不工作 !!
    {
      name: '点击量',
      // 图表的类型,在这个示例中我们使用是折线图
      type: 'line',
      yAxisIndex: 1,
      // 系列中的数据内容数组
      // 同样的,我们主要展示的数据来自于服务端
      data: []
    },
    {
      name: '曝光量',
      type: 'line',
      // 折线图一维数据可能是这种形式的数组
      // [1, 2, 3, 1, 4]
      data: []
    }
  ]
};

随后可以通过 Ajax 获取数据,再使用 setOption 来设置选项:

$.ajax({
  url: url,
  method: 'GET',
  data: data
}).done(function(res){
  config.series[0].data = res.data.click;
  config.series[1].data = res.data.exposure;
  config.xAxis.data = res.data.xAxis;

  myChart.setOption(option);
});

如此,这样我们定义的 echarts 就完成啦~

Echarts 的食用方式

Vue 组件

vue 中封装组件也不难,大致如下:

<template>
    <div:class="['data-echart', echartClass ]">
        <divclass="data-echart__header">
            <slotname="title">
                <divclass="header__title">
                    <spanv-if="title"class="title-name">{{title}}</span>
                    <el-popover
                        v-if="tooltip"
                        ref="tooltip"
                        placement='bottom'
                        trigger='hover'>
                        <divv-html="tooltip"></div>
                    </el-popover>
                    <iv-if="tooltip"class="el-icon-question"v-popover:tooltip></i>
                </div>
            </slot>
        </div>
        <div:id="echartId"class="echart__main"></div>
    </div>
</template>

<script>
import echarts from 'echarts';

export default {
  name: 'echart',
  props: {
    title: {
      type: String,
      default: ''
    },
    tooltip: {
      type: String,
      default: ''
    },
    echartClass: {
      type: String,
      default: ''
    },
    option: {
      type: Object,
      default() {
        return {};
      }
    },
    loading: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    domEchartId() {
      return (document || window.document).getElementById(this.echartId);
    }
  },
  data() {
    return {
      // 随机生成一个ID
      echartId: this.randomChar(20),
      myChart: null
    };
  },
  watch: {
    option: {
      deep: true,
      handler(newVal) {
        this.update(newVal);
      }
    },
    loading(newVal) {
      this.toggleLoading(newVal);
    }
  },
  mounted() {
    this.init();
  },
  methods: {
    // 调起loading
    toggleLoading(flag) {
      flag ? this.myChart.showLoading() : this.myChart.hideLoading();
    },
    init() {
      this.myChart = echarts.init(this.domEchartId);

      this.myChart.on('click', (params) => {
        this.$emit('clickEchart', params);
      });

      // 绘制图表
      this.myChart.setOption(this.option);
      // Object.keys(this.data).length !== 0 && this.myChart.setOption(this.data);
    },
    update(data) {
      this.myChart.setOption(data);
    },
    /**
     * 生成随机字符串
     * @param { Number } len - 指定随机字符串的长度
     */
    randomChar(len) {
      const x = '0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';

      let tmp = '';
      for (let i = 0; i < len; i++) {
        tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
      }

      return tmp;
    },
  }
};
</script>

<stylelang='scss'scoped>
@import '~Scss/theme';

.data-echart {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.data-echart__header {
  width: 100%;
}
.header__title {
  .title-name {
    font-size: 16px;
    color: $f-color--title;
    font-weight: 600;
  }
  .el-icon-question {
    font-size: 18px;
    color: $f-color--tip;
  }
}
.echart__main {
  flex: 1;
  width: 100%;
  height: 100%;
}
</style>

我们需要将组件放入一个设有高度的容器上:

<divclass="container"style="height: 600px;">
  <echart:option="charts.option"></echart>
</div>

调用的方式也面类似。首先声明一个基础的配置作为模板,在通过 ajax 拿到数据。通过动态数据传入组件内,组件 watch 到数据变化后立即重新渲染:

// 某处集中封装的 ajax 请求
import API from 'Common/apis'

// 同上配置
const config = {...}

export default {
  data() {
    return {
      charts: {
        title: 'My charts'
        option: config
      }
    }
  },
  created() {
    API.getChartData()
      .then(res=> {
        let data = res.data
        this.charts.option.xAxis.data = data.xAxis;
        this.charts.option.series[0].data = data.click;
        this.charts.option.series[1].data = data.exposure;
      })
  }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

自品牌

自品牌

陈为、孙郁婷 / 机械工业出版社 / 2015-9-7 / 39

移动互联网来势汹涌,让品牌重新回到人的时代。微信旗帜鲜明地宣示,“再小的个体也有自己的品牌”。《自品牌:个人如何玩转移动互联网时代》作者历经一年,深度访谈10位嘉宾,挖掘其品牌与商业成功密码。吴晓波、雕爷、罗永浩、鬼脚七、马佳佳……这些商业新浪潮中的探路者与领军者,要么是传统领域的老将,要么是新领域里的先锋,但都能以新媒体为载体,构建个人品牌,打造商业生态,抓住互联网的时代红利,顺风而起,顺势而为......一起来看看 《自品牌》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具