ECharts實(shí)現(xiàn)異步數(shù)據(jù)加載和更新

2021-01-09 13:53 更新

Echarts 實(shí)現(xiàn)異步數(shù)據(jù)加載


我們?cè)?a href="http://www.o2fo.com/echarts_tutorial/echarts_tutorial-mec528xa.html">入門(mén)第一課中是在初始化后的 setOption 中直接填入數(shù)據(jù)的,但大部分的時(shí)候我們需要將數(shù)據(jù)異步加載后再填入。那么怎么實(shí)現(xiàn)?

ECharts 中實(shí)現(xiàn)異步數(shù)據(jù)的更新的操作不難,在初始化圖表后的任何時(shí)間通過(guò)使用 jQuery 等工具異步獲取數(shù)據(jù)后通過(guò) setOption 填入數(shù)據(jù)和配置項(xiàng)即可,操作如下:

var myChart = echarts.init(document.getElementById('main'));

$.get('data.json').done(function (data) {
    myChart.setOption({
        title: {
            text: '異步數(shù)據(jù)加載示例'
        },
        tooltip: {},
        legend: {
            data:['銷(xiāo)量']
        },
        xAxis: {
            data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
        },
        yAxis: {},
        series: [{
            name: '銷(xiāo)量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
        }]
    });
});

還有一種方法是先設(shè)置好別的樣式,顯示出一個(gè)空的直角坐標(biāo)軸,然后獲取并填入數(shù)據(jù),操作如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>w3cschool (www.o2fo.com) </title>
  <!-- 引入 echarts.js -->
  <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ></script>
</head>
<body>
  <!-- 為ECharts準(zhǔn)備一個(gè)具備大?。▽捀撸┑腄om -->
  <div id="main" style="width: 600px;height:400px;"></div>
  <script type="text/javascript">
    var myChart = echarts.init(document.getElementById('main'));
    // 顯示標(biāo)題,圖例和空的坐標(biāo)軸
    function fetchData(cb) {
      // 通過(guò) setTimeout 模擬異步加載
      setTimeout(function () {
        cb({
          categories: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"],
          data: [5, 20, 36, 10, 10, 20]
        });
      }, 3000);
    }
    // 初始 option
    option = {
      title: {
        text: '異步數(shù)據(jù)加載示例'
      },
      tooltip: {},
      legend: {
        data: ['銷(xiāo)量']
      },
      xAxis: {
        data: []
      },
      yAxis: {},
      series: [{
        name: '銷(xiāo)量',
        type: 'bar',
        data: []
      }]
    };
    myChart.setOption(option);
    fetchData(function (data) {
      myChart.hideLoading();
      myChart.setOption({
        xAxis: {
          data: data.categories
        },
        series: [{
          // 根據(jù)名字對(duì)應(yīng)到相應(yīng)的系列
          name: '銷(xiāo)量',
          data: data.data
        }]
      });
    });
  </script>
</body>
</html>

效果顯示如下:

Echarts 異步數(shù)據(jù)加載示例

點(diǎn)擊編輯實(shí)例 》》

ECharts 中通過(guò) name 屬性在更新數(shù)據(jù)的時(shí)候?qū)?yīng)到相應(yīng)的系列。

上面示例中如果 name 不存在也可以根據(jù)系列的順序正常更新,但是更多時(shí)候推薦更新數(shù)據(jù)的時(shí)候加上系列的 name 數(shù)據(jù)。

Echarts 設(shè)置 loading 動(dòng)畫(huà)


有時(shí)候由于各種原因,數(shù)據(jù)的加載會(huì)需要較多的時(shí)間,這樣一個(gè)空白的直角坐標(biāo)系會(huì)讓用戶(hù)認(rèn)為出現(xiàn) bug 了,為了避免這種錯(cuò)覺(jué),我們需要使用 loading 動(dòng)畫(huà)給用戶(hù)一些提示。

利用 Echarts 提供的加載動(dòng)畫(huà),我們通過(guò)調(diào)用 showLoading 方法顯示加載動(dòng)畫(huà),當(dāng)數(shù)據(jù)加載完成后再調(diào)用 hideLoading 方法將加載動(dòng)畫(huà)隱藏。

具體操作如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>w3cschool (www.o2fo.com) </title>
  <!-- 引入 echarts.js -->
  <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ></script>
</head>
<body>
  <!-- 為ECharts準(zhǔn)備一個(gè)具備大?。▽捀撸┑腄om -->
  <div id="main" style="width: 600px;height:400px;"></div>
  <script type="text/javascript">
    var myChart = echarts.init(document.getElementById('main'));
    // 顯示標(biāo)題,圖例和空的坐標(biāo)軸
    function fetchData(cb) {
      // 通過(guò) setTimeout 模擬異步加載
      setTimeout(function () {
        cb({
          categories: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"],
          data: [5, 20, 36, 10, 10, 20]
        });
      }, 3000);
    }
    // 初始 option
    option = {
      title: {
        text: '異步數(shù)據(jù)加載示例'
      },
      tooltip: {},
      legend: {
        data: ['銷(xiāo)量']
      },
      xAxis: {
        data: []
      },
      yAxis: {},
      series: [{
        name: '銷(xiāo)量',
        type: 'bar',
        data: []
      }]
    };
    myChart.showLoading();
    myChart.setOption(option);
    fetchData(function (data) {
      myChart.hideLoading();
      myChart.setOption({
        xAxis: {
          data: data.categories
        },
        series: [{
          // 根據(jù)名字對(duì)應(yīng)到相應(yīng)的系列
          name: '銷(xiāo)量',
          data: data.data
        }]
      });
    });
  </script>
</body>
</html>

設(shè)置完效果如下:

數(shù)據(jù)為加載完成,顯示加載動(dòng)畫(huà):

Echarts 設(shè)置加載動(dòng)畫(huà)

Echarts 實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)更新


ECharts 由數(shù)據(jù)驅(qū)動(dòng),數(shù)據(jù)的改變驅(qū)動(dòng)圖表展現(xiàn)的改變,因此動(dòng)態(tài)數(shù)據(jù)的實(shí)現(xiàn)也變得異常簡(jiǎn)單。

Echarts 中通過(guò) setOption 更新所有的數(shù)據(jù),我們要做的只是定時(shí)獲取數(shù)據(jù),然后使用 setOption 填入數(shù)據(jù),至于數(shù)據(jù)在過(guò)程中發(fā)生了哪些變化,不在我們的考慮范圍內(nèi)。

ECharts 會(huì)找到兩組數(shù)據(jù)之間的差異然后通過(guò)合適的動(dòng)畫(huà)去表現(xiàn)數(shù)據(jù)的變化。

ECharts 3 中移除了 ECharts 2 中的 addData 方法。如果只需要加入單個(gè)數(shù)據(jù),可以先 data.push(value) 后 setOption

具體可以看下面示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>w3cschool (www.o2fo.com) </title>
  <!-- 引入 echarts.js -->
  <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ></script>
</head>
<body>
  <!-- 為ECharts準(zhǔn)備一個(gè)具備大小(寬高)的Dom -->
  <div id="main" style="width: 600px;height:400px;"></div>
  <script type="text/javascript">
    var myChart = echarts.init(document.getElementById('main'));

    var base = +new Date(2020, 7, 30);
    var oneDay = 24 * 3600 * 1000;
    var date = [];

    var data = [Math.random() * 150];
    var now = new Date(base);

    function addData(shift) {
      now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/');
      date.push(now);
      data.push((Math.random() - 0.4) * 10 + data[data.length - 1]);
      if (shift) {
        date.shift();
        data.shift();
      }
      now = new Date(+new Date(now) + oneDay);
    }
    for (var i = 1; i < 100; i++) {
      addData();
    }
    option = {
      xAxis: {
        type: 'category',
        boundaryGap: false,
        data: date
      },
      yAxis: {
        boundaryGap: [0, '50%'],
        type: 'value'
      },
      series: [
        {
          name: '成交',
          type: 'line',
          smooth: true,
          symbol: 'none',
          stack: 'a',
          areaStyle: {
            normal: {}
          },
          data: data
        }
      ]
    };
    setInterval(function () {
      addData(true);
      myChart.setOption({
        xAxis: {
          data: date
        },
        series: [{
          name: '成交',
          data: data
        }]
      });
    }, 500);
    myChart.setOption(option);
  </script>
</body>
</html>


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)