vue3中动态设置echarts图的高度

这篇具有很好参考价值的文章主要介绍了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. 监听窗口变化,改变窗口大小

三、几个问题

其实根据上面的解决方案,已经大致解决了,但是还有几个小问题文章来源地址https://www.toymoban.com/news/detail-602828.html

  1. 重绘图的时候,控制台会报警说原来的dom上有图片,所以每次重绘之前,其实应该判断dom是否存在
  2. 插件中第7步resize的时候,并没有给参数

到了这里,关于vue3中动态设置echarts图的高度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp导入echarts类库 开发图表类小程序vue3+ts+vite

    微信小程序和抖音小程序等都支持: 使用步骤如下 第一步:下载插件包 下载echarts插件包,并导入到项目中,然后使用插件中的组件创建容器,并导入数据就可以了。 echarts插件包地址:echarts - DCloud 插件市场 如果你是使用hbuilder写的,可以直接导入,如果你是vscode写的,就

    2024年01月21日
    浏览(41)
  • uniapp+vue3+ts+vite+echarts开发图表类小程序,将echarts导入项目使用的详细步骤,耗时一天终于弄好了

    想在uniapp和vue3环境中使用echarts是一件相当前卫的事情,官方适配的还不是很好,echarts的使用插件写的是有些不太清晰的,这里我花费了一天的时间,终于将这个使用步骤搞清楚了,并且建了一个仓库,大家可以直接clone下来使用。先看一下pc端和小程序端的效果: 微信小程

    2024年02月05日
    浏览(62)
  • vue3,动态引入组件,同时动态设置组件的name,用于keep-alive缓存

    如果有两个页面逻辑大都相同,咱们想到的第一个肯定是写一个组件,然后两个路由都指向这个组件。 那如果现在多添加一个需求:两个页面在切换路由时都需要缓存数据,并且两个页面的缓存数据要求独立。 这个需求很简单:在router-view外层包裹一个keep-alive组件,指定缓

    2024年02月14日
    浏览(39)
  • 【JavaScript】动态监听iframe高度以及监听iframe内部链接跳转

    目录 背景 实现方式 实现思路 实现代码 扩展场景 参考文档 在日常开发中会遇到一种情况,就是页面需要嵌套iframe,由于iframe无法自适应里面样式高度,所以我们需要去监听iframe的动态高度 MutationObserver 定义观察器MutationObserver 监听iframe的contenWindow的 DOMContentLoaded 事件(当初始

    2024年02月07日
    浏览(38)
  • 在vue中使用echarts以及简单关系图的点击事件

    在Vue项目中打开终端执行命令: 下载后在package.json文件中可以看到下载的Echarts版本: 在需要使用Echarts图表的页面中导入: 如果多个地方使用的话可以通过全局引入: 在需要用到echarts的地方设置一个有宽高的div盒子 定义echarts关系图的数据 在methods中定义实例化echarts对象的

    2024年02月08日
    浏览(32)
  • 小程序Canvas 2D问题解决,如安卓drawImage不执行、动态高度设置、高度1365(或4096)限制等

    我的最新版小程序想在绘制时使用自定义字体,需要将旧版canvas升级到2d新版,发现了许多问题,下面记录一下并提供解决思路,仅供参考,欢迎提供新思路。 一、开发工具和安卓上drawImage不执行,绘制出来是空白: 不知道哪里出了问题,反正要么不进image.onload,要么进入就

    2024年02月20日
    浏览(31)
  • vue实现表格的动态高度

    需求:表格能够根据窗口的大小自动适配页面高度     防抖和节流函数的使用场景是当需要对频繁触发的事件进行限制时,例如: 防抖函数常用于限制用户在短时间内多次触发某一事件,例如搜索框输入并搜索,当用户一直在输入时,我们可以使用防抖函数来避免多次请求

    2024年02月11日
    浏览(28)
  • vue3 使用ref 获取 dom 元素的高度

    代码实现: 输出结果:  

    2024年02月16日
    浏览(34)
  • vue3+ts+vite项目引入echarts,vue3项目echarts组件封装

    技术栈 :Vue3 + Ts + Vite + Echarts 简介 : 图文详解,教你如何在 Vue3 项目中 引入Echarts , 封装Echarts组件 ,并实现常用Echarts图例 1.1 静态效果 1.2 动态效果 2.1 安装 Echarts npm: pnpm: 2.2 main.ts 中引入 2.3 Echarts 组件封装 /src/components/ReEcharts/index.vue 文件中写入如下代码 3.1 柱状图 实现

    2024年02月09日
    浏览(50)
  • Vue3使用 xx UI解决布局高度自适应

    在相应的Sider部分添加:height: ‘91.8vh’,即可。示例: vw、vh、vmin、vmax是一种视窗单位,也是相对单位。它相对的不是父节点或者页面的根节点。而是由视窗(Viewport)大小来决定的,单位1,代表类似于 1%。 视窗(Viewport)是你的浏览器实际显示内容的区域—,换句话说是你的

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包