当前位置: 首页 > news >正文

项目-03-封装echarts组件并使用component动态加载组件

目录

  • 需求
  • 场景+代码
  • 补充说明
    • 1. typeComponentMap 讲解
    • 2. 为什么要给Echarts实例DOM添加id
    • 3. 为什么要在 onMounted 里添加 nextTick
    • 4. 为什么要监听props.option

需求

  • 由于需要多次用到echarts,需要封装一个echarts组件
  • 动态加载echarts组件

场景+代码

场景:

  • 在 test.vue 里调用 echarts 组件,test.vue 会将 echarts 需要的数据传给它
  • echarts 封装目录如下:其中 app-Echarts 中的 index.vue 将会被注册为【全局组件】,名字为AppEcharts
    在这里插入图片描述

test.vue

<template><div v-for="(item, index) in statisticsType" :key="index"><AppEcharts :option="item.option" type="line" :id="item.id"></AppEcharts></div>
</template><script setup lang="ts">
import { computed } from 'vue'
const statisticsType = computed(() => {{id: 'id1',name: '用户总数',icon: 'app-user',background: '#EBF1FF',color: '#3370FF',sum: [100, 200],option: {  // options里就是echarts图表需要的数据,大家可以自己准备title: '用户总数',xDatas: ['2025-1-1', '2025-1-12'],yDatas: [{name: '用户总数',type: 'line',area: true,data: [...]},{name: '用户新增数',type: 'line',area: true,data: [...]}]}},
})
</script>

/src/components/app-Echarts/index.vue

<template><component :is="typeComponentMap[props.type]" :option="option":id="props.id"/>
</template><script setup lang="ts">
import line from './components/LineEcharts.vue'
defineOptions({ name: 'AppEcharts'})
const props = defineProps({option: {type: Object,required: true},type: {type: String,default: 'line'},id: {type: String,required: true}
})
const typeComponentMap = { line } as any // 将typeComponentMap断言为any
</script><style lang="scss" scoped></style>

/src/components/app-Echarts/components/LineEcharts.vue

<template><div ref="PieChartRef" :id="props.id" :style="{ height: props.heigth, width: props.width}"></div>
</template>
<script setup lang="ts">
import { nextTick, onMounted, watch } from 'vue';
import * as echarts from 'echarts'
const props = defineProps({option: {type: Object,required: true},id: {type: String,required: true},width: {type: String,default: '100%'},heigth: {type: String,default: '200px'}
})const color = ['rgba(82, 133, 255, 1)', 'rgba(255, 207, 47, 1)']const areaColor = ['rgba(82, 133, 255, 0.2)', 'rgba(255, 207, 47, 0.2)']function initChart() {// 获取dom实例let myChart = echarts?.getInstanceByDom(document.getElementById(props.id)!)if(myChart === null || myChart === undefined) {myChart = echarts.init(document.getElementById(props.id))}const series: any = []... // 这里处理了一个options,把里面的部分数据处理成series需要的样子const option = {title: {text: props.option.title, // 标题内容textStyle: { // 标题样式fontSize: '16px' }},tooltip: { // 用于设置鼠标悬浮时显示的提示框trigger: 'axis', // 提示框的触发方式是轴触发axisPointer: { // 配置坐标指示器type: 'cross', // 用来设置坐标轴指示器的样式类型label: { // 用于设置坐标轴指示器的标签样式backgroundColor: '#6a7985'}}},legend: { // 用于设置图例项的名称right: 0,itemWidth: 8,textStyle: {color: '#646A73'},icon: 'circle'},grid: { // 用于配置图表的网格区域left: '1%',right: '1%',bottom: '0',top: '18%',containLabel: true // 坐标轴和图例都被包含在网格区域内},xAxis: { // 设置x轴相关属性type: 'category', // 设置x轴为类目轴,意味着x轴上的数据是类别数据(而不是数值轴)data: props.option.xDatas // x轴刻度数据},yAxis: { // 设置y轴相关属性type: 'value', // 设置y轴为数值轴,这意味着y轴的值是数字,可以进行数值范围的展示splitLine: { // 设置y轴的分割线lineStyle: {color: '#EFF0F1'}}},series: series// series常见属性// type:图表类型// name:图表名称// data:图表数据// areaStyle:用于设置折线图下方的填充区域样式// itemStyle:用于设置单个数据项的样式,例如折线图的每个点、柱状图的每根柱子等,有color(颜色)等等}myChart.setOption(option, true)
}function changeChartSize() {// 调用了图表实例的 resize() 方法,动态调整图表的尺寸以匹配其容器大小。echarts.getInstanceByDom(document.getElementById(props.id)!)?.resize()
}watch(() => props.option,(val) => {if (val) {nextTick(() => {initChart()})}}
)onMounted(() => {nextTick(() => {initChart()window.addEventListener('resize', changeChartSize)})
})</script>
<style lang="scss" scoped></style>

补充说明

1. typeComponentMap 讲解

问题: 为什么要单独再写 typeComponentMap ?

  • 因为这样封装的组件可以通过 type 指定需要的图表种类
  • 我可能会封装多种样式的 echarts 图表(在上述截图中我只封装了折线图),例如如果我在 /src/components/app-Echarts/components/ 封装了 LineEcharts.vue 和 Column.vue,那么我可以在script里引入这两个组件,然后都加到typeComponentMap中,这样可以通过传递type参数指定需要的echarts图表类型

在这里插入图片描述

2. 为什么要给Echarts实例DOM添加id

  • ECharts 的 getInstanceByDom 和 init 方法都依赖唯一的 DOM 节点。如果每个图表容器都有唯一的 id,就可以轻松获取并管理特定的图表实例
  • 举例:在一个vue页面多次调用Echarts组件,动态传id后每个echarts都有自己的id
    在这里插入图片描述

3. 为什么要在 onMounted 里添加 nextTick

  • onMounted 的执行时间虽然是在 DOM 挂载后,但如果依赖的 DOM 尚未完全渲染(如 props.id
    对应的容器),直接操作可能失败。
  • 比如,ECharts 初始化时需要容器的实际尺寸信息,如果直接在 onMounted
    操作,而此时尺寸信息尚未准备好,图表可能无法正确绘制。

不加的后果: echarts 图表无法正常渲染

在这里插入图片描述

4. 为什么要监听props.option

  • props.option 是父组件传递的配置对象: 在 Vue 中,props 的值由父组件控制。如果父组件改变了传递给子组件的
    option 数据,子组件需要根据新的数据重新渲染图表。
  • 动态更新图表内容: 图表的内容和样式依赖于props.option,如果不监听这个属性,图表内容不会随着数据变化而更新,导致显示结果与实际数据不符。
  • 举例:点击“7日内”,会将相应数据传给echarts组件,渲染echarts图表,再次点击“30日内”,会将30日相应数据传给echarts组件,组件检测到props.option的变化,重新渲染图表

在这里插入图片描述

相关文章:

项目-03-封装echarts组件并使用component动态加载组件

目录 需求场景代码补充说明1. typeComponentMap 讲解2. 为什么要给Echarts实例DOM添加id3. 为什么要在 onMounted 里添加 nextTick4. 为什么要监听props.option 需求 由于需要多次用到echarts&#xff0c;需要封装一个echarts组件动态加载echarts组件 场景代码 场景&#xf…...

使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发

开发一个完整的工作流系统使用 Blazor 和 Elsa Workflows 作为引擎&#xff0c;可以实现一个功能强大的工作流管理和设计系统。下面将提供详细的步骤和代码实现&#xff0c;展示如何在 Blazor 中开发一个基于 Elsa Workflows 的工作流系统。 项目概述 我们的工作流系统将包含以…...

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…...

elasticsearch 数据导出/导入

例子&#xff1a; 导出命令&#xff1a; elasticdump --inputhttps://elastic:elasticsearchlocalhost:9100/company --outputcompany.json --typedata --no-verify 注意&#xff0c;本地docker搭建&#xff0c;禁用自签证书验证&#xff0c;先设置环境变量 export NODE_TL…...

什么是三高架构?

大家好&#xff0c;我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助&#xff1b; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性&#xff08;High Availability&#xff09;、高性能&#xff…...

Docker 单机快速部署大数据各组件

文章目录 一、Spark1.1 NetWork 网络1.2 安装 Java81.3 安装 Python 环境1.4 Spark 安装部署 二、Kafka三、StarRocks四、Redis五、Rabbitmq六、Emqx6.1 前言6.2 安装部署 七、Flink八、Nacos九、Nginx 一、Spark 1.1 NetWork 网络 docker network lsdocker network create -…...

CSS笔记基础篇01——选择器、文字控制属性、背景属性、显示模式、盒子模型

黑马程序员视频地址&#xff1a; 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodeshttps://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d3666…...

pytest全局配置文件pytest.ini

pytest.ini 改变 pytest 的默认行为&#xff0c;一般放在项目的根目录&#xff0c;不能包含中文符号。不管是主函数模式运行&#xff0c;命令行模式运行&#xff0c;都会去读取这个全局配置文件。 [pytest] ;配置命令行参数&#xff0c;用空格进行分隔。addopts 中的选项会被命…...

PyTest自学-认识PyTest

1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么&#xff1f; PyTest是一个自动化测试框架&#xff0c;支持单元测试和功能测试&#xff0c;有丰富的插件&#xff0c;如&#xff0c;pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…...

【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中&#xff0c;制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动&#xff0c;旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…...

自旋锁与CAS

上文我们认识了许许多多的锁&#xff0c;此篇我们的CAS就是从上文的锁策略开展的新概念&#xff0c;我们来一探究竟吧 1. 什么是CAS&#xff1f; CAS: 全称Compare and swap&#xff0c;字⾯意思:“比较并交换”&#xff0c;⼀个CAS涉及到以下操作&#xff1a; 我们假设内存中…...

数组-二分查找

目录 算法思想&#xff1a; 实践&#xff1a; 备注&#xff1a; 二分查找是一种高效的查找算法&#xff0c;适用于在 有序数组 或列表中快速定位目标元素的索引。 重要事情说三遍&#xff1a;使用前提&#xff1a;数组有序&#xff0c;无重复&#xff0c;如果数组未排序&am…...

如何使用 Python 进行文件读写操作?

大家好&#xff0c;我是 V 哥。今天的内容来介绍 Python 中进行文件读写操作的方法&#xff0c;这在学习 Python 时是必不可少的技术点&#xff0c;希望可以帮助到正在学习 python的小伙伴。 以下是 Python 中进行文件读写操作的基本方法&#xff1a; 一、文件读取&#xff1…...

springcloud中的Feign调用

目录 一、基础应用 1.feign使用 1.增加feign依赖 2.编写feign接口 3.启用feign 4.调试 5.可能出现的异常信息 1.404 可能原因: 2.503 可有原因: 2.feign自定义配置 1.创建Feign配置类 2.feign接口 3.调试结果 3.feign多参数请求 Feign是Netflix开发的声明…...

【部署】将项目部署到云服务器

目录 1.获得服务器 2.连接到云服务器 3.配置环境 3.1.Java&#xff08;运行后端所需&#xff09; 3.2.MySQL数据库 3.3.Nginx&#xff08;运行前端所需&#xff09; 3.4. Node.js&#xff08;构建前端所需&#xff09; 4.打包项目 4.1.打包后端项目 4.2.打包前端项目…...

2024年AI大模型技术年度总结与应用实战:创新与突破并进

前言 回顾2024年&#xff0c;我一共发布了286篇博文&#xff0c;粉丝数也达到了43000多。这一年里&#xff0c;我收获颇丰&#xff0c;始终坚持AI大模型的研究方向&#xff0c;并且积极开展大模型的实战应用&#xff0c;也取得了一系列令人振奋的突破。 在286篇博文中&#…...

docker离线安装及部署各类中间件(x86系统架构)

前言&#xff1a;此文主要针对需要在x86内网服务器搭建系统的情况 一、docker离线安装 1、下载docker镜像 https://download.docker.com/linux/static/stable/x86_64/ 版本&#xff1a;docker-23.0.6.tgz 2、将docker-23.0.6.tgz 文件上传到服务器上面&#xff0c;这里放在…...

SuperdEye:一款基于纯Go实现的间接系统调用执行工具

关于SuperdEye SuperdEye是一款基于纯Go实现的间接系统调用执行工具&#xff0c;该工具是TartarusGate 的修订版&#xff0c;可以利用Go来实现TartarusGate 方法进行间接系统调用。 该工具的目标是为了扫描挂钩的NTDLL并检索Syscall编号&#xff0c;然后使用它来执行间接系统调…...

PCL 新增自定义点类型【2025最新版】

目录 一、自定义点类型1、前言2、定义方法3、代码示例二、合并现有类型三、点云按时间渲染1、CloudCompare渲染2、PCL渲染博客长期更新,本文最近更新时间为:2025年1月18日。 一、自定义点类型 1、前言 PCL库自身定义了很多点云类型,但是在使用的时候时如果要使用自己定义的…...

Docker导入镜像

使用命令行进行处理&#xff1a; docker load < onething1_wxedge.tar如下图所示 查看状态 docker images...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等&#xff0c;设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…...