vue3中动态设置echarts图的高度

vue3中动态设置echarts图的高度

近期写个vue3项目,中间要使用echarts图,因为要适配不同的显示器,简直快被搞疯了。这个问题搞了无数次,但每次都会遇到,记录一下本次的解决方案

一、组件中的写法

组件中只需要把html标签写出来就行了,然后加JavaScript代码

<el-card class="top-graph" ref="topGra">
	<div style="height: 100%;" ref="speed"></div>
</el-card>

样式我就不写了,外层是个elementplus中的el-card,内层是要渲染的速度曲线图

js中相关的代码:

import { ref, reactive, onMounted, watch, nextTick } from 'vue'
import { useElementSize } from '@vueuse/core'  // 使用vueuse获取dom元素的尺寸

// 点击表格中的眼睛图标时,改变右侧顶部的数据,需要一个索引
const dataIndex = ref(0)
onMounted(() => {
    nextTick(() => {
        drawChart(dataIndex.value, speed.value)
    })

})

import { drawChart } from './components/LineChartOptions'
const speed = ref(null)
const topGra = ref(null)

const { width, height } = useElementSize(topGra)
console.log(width.value, height)


watch(() => [dataIndex, height], (newVal, oldVal) => {
    console.log(newVal)
    // currentHeight.value = newVal
    drawChart(newVal[0].value, speed.value, newVal[1].value)
}, { deep: true })

这里有点复杂的逻辑,echarts图是变化的,需要根据dataIndex这个响应式数据来切换加载的数据源,同时,要自适应显示图的高度

实现的逻辑:监听dataIndex, height这两个值的变化情况,发生变化时,重新绘制曲线图,最好加一下深度监视也就是{ deep: true }

那么获取echarts图的高度呢,用到了vueuse这个插件中的useElementSize,它可以获取dom元素的高度和宽度,注意,它获取的是echarts图父节点的高度,因为echarts很难搞,没有图片的时候,节点根本就没有渲染,根本就获取不到speed这个dom元素,所以只能给一个父元素,通过设置与父元素相同的高度来显示图

大致是这么个流程,不过需要根据实际项目来理解会更容易一些

另外,可以看到,drawChart这个方法我是封装在插件中的,可以看下我插件是怎么写的

二、插件中的写法

import axios from "axios";
import * as echarts from 'echarts'
export const drawChart = (index, ref, height=260) => {
  axios
    .get("static/json/speed.json")
    .then((res) => {
      const all_data = res.data[index];
      // console.log(all_data)
      const x = [];
      const data = [];
      for (let i = 0; i < all_data.length; i++) {
        x.push(all_data[i].time);
        // const {sgqs, swrs, ssrs} = all_data[i]
        // const datai = {sgqs, swrs, ssrs}
        const datai = { 纵向速度: all_data[i].speed };
        data.push(datai);
      }

      const keyArray = Object.keys(data[0]);
      const series = [];
      keyArray.forEach((key) => {
        series.push({
          name: key,
          data: data.map((item) => item[key]),
          type: "line",
          smooth: true,
        });
      });
      // console.log(series)

      const options = {
        title: { text: "车辆速度变化情况" },
        tooltip: {
          // 鼠标悬浮提示框显示 X和Y 轴数据
          trigger: "axis",
          backgroundColor: "rgba(32, 33, 36,.7)",
          borderColor: "rgba(32, 33, 36,0.20)",
          // borderWidth: 1,
          textStyle: {
            // 文字提示样式
            color: "#fff",
            fontSize: "12",
          },
          axisPointer: {
            // 坐标轴虚线
            type: "cross",
            label: {
              backgroundColor: "#6a7985",
            },
          },
        },
        xAxis: {
          data: x,
          type: "category",
        },
        yAxis: {},
        legend: {
          data: keyArray,
        },
        series,
      };
      const chart_line = echarts.init(ref);
      chart_line.resize({height})
      chart_line.setOption(options);
      window.addEventListener("resize", () => {
        chart_line.resize();
      });
    })
    .catch((err) => {
      console.log(err);
    });
};

drawChart需要三个参数,数据索引,需要显示图片的dom,以及图的高度

这三个元素都由组件传递,不过高度有默认值,就是260px,不过会根据你的实际窗口大小变化的,因为我的el-card的高度也是变化的

这个方法做了如下几件事:

  1. axios获取数据
  2. 根据index值取出需要的数据(其实这个事儿该后端做)
  3. 处理echarts需要的数据
  4. 根据输入的dom参数初始化dom
  5. 根据输入的height来设置图的高度
  6. echarts设置option
  7. 监听窗口变化,改变窗口大小

三、几个问题

其实根据上面的解决方案,已经大致解决了,但是还有几个小问题

  1. 重绘图的时候,控制台会报警说原来的dom上有图片,所以每次重绘之前,其实应该判断dom是否存在
  2. 插件中第7步resize的时候,并没有给参数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
动态修改echarts的宽高,可以使用Vue的watch监听组件的宽高变化,然后在回调函数调用echarts的resize方法来更新表的宽高。 首先,在组件引入echarts: ```javascript import echarts from 'echarts' ``` 然后在组件的data定义一个chart对象,用于存储echarts实例: ```javascript data() { return { chart: null } } ``` 接下来,在组件的mounted生命周期函数初始化echarts实例,并将其挂载到DOM上: ```javascript mounted() { this.chart = echarts.init(this.$refs.chart) // 画表 this.drawChart() } ``` 然后,在组件的watch监听组件宽高的变化,并在回调函数调用echarts的resize方法来更新表的宽高: ```javascript watch: { // 监听组件宽度变化 '$refs.chart.clientWidth': function () { // 更新表宽度 this.chart.resize({ width: this.$refs.chart.clientWidth }) }, // 监听组件高度变化 '$refs.chart.clientHeight': function () { // 更新高度 this.chart.resize({ height: this.$refs.chart.clientHeight }) } } ``` 最后,在组件的destroyed生命周期函数销毁echarts实例: ```javascript destroyed() { this.chart.dispose() } ``` 完整的代码示例: ```javascript <template> <div ref="chart" class="chart"></div> </template> <script> import echarts from 'echarts' export default { data() { return { chart: null } }, mounted() { this.chart = echarts.init(this.$refs.chart) // 画表 this.drawChart() }, watch: { // 监听组件宽度变化 '$refs.chart.clientWidth': function () { // 更新表宽度 this.chart.resize({ width: this.$refs.chart.clientWidth }) }, // 监听组件高度变化 '$refs.chart.clientHeight': function () { // 更新高度 this.chart.resize({ height: this.$refs.chart.clientHeight }) } }, destroyed() { this.chart.dispose() }, methods: { drawChart() { // 画表的逻辑 } } } </script> <style> .chart { width: 100%; height: 400px; } </style> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栀椩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值