vue3+vite+JS,使用Echarts封装一个饼图,父子组件联动
本文要在vue3viteJS项目中使用Echarts封装一个饼图子组件父组件中引入子组件并传入数据。传入的数据包括标题、高度、宽度、饼图数据resize监听尺寸。子组件监听饼图数据的变化来更新子组件的显示内容。文章目录一、实现思路二、完整代码实现1. 安装 ECharts 依赖2. 饼图子组件PieChart.vue3. 父组件ParentPage.vue三、关键代码解释四、使用注意事项五、封装总结一、实现思路子组件封装基于 ECharts 封装饼图组件接收父组件传入的标题、宽高、饼图数据等 props响应式处理监听饼图数据变化自动更新图表监听窗口 resize 事件自适应调整图表尺寸父组件使用导入子组件传入自定义数据实现灵活配置。二、完整代码实现1. 安装 ECharts 依赖npminstallecharts--save# 或 yarn add echarts2. 饼图子组件PieChart.vuetemplate !-- 图表容器宽高由父组件传入 -- div refchartRef classpie-chart-container :style{ width: width px, height: height px } /div /template script setup import { ref, watch, onMounted, onUnmounted } from vue import * as echarts from echarts // 定义接收的 props const props defineProps({ // 饼图标题 title: { type: String, default: 饼图示例 }, // 图表宽度px width: { type: Number, default: 400 }, // 图表高度px height: { type: Number, default: 300 }, // 饼图数据格式[{ name: 分类1, value: 100 }, ...] chartData: { type: Array, required: true, validator: (val) { // 简单校验数据格式 return val.every(item item.hasOwnProperty(name) item.hasOwnProperty(value)) } } }) // 图表实例引用 const chartRef ref(null) // ECharts 实例 let chartInstance null // 初始化图表 const initChart () { // 确保容器存在 if (!chartRef.value) return // 初始化 ECharts 实例 chartInstance echarts.init(chartRef.value) // 设置图表配置项 const option { title: { text: props.title, left: center // 标题居中 }, tooltip: { trigger: item, // 鼠标悬浮提示 formatter: {a} br/{b}: {c} ({d}%) // 提示格式名称数值百分比 }, legend: { orient: vertical, // 图例垂直排列 left: left // 图例居左 }, series: [ { name: props.title, type: pie, radius: [40%, 70%], // 饼图内外半径 avoidLabelOverlap: false, label: { show: false, position: center }, emphasis: { label: { show: true, fontSize: 16, fontWeight: bold } }, labelLine: { show: false }, data: props.chartData // 饼图数据 } ] } // 渲染图表 chartInstance.setOption(option) } // 更新图表数据变化时调用 const updateChart () { if (!chartInstance) return // 仅更新数据相关配置避免重复初始化 chartInstance.setOption({ title: { text: props.title }, series: [{ data: props.chartData }] }) } // 监听窗口 resize自适应调整图表尺寸 const handleResize () { if (chartInstance) { chartInstance.resize() } } // 生命周期挂载时初始化图表 监听 resize onMounted(() { initChart() window.addEventListener(resize, handleResize) }) // 生命周期卸载时销毁实例 移除监听 onUnmounted(() { if (chartInstance) { chartInstance.dispose() // 销毁 ECharts 实例释放内存 chartInstance null } window.removeEventListener(resize, handleResize) }) // 监听 props 变化更新图表 watch( // 监听标题、宽高、数据的变化 [() props.title, () props.width, () props.height, () props.chartData], () { // 宽高变化时先销毁再重新初始化数据/标题变化时仅更新配置 if (props.width || props.height) { chartInstance?.dispose() initChart() } else { updateChart() } }, { deep: true // 深度监听数组/对象变化 } ) /script style scoped .pie-chart-container { /* 防止容器内边距影响尺寸 */ box-sizing: border-box; /* 解决图表容器闪烁问题 */ transition: all 0.3s ease; } /style3. 父组件ParentPage.vuetemplate div classparent-page h2饼图组件使用示例/h2 !-- 操作区修改数据/尺寸 -- div classcontrol-panel button clickchangeChartData切换饼图数据/button button clickchangeChartSize修改图表尺寸/button button clickchangeChartTitle修改图表标题/button /div !-- 引入饼图子组件传入配置 -- PieChart :titlechartTitle :widthchartWidth :heightchartHeight :chart-datachartData / /div /template script setup import { ref } from vue // 导入饼图子组件 import PieChart from ./PieChart.vue // 定义饼图配置数据响应式 const chartTitle ref(各部门人数分布) const chartWidth ref(500) const chartHeight ref(400) // 初始饼图数据 const chartData ref([ { name: 技术部, value: 30 }, { name: 产品部, value: 15 }, { name: 市场部, value: 20 }, { name: 财务部, value: 8 }, { name: 人事部, value: 7 } ]) // 模拟切换饼图数据 const changeChartData () { chartData.value [ { name: 技术部, value: 40 }, { name: 产品部, value: 10 }, { name: 市场部, value: 25 }, { name: 财务部, value: 5 }, { name: 人事部, value: 10 }, { name: 运营部, value: 10 } // 新增分类 ] } // 模拟修改图表尺寸 const changeChartSize () { chartWidth.value 600 chartHeight.value 450 } // 模拟修改图表标题 const changeChartTitle () { chartTitle.value 各部门人数分布更新后 } /script style scoped .parent-page { padding: 20px; } .control-panel { margin-bottom: 20px; } .control-panel button { margin-right: 10px; padding: 8px 16px; border: none; border-radius: 4px; background: #409eff; color: #fff; cursor: pointer; } .control-panel button:hover { background: #66b1ff; } /style三、关键代码解释子组件核心逻辑props 定义明确接收标题、宽高、饼图数据且对chartData做格式校验确保数据合法性图表初始化initChart方法创建 ECharts 实例并配置基础样式updateChart方法仅更新数据/标题避免重复初始化响应式监听通过watch深度监听 props 变化宽高变化时重新初始化图表数据/标题变化时仅更新配置生命周期管理onMounted时初始化图表并添加 resize 监听onUnmounted时销毁 ECharts 实例、移除监听防止内存泄漏resize 适配监听窗口尺寸变化调用chartInstance.resize()自动调整图表大小。父组件核心逻辑定义响应式数据标题、宽高、饼图数据传入子组件提供按钮模拟数据/尺寸/标题变化验证子组件的响应式更新能力。四、使用注意事项数据格式父组件传入的chartData必须是[{ name: xxx, value: xxx }, ...]格式子组件已做基础校验内存泄漏子组件在onUnmounted中销毁 ECharts 实例、移除 resize 监听避免页面卸载后残留事件自适应优化如果需要监听父容器尺寸变化而非窗口可结合element-resize-detector库实现样式适配子组件容器的宽高使用px单位若需百分比可修改 props 类型为 String如width: 100%。五、封装总结子组件封装了 ECharts 饼图的核心逻辑通过 props 接收父组件配置具备数据响应式更新、窗口 resize 自适应能力父组件可灵活传入自定义数据通过修改响应式数据即可触发子组件更新使用简单关键优化点销毁 ECharts 实例、移除事件监听避免内存泄漏深度监听数据变化保证图表实时更新。

相关新闻

基于非完整约束RRT算法与混合控制协议的充满障碍物环境中分散式非完整约束系统的避碰控制器研究(Matlab代码实现)

基于非完整约束RRT算法与混合控制协议的充满障碍物环境中分散式非完整约束系统的避碰控制器研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

2026/7/8 14:33:21 阅读更多 →
压力容器钣金展开、容积、重量及各部件计算

压力容器钣金展开、容积、重量及各部件计算

压力容器钣金展开,容积,重量及各部件计算刚接触压力容器设计那会儿,钣金展开这事儿差点把我整秃了。车间老师傅总说"展开不对,焊工流泪",直到亲眼见过下料尺寸误差导致整个筒体报废,才明白这些计…

2026/5/17 10:31:46 阅读更多 →
PLC自动控制气力输送工艺

PLC自动控制气力输送工艺

气力输送电气plc自动控制工艺在水泥厂见过那些纵横交错的管道吗?里面飞沙走石全靠气力输送系统撑着。这玩意儿说白了就是用压缩空气带着粉煤灰、水泥生料满场飞,但要让物料乖乖听话可不简单。今天咱们就扒一扒PLC是怎么当这个"管道指挥家"的。…

2026/7/5 21:45:59 阅读更多 →

最新新闻

AI辅助API文档生成:从Swagger注解到智能化接口说明

AI辅助API文档生成:从Swagger注解到智能化接口说明

AI辅助API文档生成:从Swagger注解到智能化接口说明 一、从"手动注解"到"智能生成"的文档工程演进 API文档的维护成本是后端团队的隐性负担:Swagger注解与代码逻辑的耦合导致每次接口变更都要同步修改注解,而注解中的业务…

2026/7/8 14:34:13 阅读更多 →
定时器Timer详解:计数、延时、PWM输出和输入捕获一次讲清

定时器Timer详解:计数、延时、PWM输出和输入捕获一次讲清

定时器Timer详解:计数、延时、PWM输出和输入捕获一次讲清 一、本文适用场景 定时器 Timer 是单片机中非常核心的基础外设。无论是 STM32、GD32、51 单片机,还是其他 MCU,只要涉及时间控制、周期任务、PWM 输出、测频率、测脉宽,基…

2026/7/8 14:28:08 阅读更多 →
B站视频转Markdown笔记:构建个人AI知识库的完整指南

B站视频转Markdown笔记:构建个人AI知识库的完整指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在实际学习过程中,很多人习惯把 B 站的优质视频教程、技术分享、深度解析等内容收藏起来,打算“以后再看”。但…

2026/7/8 14:28:08 阅读更多 →
Windows系统文件Chakradiag.dll丢失找不到问题解决

Windows系统文件Chakradiag.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

2026/7/8 14:26:06 阅读更多 →
机器学习实验平台数据预处理避坑:发电场数据.xlsx 读取与划分的3个常见错误及解决

机器学习实验平台数据预处理避坑:发电场数据.xlsx 读取与划分的3个常见错误及解决

机器学习实验平台数据预处理避坑指南:发电场数据.xlsx 读取与划分的3个常见错误及解决 在机器学习项目的全流程中,数据预处理环节往往占据70%以上的工作量,而Excel文件作为企业数据存储的常见载体,其读取与处理过程中的陷阱可能直…

2026/7/8 14:24:05 阅读更多 →
论文被批“不够学术”?师姐安利这几个一键生成论文工具

论文被批“不够学术”?师姐安利这几个一键生成论文工具

论文写作总是卡在选题、找文献、写大纲这些环节?别急,用对AI工具走对流程,效率直接翻倍——资深教授普遍推荐:千笔AI(中文全流程首选) 豆包学术版(轻量高效) DeepSeek 学术版&#x…

2026/7/8 14:20:03 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻