vue项目使用echart实现动态折线的实时数据效果

目前有三种方式可以实现:1、定时器不停的刷新,2、是使用scoket实现,3、是使用requestAnimationFrame实现,原理都一样,都是不断循环调用echart对象的setOption方法,每次改变一下series里面的data数据(即每次在data数组最后push一个数据,如果数组总数达到设置的一屏最大数,则先shift开头的一个数据,再结尾push一个数据),达到动态更新曲线图,实现心电图动画效果。

下面来说下里面的实现两种方式,

方式一:

  // 设备健康

    deviceRes(data = { health: ['0', '0', '0'] }) {

      if (data) {

        for (let m = 0; m < 3; m++) {

          this.optionDevice.series[m].data.shift();

          this.optionDevice.series[m].data.push(data['health'][m]);

        }

      }

      const now_date = new Date();

      this.optionDevice.xAxis.data.shift();

      this.optionDevice.xAxis.data.push(now_date.getHours() + ':' + now_date.getMinutes() + ':' + now_date.getSeconds());

      this.device_chart.setOption({

        xAxis: this.optionDevice.xAxis,

        series: this.optionDevice.series

      });

    },

方式二:

1、安装echart
npm install echarts --save
2、在main.js里全局引入
import * as echarts from 'echarts'
 
Vue.prototype.$echarts = echarts
 3、在页面里使用
<div id="wave-canvas" class="wave-canvas"></div>
<script>
import pulseData from '@/api/pulse-data.js'
 
 
let waveChart = null; // 心电图对象
const frameNum = 250; // 显示最大数
let normalizeData = []
let index = 0;
let _arrIndex = 250;
let _arr = []
let runnerTimeout = null
 
export default {
 
  data () {
    return  {
      maiType: '脉位',
      pulseType: ''
    }
  },
 
  created() {
 
    this.pulseType = 'chi'
  },
 
  mounted () {
 
    // 防止标签元素渲染慢,echart就开始初始化,导致canvas大小异常,所以加个60ms延迟
    setTimeout(() => {
      this.selectPulse(this.pulseType)
    }, 60)
 
  },
 
  beforeDestroy() {
  
    this.initPluseData()
  },
 
  methods: {
 
    /**
     * 初始化数据
     */
    initPluseData () {
      runnerTimeout && cancelAnimationFrame(runnerTimeout);
  
      waveChart = null; // 心电图对象
      normalizeData = []
      index = 0;
      _arrIndex = 250;
      _arr = []
      runnerTimeout = null
    },
 
    /**
     * 选择脉象
     */
    selectPulse(type) {
 
      this.pulseType = type || 'chi';
 
      this.initPluseData()
   
 
      _arr = pulseData[type || 'chi'].PulseShow
 
      normalizeData = []
 
      for(let i = 0; i < _arrIndex; i++) {
        normalizeData.push(_arr[i])
      }
 
      // runnerTimeout = setInterval(() => {
      //   this.drawWaveChart()
      // }, 60)
      
      if(!runnerTimeout) {
        runnerTimeout = requestAnimationFrame(this.drawWaveChart)
      }
 
    },
 
    /**
     * 绘制波形图
     */
    drawWaveChart() {
      
      if (normalizeData.length === frameNum) {
        normalizeData.shift()
      }
 
      normalizeData.push(_arr[_arrIndex])
      
      _arrIndex++
      
      if(_arrIndex >= _arr.length) {
        _arrIndex = 0
      }
 
      const data = normalizeData;
 
      const _xarr = Array.from({ length: 250 }, (_, i) => i);
      let option = {
        animation: false,
        xAxis: {
          type: 'category',
          data: _xarr,
          show: false
        },
        yAxis: {
          type: 'value',
          show: false
        },
        series: [
          {
            data: data,
            type: 'line',
            smooth: true,
            showSymbol: false,
            lineStyle: {
              color: {
                type: 'linear',
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [{
                  offset: 0, color: '#C7ABE4' // 0% 处的颜色
                }, {
                  offset: 0.3, color: '#ABE6E2' // 100% 处的颜色
                }, {
                  offset: 0.6, color: '#ABBAE5' // 100% 处的颜色
                }, {
                  offset: 1, color: '#C7ABE4' // 100% 处的颜色
                }],
                global: false // 缺省为 false
              },
              width: 10
            }
          }
        ],
        grid: {
          top: 10,
          left: 10,
          right: 10,
          bottom: 10
        }
      };
      
      let waveDom = document.getElementById("wave-canvas")
      if(waveDom){
        if (!waveChart) {
          waveChart = this.$echarts.init(waveDom);
          waveChart.setOption(option, {
            notMerge: true
          });
        } else {
          waveChart.setOption(option, {
            notMerge: true
          });
        }
      }
 
      runnerTimeout = requestAnimationFrame(this.drawWaveChart)
    }
 
  }
 
}
</script>


心电图数据:

export default {
 
  'chi': {
    name: '迟脉',
    'PulseShow': [99, 97, 95, 93, 91, 88, 85, 83, 80, 78, 75, 73, 71, 70, 68, 67, 65, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 16, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 21, 23, 26, 28, 31, 34, 37, 41, 44, 48, 52, 57, 61, 66, 71, 75, 80, 84, 88, 92, 95, 97, 99, 100, 100, 100, 99, 97, 95, 93, 91, 88, 85, 83, 80, 78, 75, 73, 71, 70, 68, 67, 65, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 16, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 21, 23, 26, 28, 31, 34, 37, 41, 44, 48, 52, 57, 61, 66, 71, 75, 80, 84, 88, 92, 95, 97, 99, 100, 100, 100, 99, 97, 95, 93, 91, 88, 85, 83, 80, 78, 75, 73, 71, 70, 68, 67, 65, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 16, 15, 14, 14, 13, 13, 12, 12, 12, 11, 11, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 21, 23, 26, 28, 31, 34, 37, 41, 44, 48, 52, 57, 61, 66, 71, 75, 80, 84, 88, 92, 95, 97, 99, 100, 100, 100, 99, 97, 95, 93, 91, 88, 85, 83, 80, 78, 75, 73, 71, 70, 68, 67, 65, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 16, 15, 14, 14, 13, 13, 12]
    }
}
 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Echarts是一个基于Vue.js的图表库,可以用来展示各种类型的图表,包括折线图。动态数据指的是图表数据可以实时更新和变化。 要实现Vue Echarts折线图的动态数据,可以按照以下步骤进行: 1. 安装Vue Echarts库:在Vue项目使用npm或yarn安装Vue Echarts库。 2. 导入Echarts组件:在需要使用折线图的组件,导入Echarts组件。 3. 创建一个容器:在模板创建一个容器,用于显示折线图。 4. 初始化Echarts实例:在组件的生命周期钩子函数使用Echarts的init方法初始化一个Echarts实例。 5. 配置图表选项:通过配置Echarts实例的option属性,设置折线图的样式、数据和动画效果等。 6. 更新数据:通过修改Echarts实例的option属性,更新折线图的数据。 下面是一个示例代码,演示了如何使用Vue Echarts展示折线图的动态数据: ```vue <template> <div> <div ref="chartContainer" style="width: 400px; height: 300px;"></div> </div> </template> <script> import echarts from 'echarts'; export default { data() { return { chartInstance: null, data: [10, 20, 30, 40, 50], // 初始数据 }; }, mounted() { this.chartInstance = echarts.init(this.$refs.chartContainer); this.updateChart(); // 初始化图表 }, methods: { updateChart() { const option = { xAxis: { type: 'category', data: ['A', 'B', 'C', 'D', 'E'], }, yAxis: { type: 'value', }, series: [ { name: '数据', type: 'line', data: this.data, }, ], }; this.chartInstance.setOption(option); }, // 示例方法,用于更新数据 updateData() { // 模拟数据更新 this.data = [30, 40, 50, 60, 70]; this.updateChart(); // 更新图表 }, }, }; </script> ``` 在上述示例代码,通过`this.chartInstance.setOption(option)`方法来设置折线图的配置选项。在`updateData`方法,可以更新`data`数组的值,并调用`updateChart`方法来更新图表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值