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

React 19 通用 ECharts 组件

好,我给你做一个 React 19 通用 ECharts 组件
支持饼图 / 折线图 / 柱状图,colors 可选,不传也能显示,防止重复渲染。


1. src/services/echarts.ts

注册所有需要的图表类型和组件(不用再分开写折线/饼图/柱状图)

// src/services/echarts.ts
import * as echarts from 'echarts/core';
import {TitleComponent,TooltipComponent,GridComponent,LegendComponent,ToolboxComponent
} from 'echarts/components';
import { LineChart, PieChart, BarChart } from 'echarts/charts';
import { CanvasRenderer } from 'echarts/renderers';// 按需注册组件
echarts.use([TitleComponent,TooltipComponent,GridComponent,LegendComponent,ToolboxComponent,LineChart,PieChart,BarChart,CanvasRenderer
]);export default echarts;

2. src/components/EChartsBase.tsx

一个通用的 React 19 ECharts 组件

// src/components/EChartsBase.tsx
import React, { useRef, useEffect } from 'react';
import echarts from '@/services/echarts';interface EChartsBaseProps {option: echarts.EChartsOption;width?: string;height?: string;
}const EChartsBase: React.FC<EChartsBaseProps> = ({option,width = '100%',height = '400px'
}) => {const chartRef = useRef<HTMLDivElement | null>(null);const chartInstance = useRef<echarts.EChartsType | null>(null);useEffect(() => {if (chartRef.current) {// 如果已有实例,先销毁,防止 React 19 重复渲染if (chartInstance.current) {chartInstance.current.dispose();}chartInstance.current = echarts.init(chartRef.current);chartInstance.current.setOption(option);}// 监听窗口大小变化const handleResize = () => {chartInstance.current?.resize();};window.addEventListener('resize', handleResize);return () => {chartInstance.current?.dispose();window.removeEventListener('resize', handleResize);};}, [option]);return <div ref={chartRef} style={{ width, height }} />;
};export default EChartsBase;

3. 使用示例(不传 colors 也能显示)

// src/pages/DemoCharts.tsx
import React from 'react';
import EChartsBase from '@/components/EChartsBase';export default function DemoCharts() {const pieOption = {title: { text: '示例饼图', left: 'center' },tooltip: { trigger: 'item' },legend: { bottom: 0 },series: [{name: '访问来源',type: 'pie',radius: '50%',data: [{ value: 1048, name: '搜索引擎' },{ value: 735, name: '直接访问' },{ value: 580, name: '邮件营销' }]}]};const lineOption = {title: { text: '示例折线图' },tooltip: { trigger: 'axis' },xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },yAxis: { type: 'value' },series: [{ data: [150, 230, 224, 218, 135, 147, 260], type: 'line', smooth: true }]};const barOption = {title: { text: '示例柱状图' },tooltip: {},xAxis: { type: 'category', data: ['苹果', '香蕉', '橘子', '梨子'] },yAxis: { type: 'value' },series: [{ data: [5, 20, 36, 10], type: 'bar' }]};return (<div style={{ padding: 20 }}><EChartsBase option={pieOption} height="300px" /><EChartsBase option={lineOption} height="300px" /><EChartsBase option={barOption} height="300px" /></div>);
}

✅ 特点:

  • React 19 兼容

  • 饼图 / 折线图 / 柱状图通用

  • colors 可选,不传也正常显示

  • 自动销毁实例,避免 React 19 重复渲染导致的图表不显示

  • 自动响应窗口大小变化

http://www.xdnf.cn/news/17536.html

相关文章:

  • uni-app app端安卓和ios如何申请麦克风权限,唤起提醒弹框
  • 什么是网络准入控制系统?解析一款网络准入的详细功能
  • FPGA+护理:跨学科发展的探索(二)
  • 最短路问题从入门到负权最短路
  • 【算法专题训练】11、字符串中的变位词
  • “鱼书”深度学习进阶笔记(3)第四章
  • MLAG双活网络妙招:BGP + 静态VRRP实现智能负载均衡
  • (一)vscode搭建espidf环境
  • Linux线程——线程控制及理解
  • LLM大语言模型初步学习认识
  • day23|前端学习三件套
  • 集成电路学习:什么是URDF Parser统一机器人描述格式解析器
  • 10种经典学习方法的指令化应用
  • 动态创建可变对象:Python类工厂函数深度解析
  • 【k近邻】Kd树的构造与最近邻搜索算法
  • 用户虚拟地址空间布局
  • JVM管理数据的方式
  • 剧本杀小程序系统开发:推动行业数字化转型新动力
  • Linux中DNS系统搭建与配置指南(配实验步骤与注释)
  • 在 .NET Core 5.0 中启用 Gzip 压缩 Response
  • Tricentis Tosca:现代软件测试的自动化利器
  • 企业级 IT 运维服务平台数据备份方案:基于 rsync 的自动化实现
  • AI生成代码时代的商业模式重构:从“软件即产品”到“价值即服务”
  • 云原生环境Prometheus企业级监控
  • Notepad++ 插件开发实战:从理念到落地的探索
  • 嵌入式第二十五天(基于Linux操作系统的编程-文件操作)
  • 大模型提示词工程实践:大语言模型文本转换实践
  • 【读代码】微软开源Agentic-RAG深度解析
  • execjs执行js报错, subprocess.py编码问题
  • Ignite端口管理组件GridPortProcessor全解析