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

news2024/11/17 16:27:07

文章目录

    • 需求
    • 分析

需求

有一个按钮实现对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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell脚本之基本语法

目录 一、变量定义 变量命名规则&#xff1a; 变量的赋值&#xff1a; 只读变量&#xff1a; 删除变量&#xff1a; 二、变量的类型 自定义变量&#xff1a; 环境变量&#xff1a; 位置参数&#xff1a; 预定义变量&#xff1a; 三、键盘输入 四、数值运算 为什么…

余集和拉格朗日定理

L&#xff1a;一个群的例子&#xff08;在下面的文章中进一步详细介绍&#xff09;;R&#xff1a;约瑟夫路易拉格朗日&#xff08;1736-1813&#xff09;&#xff0c; 一、说明 数学家总是痴迷于根据乍一看似乎完全无关的事实/观察来形成概括。为什么&#xff1f;原因很简单&am…

ideaSSM图书借阅管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 图书借阅管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主…

JS-11A/11时间继电器 板前接线 JOSEF约瑟

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

一点点金融 4

一点点金融 4 第一性原理&#xff1a;关键事件前后&#xff0c;市场会从不确定性转变为确定性弹簧板、天花板&#xff1a;作为止损、换策略的依据怎么判断弹簧板、天花板&#xff1f; 第一性原理&#xff1a;关键事件前后&#xff0c;市场会从不确定性转变为确定性 在关键事件…

74LVC04六角逆变器-国产兼容MS9113

MS9113S 是一款 S/PDIF 信号接收器。当输入信号频率为 0.1MHz 至 40MHz 时&#xff0c;芯片放大该输入信号至电源电压。最小输入信号幅度的典型值为 80mV。MS9113S 包含一个信号标识位管脚&#xff0c;有输入信号则为高电平&#xff0c;无输入信号则为低电平。MS9113S 还包含一…

LeetCode-94. 二叉树的中序遍历【栈 树 深度优先搜索 二叉树】

LeetCode-94. 二叉树的中序遍历【栈 树 深度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;迭代解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1…

调用飞书获取用户Id接口成功,但是没有返回相应数据

原因&#xff1a; 该自建应用没有开放相应的数据权限。 解决办法&#xff1a; 在此处配置即可。

Redis高可用主从复制与哨兵模式

前言 在生产环境中&#xff0c;除了采用持久化方式实现 Redis 的高可用性&#xff0c;还可以采用主从复制、哨兵模式和 Cluster 集群的方法确保数据的持久性和可靠性。 目录 一、主从复制 1. 概述 2. 作用 3. 主从复制流程 4. 部署 4.1 安装 redis 4.2 编辑 master 节…

基于深度学习的条形码二维码检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的条形码二维码检测系统。核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交互…

年少不知EFCore好,错把SqlSugar当成宝

背景&#xff1a;依然记得我的第一份WebApi项目使用得是SqlSugar&#xff0c;当时还没有系统学习b/s这边的知识&#xff0c;跟着别人做项目用SqlSugar觉得非常方便&#xff0c;减少了自己手写ADO.Net的痛苦。但是今天发现这个EFCore也是巨好用啊&#xff0c;下面写一下他的简单…

C语言——内存函数

前言&#xff1a; C语言中除了字符串函数和字符函数外&#xff0c;还有一些函数可以直接对内存进行操作&#xff0c;这些函数被称为内存函数&#xff0c;这些函数与字符串函数都属于<string.h>这个头文件中。 一.memcpy&#xff08;&#xff09;函数 memcpy是C语言中的…

LlamaIndex——RAG概述

文章目录 一、使用LLM1. 模型2. 词嵌入3. Prompt 二、加载1. 加载2. 转换&#xff08;1&#xff09;高级API&#xff08;2&#xff09;低级API 三、索引/EmbeddingTop K Retrieval 四、存储五、查询六、评估1. 生成结果质量评估2. 检索结果评估 RAG&#xff08;检索增强生成&am…

【javaScript】DOM编程入门

一、什么是DOM编程 概念&#xff1a;DOM(Document Object Model)编程就是使用document对象的API完成对网页HTML文档进行动态修改&#xff0c;以实现网页数据和样式动态变化的编程 为什么要由DOM编程来动态修改呢&#xff1f;我们就得先理解网页的运行原理&#xff1a; 如上图&a…

回溯算法|491.递增子序列

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {if (path.size() > 1) {result.push_back(path);// 注意这里不要加return&#xff0c;要取树上…

vlookup跨表使用

VLOOKUP&#xff08;查找值&#xff0c;数据表&#xff0c;列序数&#xff0c;匹配条件&#xff09;。打开两表格&#xff0c;输入查找值和表格数据格式一致&#xff0c;查找表格或数据范围是连续的。 跨表VLOOKUP使用步骤&#xff1a; 插函数单元格&#xff0c;输“VLOOKUP()…

各类系统业务功能架构图整理

一、前言 很多软件系统一直经久不衰&#xff0c;主要这些系统都是一些生产工作经营不可或缺的系统。比如财务系统&#xff0c;商城系统&#xff0c;支付系统&#xff0c;供应链系统&#xff0c;人力资源管理系统&#xff0c;ERP系统等等。这些系统不管大公司还是小公司往往都需…

Fastjson 1.2.47 远程命令执行漏洞复现分析环境

Fastjson 1.2.47 远程命令执行漏洞 1、靶机环境安装 1.1、虚机机linux环境参数 1、操作系统&#xff1a;CentOS Linux release 7.4.1708 (Core) 2、IP&#xff1a;192.168.127.1321.1、docker与docker compose安装 1.2、下载https://github.com/vulhub/vulhub/tree/master/…

moment.js 产出未知格式的时间,可能的原因

moment.js 产出未知格式的时间&#xff0c;可能的原因 有个问题困扰我好久了&#xff0c;在项目中使用格式化时间的时候会产出一些千奇百怪的格式&#xff0c;产出的文字我都不认识。 百思不得其解&#xff0c;终于今天在看代码的时候发现了这个问题。 它的表现是这样的&…

Redis中的复制功能(四)

复制的实现 步骤2:建立套接字连接 在SLAVEOF命令执行之后&#xff0c;从服务器将根据命令所设置的IP地址和端口&#xff0c;创建连向主服务器的套接字连接&#xff0c;如图所示。如果从服务器创建的套接字能成功连接(connect)到主服务器&#xff0c;那么从服务器将为这个套接…