当前位置: 首页 > 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.dtcms.com/a/325537.html

相关文章:

  • 【牛客刷题】REAL809 转化
  • GPT-5越狱与零点击AI代理攻击:云与IoT系统面临新型威胁
  • 龙虎榜——20250811
  • HTTPS的应用层协议
  • 数据类型 hash
  • 浏览器CEFSharp+X86+win7 之 测试抖音小店订单抓取(八)
  • 秋天落叶可视化
  • 【BFS 树状数组】P9026 [CCC 2021 S4] Daily Commute|普及+
  • DCA1000使用网线采集数据时的注意事项
  • 用于水T1值和脂肪分数量化的上半身自由呼吸磁共振指纹成像|文献速递-医学影像算法文献分享
  • 【软考中级网络工程师】知识点之 TCP 协议深度剖析
  • JavaEE初阶2.0
  • Linux Web服务器与WordPress部署笔记
  • Linux文件描述符相关知识
  • 一周学会Matplotlib3 Python 数据可视化-绘制直方图(Histogram)
  • Linux-常用命令
  • Windows文件时间修改指南:从手动到自动化
  • 10种经典学习方法的指令化应用
  • 【lucene】文档id docid
  • 在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录
  • Qwen-Image:通义团队新开源超强中文文生图模型(技术报告解读)
  • 【C++】哈希表的实现(unordered_map和unordered_set的底层)
  • 药用植物甾体皂苷生物合成途径研究进展--文献精读158
  • fwrite fread与流定位相关接口
  • CoreShop商城框架开启多租户(1)
  • 下一个排列 的 思路总结
  • OrbStack 入门教程:macOS 上的轻量级容器与虚拟机管理工具
  • macOS 搭建 Gitea 私有 Git 服务器教程
  • Mac配置服务器工具Royal TSX
  • SDI设计中,为何SD-SDI模式下,接收器用DRU实现,在3G-SDI模式下,使用transceiver实现