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

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.lryc.cn/news/617817.html

相关文章:

  • Redis应⽤-缓存与分布式锁
  • Linux驱动学习day27天(USB驱动理论部分)
  • 修改学生信息管理系统以及查询
  • Ansys Mechanical中的声学分析
  • Nestjs框架: RBAC基于角色的权限控制模型初探
  • java内部类-匿名内部类
  • 适用于高质量核磁共振(NMR)的溶剂推荐
  • Apache ECharts 6 核心技术解密 – Vue3企业级可视化实战指南
  • 每日五个pyecharts可视化图表-line:从入门到精通 (3)
  • 编程技术杂谈4.0
  • SQL复杂查询
  • 论文学习22:UNETR: Transformers for 3D Medical Image Segmentation
  • TCGA数据集下载工具gdc-client下载慢解决方案
  • 掘金数据富矿,永洪科技为山东黄金定制“数智掘金”实战营
  • JavaScript let的使用
  • macos彻底删除vscode
  • 2025年农业工程与环境预防国际会议(ICAEEP 2025)
  • k8s 部署mysql主从集群
  • 用AListLite让安卓手机成为NAS实现文件共享
  • 基于开源模型构建医疗疾病大模型:从理论到实践
  • 2025牛客多校第八场 根号-2进制 个人题解
  • USB 基本描述符
  • TRL - Transformer Reinforcement Learning SFTTrainer 和 SFTConfig
  • AI(2)-神经网络(激活函数)
  • 当生产环境卡成 PPT:Spring Boot 线程 Dump 捉妖指南 - 第544篇
  • 【09-神经网络介绍2】
  • 数据结构-排序(2)
  • 【排序算法】⑦归并排序
  • 用Python从零开始实现神经网络
  • 【08-神经网络介绍】