资视就是力量 - Highcharts / Vue 资料绑定

昨天我们成功安装 Highcharts-Vue 并绘制出一个基本的图表,不过既然都已经使用 Vue 了,我们应该要好好运用「资料绑定」的概念,也就是当资料变动时,我们不需要再额外操作图表,图表就会自己动态的更新变化。


Data Binding

我们在「资料更新 Method」有说过,在网页中资料不会总是静态的,所以当资料变动时,我们需要透过一些 Method 的呼叫来更新图表,不过当我们使用前端框架後,图表应该要可以自己响应资料的变动进而更新画面,那下面我们就来把昨天的 Chart.vue 改写一下。

1.资料形式调整

首先要把资料改写一下,照理说原始资料应该比较难像昨天那样是已经处理过的模样,所以我们另外用 data 物件来模拟从後端拿到的资料,然後将 chartOptions 里面的 xAxis.categoriesseries.data 给清空,因为这两个属性的值应该是原始资料处理过後才拿得到的。

data() {
  return {
    data: {
      "18-24岁": 12,
      "25-29岁": 18,
      "30-34岁": 22,
      "35-39岁": 25,
      "40-44岁": 32,
      "45-49岁": 35,
      "50-54岁": 26,
      "55岁+": 18
    },
    chartOptions: {
      chart: { type: "column" },
      title: { text: "公司员工年龄分布" },
      xAxis: { categories: [] },
      yAxis: { 
        title: { text: "人数" }
      },
      series: [{ 
        name: "XX公司员工",
        data: []
      }]
    }
  };
}

2.撰写 computed

那因为现在原始资料的格式并不是我们要的,而且未来资料还有可能会变动,所以可以选择用 Vue 的 computed 来帮我们处理资料,而且它也会在资料变动时自动更新。

那其中 xAxisCateseriesData 就是用来处理资料的,而 options 则是将资料与图表设定进行结合,最後导出一个完整的 options 物件。

computed: {
  xAxisCate() {
    return Object.keys(this.data);
  },
  seriesData() {
    return Object.values(this.data);
  },
  options() {
    let options = Object.assign(this.chartOptions, {});
    options.xAxis.categories = this.xAxisCate;
    options.series[0].data = this.seriesData;
    return options;
  }
}

3.资料绑定

有了 options 物件後,就可以把它作为 prop 传入 <highcharts>,然後就可以看到跟昨天一样的结果了。

<template>
  <highcharts :options="options"></highcharts>
</template>

https://ithelp.ithome.com.tw/upload/images/20201011/20125431cLLO4zZuAh.png

4.资料变动

经过前面几个步骤後,我们已经将资料与图表做了绑定,接下来就要看看在资料改变时,图表是否会更新画面了。我们可以在画面上新增以几个按钮,并绑定事件。

<template>
  <div>
    <highcharts :options="chartOptions"></highcharts>
    <button @click="changeData">改变资料</button>
    <button @click="changeType('line')">改为折线图</button>
    <button @click="changeType('column')">改为柱状图</button>
  </div>
</template>

我们分别为按钮绑定改变原始资料和图表设定的 methods,看看图表能不能在点击按钮後成功更新。

methods: {
  changeData() {
    this.xAxisCate.forEach((key) => {
      this.data[key] = Math.floor(Math.random() * 20);
    });
  },
  changeType(type) {
    this.options.chart.type = type;
  }
}

实际测试後,发现图表确实的在资料发生变动的时候自动响应了新的图表设定,并且根据设定进行了画面上的更新。


 
今天算是真正使用上了 Vue 的特性来绘制 Highcharts 的图表,透过资料绑定的方式让图表可以响应资料的改变,让我们可以专注在资料的处理,而不用一再的操作图表或呼叫 Method。

不过我今天的范例算是相当粗略,目的只在於向大家展示「资料绑定」的概念,假如你有 Vue 的开发经验,肯定可以大幅改善这个元件的弹性、重用性。而明後两天我也会透过比较完整的应用来展示更多 Highcharts-Vue 的使用方式。


<<:  《DAY 28》天气 App 实作(一)

>>:  [Day 26]老师我学逻辑推论做什麽(1)

DAY22 - 利用开发者工具列Network import export debug

身为工程师的人,一定无法避免的就是面对BUG! 那有什麽方式debug呢? 如果bug发生在别人的电...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day26 根据主题筛选文章列表

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

[Day_24]函式与递回_(3)

计算BMI BMIT常用来判断肥胖程度,BMI等於体重(KG)除以身高(M)的平方,「BMI与肥胖等...

Day26:【技术篇】Webpack5 - Webpack之运作阶段

一、前言   因为网页应用程序不断扩大、开发模式慢慢地被模组化设计取代,近期诞生了 Webpack,...

Day23 Load balance with Istio

昨天非常粗浅的介绍过 istio 後,今天我们要来实际将 Istio mesh 注入我们的 clus...