Echarts 自适应宽高,或指定宽高进行自适应

文章目录

    • 需求
    • 分析

需求

有一个按钮实现对Echarts的指定缩放与拉长,形成自适应效果

拉长后效果图
在这里插入图片描述
该块元素缩短后效果图
在这里插入图片描述

分析

因为我习惯使用 ref 来获取组件的 DOM 元素,然后进行挂载

<div ref="echartsRef" id="myDiv" :style="{ width, height }"></div>

echartInstance = echarts.init(echartsRef.value, 'macarons');
  • 小插入————踩坑【别试】
    想的是通过document.querySelector 修改宽高,但是并未监听到 ref 的宽高被修改【未成功】
    网上有说是要销毁 DOM 重新进行绘制,【未成功】
watch(flagFold, (newVal) => {
    echartResizes(echartInstance)
    const myDiv = document.querySelector('#myDiv ')
    myDiv.style.width = newVal ? '1400px' : '600px'
    if (echartInstance) {
        echartInstance.resize();
    }
})

因此采用如下解决办法

因此在监听变化的时候,要修改 ref 获取到的元素的宽度和高度

<template>
  <div>
    <!-- 使用 ref 来获取组件的 DOM 元素 -->
    <div ref="echartsContainer" :style="{ width: containerWidth + 'px', height: containerHeight + 'px' }"></div>
  </div>
</template>

<script>
import { ref, onMounted, watch } from 'vue';
import echarts from 'echarts';

export default {
  setup() {
    // 使用 ref 来创建响应式对象
    const echartsContainer = ref(null);
    const containerWidth = ref(0);
    const containerHeight = ref(0);
    let echartsInstance;

    onMounted(() => {
      // 初始化 ECharts 实例
      echartsInstance = echarts.init(echartsContainer.value);

      // 在组件挂载后调整组件宽度和高度
      adjustSize();
    });

    // 监听组件宽度和高度变化
    watch([() => echartsContainer.value.offsetWidth, () => echartsContainer.value.offsetHeight], ([newWidth, newHeight], [oldWidth, oldHeight]) => {
      // 当组件宽度或高度发生变化时调用 adjustSize 方法
      adjustSize();
    });

    const adjustSize = () => {
      // 获取组件宽度和高度
      containerWidth.value = echartsContainer.value.offsetWidth;
      containerHeight.value = echartsContainer.value.offsetHeight;

      // 修改组件宽度和高度
      echartsInstance.resize({
        width: containerWidth.value,
        height: containerHeight.value
      });
    };

    return {
      echartsContainer,
      containerWidth,
      containerHeight
    };
  }
}
</script>
  • 源码展示
<template>
    <div ref="echartsRef" id="myDiv" :style="{ width, height }"></div>
</template>

<script lang="ts" setup>
import {
    ref,
    reactive,
    watch,
    toRefs,
    onMounted,
    onBeforeUnmount,
    computed,
    watchEffect
} from 'vue';
import * as echarts from 'echarts';
import { echartResize, echartResizes } from "@/utils/echsrts";
import { useToolStore } from '@/store';


const ToolStore = useToolStore()

const flagFold = computed(() => {
    return ToolStore.isFold
})
watch(flagFold, (newVal) => {
    echartResizes(echartInstance)
    // const myDiv = document.querySelector('#myDiv ')
    // myDiv.style.width = newVal ? '1400px' : '600px'
    echartInstance.resize({
        width: newVal ? 1400 : 600,
    });
    if (echartInstance) {
        echartInstance.resize();
    }
})

/**
 * @description : 安全监测模块
 * @author : 'Hukang'
 * @param : '' 
 * @date : 2024-03-05 14:59:56
*/
const props = defineProps({
    //子组件接收父组件传递过来的值
    chartData: Object,
    width: {
        type: String,
        default: '600px',
        required: false // 是否必传
    },
    height: {
        type: String,
        default: '580px',
        required: false // 是否必传
    }
})
//使用父组件传递过来的值
const { chartData } = toRefs(props)



const option = ref({
    title: {
        text: ''
    },
    tooltip: {
        trigger: 'axis',
        axisPointer: {
            type: 'cross',
            label: {
                backgroundColor: '#6a7985'
            }
        }
    },
    legend: {
        data: [],
        right: "5%",
        top: "0",
        textStyle: {
            fontSize: 12, //字体大小
            color: "#000" //字体颜色
        }
    },
    toolbox: {
        feature: {
            saveAsImage: {
                show: true,
                title: '点击保存'
            }
        },
        right: '10%', // 从右边缘的距离
        top: '10%'
    },
    grid: {
        left: '3%',
        right: '8%',
        bottom: '8%',
        top: '15%',
        containLabel: true
    },
    xAxis: {
        type: "category",
        boundaryGap: false,
        data: [],
        axisLine: {
            lineStyle: {
                color: "#000"
            }
        },
        axisTick: {
            show: true//刻度线
        },
        nameTextStyle: {
            color: "#000",
            fontSize: 12
        },
        axisLabel: {
            color: "#000",
            fontSize: 12,
            formatter: (value, index) => {
                return value.replace(/(\d{4})-(\d{1,2})-(\d{1,2}).*/, "$1-$2-$3").slice(5);
            }
        }
    },
    yAxis: [
        {
            name: '',
            type: "value",
            axisTick: {
                show: true
            },
            nameTextStyle: {
                color: "#000",
                fontSize: 12
            },
            axisLine: {
                show: true,
                lineStyle: {
                    color: "#000"
                }
            },
            splitLine: {
                lineStyle: {
                    type: "dashed", //虚线
                    color: "rgba(0,0,0,0.8)"
                },
                show: true //隐藏
            },
            min(v) {
                return v.min
            }
        }
    ],
    dataZoom: [
        {
            show: true,
            type: 'slider',
            handleSize: 32, // 两边的按钮大小
        },
        {
            type: 'inside'
        }
    ],
    series: [],
})


const echartsRef = ref<string>();
let echartInstance;
watch(chartData, (newVal) => {
    if (newVal) {
        option.value = newVal
        echartInstance.setOption(option.value);
        window.addEventListener('resize', () => {
            if (echartInstance) {
                echartInstance.resize();
            }
        })
    }
}, { deep: true })




onMounted(() => {
    echartInstance = echarts.init(echartsRef.value, 'macarons');

})
onBeforeUnmount(() => {
    if (echartInstance && echartInstance.dispose) {
        echartInstance = null;
    }
})
</script>



<style scoped lang="less"></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++核心高级编程 --- 4.类和对象

文章目录 第四章&#xff1a;4.类和对象4.1 封装4.1.1 封装的意义4.1.2 struct与class的区别 4.2 对象的初始化和清理4.2.1 构造函数和析构函数4.2.2 构造函数的分类及调用4.2.3 拷贝构造函数调用时机4.2.4 构造函数调用规则4.2.5 深拷贝与浅拷贝4.2.6 初始化列表4.2.7 类对象作…

Chat-REC: Towards Interactive and Explainable LLMs-Augmented Recommender System

1、动机 推荐系统被应用于推荐服务&#xff0c;提高人们的生活质量&#xff0c;但仍存在一些问题。缺少交互性、可解释性&#xff0c;缺乏反馈机制&#xff0c;以及冷启动和跨域推荐。 Chat-Rec 将用户画像和历史交互转换为 Prompt&#xff0c;有效地学习用户的偏好&#xff…

【漏洞复现】用友NC cloud importhttpscer 存在任意文件上传

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

STM32L4R9 的 QuadSPI Flash 通讯速率不理想

1. 引言 客户反应 STM32L4R9 同 QSPI Flash 通讯&#xff0c;测出来的读取速率为 10MB/s&#xff0c; 和理论值相差较大。 2. 问题分析 按照客户的时钟配置和 STM32L4R9 的数据手册中的数据&#xff0c;OSPI 读数速率为 10MB/s 肯定存在问题。同时我们也可以在 AN4760 应用手…

python 字符串补齐

参考文献 https://blog.csdn.net/ViatorSun/article/details/130424704 今天遇到一个格式化字符串的问题 "123".ljust(8,"0")"123".rjust(8,"0")

苍穹外卖07(缓存菜品,SpringCache,缓存套餐,添加购物车菜品和套餐多下单,查看购物车,清除购物车,删除购物车中一个商品)

目录 一、缓存菜品 1 问题说明 2 实现思路 3 代码开发&#xff1a;修改DishServiceImpl 4 功能测试 二、SpringCache 1. 介绍 2. 使用语法 1 起步依赖 2 使用要求 3 常用注解 4 SpEL表达式(了解备用) 5 步骤小结 3.入门案例 1 准备环境 2 使用入门 1 引导类上加…

b站评论词频统计绘制词云图

一、评论爬取 在笔者之前的文章中&#xff0c;已经专门介绍了b站评论的爬取&#xff08;传送门&#xff09;&#xff0c;这里只对b站评论的文本数据做展示。如下图所示&#xff1a; 二、分词、去停用词、词频统计 Python中的Jieba分词作为应用广泛的分词工具之一&#xff0c;其…

【面试经典150 | 动态规划】最长回文子串

文章目录 写在前面Tag题目来源解题方法方法一&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

【OJ】动规练习六

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 413. 等差数列划分1.1 分析1.2 代码 2. 978. 最长湍流子数组2.1 分析2.2 代码 3. 139. 单词拆分3.1 分析3.2 代码 1. 413. 等差数列划分 1.1 分析 一、题目解析&#xff1a; 至少有三个元素才能构成等差数列&#xff…

【开发环境】Mac 安装 Visual Studio Code ( VSCode 简介 | 下载 VSCode | 安装 VSCode | 安装中文语言包 )

文章目录 一、Visual Studio Code 简介二、MAC 安装 Visual Studio Code1、下载 Visual Studio Code2、安装 Visual Studio Code3、安装中文语言包4、编辑 html 并运行 一、Visual Studio Code 简介 Visual Studio Code 简称 VSCode , 是 微软 开发的一款 轻量级 / 跨平台 的代…

前视声呐目标识别定位(五)-代码解析之修改声呐参数

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

arm裸机-1、定时器pwm

时钟配置 我们使用s3c2440&#xff0c;主频12M&#xff0c;查看用户手册 通过锁相环抬升到400MHZ&#xff0c;分成三条通路&#xff0c;通过HHDIVN和PDIVN配置频率比&#xff0c;这个频率比配置手册已经给出。 配置MPLL主频400Mhz&#xff0c; 通过这个公式算出MPLL s、p、m都…

Redis从入门到精通(四)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

动力云客-B站(第一天)

一 项目技术选型及开发工具 前后端分离的项目&#xff08;前端项目 后端项目&#xff09; 前端&#xff1a;Html、CSS、JavaScript、Vue、Axios、Element Plus后端&#xff1a;Spring Boot、Spring Security、MyBatis、MySQL、Redis 相关组件&#xff1a;HiKariCP&#x…

【C++进阶】带你手撕红黑树(红与黑的爱恨厮杀)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 引言&#xff1a; 之前我们…

K8S- Deployment 的滚动更新 Rolling Update

滚动更新 这里的更新指的不是更新deployment 本身的属性(label/ replicas)等&#xff0c; 而是更新POD 的container 的版本 更新方法通常有两种 是直接update deployment配置&#xff0c; 注意只有update了template中的内容(与container相关) 才会触发更新用kubectl set ima…

【蓝桥杯】GCD与LCM

一.概述 最大公约数&#xff08;GCD&#xff09;和最小公倍数&#xff08;Least Common Multiple&#xff0c;LCM&#xff09; 在C中&#xff0c;可以使用 std::__gcd(a, b)来计算最大公约数 1.欧几里德算法/辗转相除法 int gcd(int a,int b){return b?gcd(b, a%b):a; } 2…

CATIA软件 焊点坐标(BiW Welding SpotPoint)导出txt文本的操作方法

通常我们客户给的工件是带焊点球的形式&#xff0c;且可导出焊点坐标。如下图所示的焊点位置标识及坐标&#xff0c;即是CATIA中Automotive BiW Fastening模块下的BiW Welding SpotPoint焊点定义。 遇到这样的形式&#xff0c;要导出焊点坐标txt文本&#xff0c;可按如下图片找…

ssm023实验室耗材管理系统设计与实现+jsp

实验室耗材管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对实验室耗材信息管理混乱&#xff…

深入浅出 -- 系统架构之单体架构和微服务架构的区别

在软件开发中&#xff0c;架构设计是非常重要的一环。架构设计不仅决定了软件系统的性能、可维护性和扩展性&#xff0c;还直接关系到开发成本和项目进度。目前&#xff0c;主流的架构设计模式有两种&#xff0c;一种是单体架构&#xff0c;另一种是微服务架构。本文将详细介绍…