记录-vue3使用echarts实时更新

<template>
  <div class="chart-div" id="chartDiv" style="width:278px;height:300px;float:left"></div>
</template>
<script setup>
import {ref, onMounted, nextTick} from "vue";
import * as echarts from 'echarts';

const chartLightList = ref([
  {id: 0, lightLevel: 1, lightValue: 10},
])//亮度等级-亮度值
const lightLevelList = ref(chartLightList.value.map((i) => {
  return i.lightLevel
}))//亮度等级
const lightValueList = ref(chartLightList.value.map((i) => {
  return i.lightValue
}))//亮度值
/*
  踩坑--vue3 echarts实例不能设置响应式(用ref包裹等),否则tooltip会不显示
 */
let myChart = (null)
const option = ref({
  title: {
    text: '亮度曲线',
    left: '35%'
  },
  grid: {
    left: 70
  },
  xAxis: {
    type: '',
    data: lightLevelList.value,
    name: '环境亮度(传感器)',
    nameLocation: 'center',
    nameGap: 25
  },
  yAxis: {
    type: 'value',
    name: '亮度等级',
    nameLocation: 'center',
    nameGap: 50
  },
  tooltip: {
    trigger: 'axis',
    formatter: "亮度等级:{b0}<br/> 亮度值:{c0}"
  },
  series: [
    {
      data: lightValueList.value,
      type: 'line'
    }
  ]
});//echarts配置项

//监听亮度值实时绘图
const changeLight = (val) => {
  lightValueList.value = chartLightList.value.map((i) => {
    return i.lightValue
  })
  option.value.series[0].data = lightValueList.value;
  /*
    踩坑-解决数据变化后实例未实时变化
    true==>Cannot read properties of undefined (reading 'type')
    setOption(option, notMerge, lazyUpdate)
    notMerge—— 可选,是否不跟之前设置的 option 进行合并,默认为 false,即合并
   */
  myChart.setOption(option.value, true)
}
//绘制折线图
const drawChart = () => {
  myChart = echarts.init(document.getElementById("chartDiv"));
  option.value && myChart.setOption(option.value);
  window.onresize = function () { // 自适应大小
    myChart.resize();
  }
}
//绘制echarts图
onMounted(() => {
  // 初始化ECharts实例
  nextTick(() => {
    drawChart()
  })
})
//保存调亮设置
const doSet = () => {
  /**
   * 调用保存调亮设置接口
   */
}
</script>

踩坑一:vue3 echarts实例不能设置响应式(用ref包裹等),否则tooltip会不显示。

踩坑二:解决数据变化后折线图未实时变化
              setOption(option,true)=>解决报错:Cannot read properties of undefined (reading 'type')
              setOption(option, notMerge, lazyUpdate)
              notMerge—— 可选,是否不跟之前设置的 option 进行合并,默认为 false,即合并

每天进步一点点,慢慢就能遇见更好的自己!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用`resize`事件和`setOption`方法结合来实现。 首先,需要在父级div渲染完成后,初始化echarts实例,并且绑定`resize`事件。 ```javascript mounted() { this.initChart(); window.addEventListener('resize', this.handleResize); }, ``` 然后,在`initChart`方法中,需要创建echarts实例,并且设置option,同时需要记录下父级div的大小。 ```javascript initChart() { this.chart = echarts.init(this.$refs.chart); this.chart.setOption(this.option); this.chartContainer = this.$refs.chart.parentNode; this.handleResize(); }, ``` 接下来,实现`handleResize`方法,该方法会在父级div大小改变时被调用。在方法中,需要根据父级div的宽度,重新计算echarts实例的宽度,并且调用`setOption`方法更新图表。 ```javascript handleResize() { const width = this.chartContainer.offsetWidth; this.chart.resize({ width }); }, ``` 最后,在组件销毁时,需要移除`resize`事件的监听。 ```javascript beforeDestroy() { window.removeEventListener('resize', this.handleResize); }, ``` 完整的代码如下: ```javascript <template> <div ref="chart" style="height: 400px;"></div> </template> <script> import echarts from 'echarts'; export default { data() { return { chart: null, chartContainer: null, option: { // echarts option } }; }, mounted() { this.initChart(); window.addEventListener('resize', this.handleResize); }, beforeDestroy() { window.removeEventListener('resize', this.handleResize); }, methods: { initChart() { this.chart = echarts.init(this.$refs.chart); this.chart.setOption(this.option); this.chartContainer = this.$refs.chart.parentNode; this.handleResize(); }, handleResize() { const width = this.chartContainer.offsetWidth; this.chart.resize({ width }); } } }; </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值