React + Echarts 封装及使用

Echarts封装

src/component/chart

封装Chart组件,在里面完成Echart实例的初始化和点击事件的绑定。

复制代码
index.tsx

export const Chart = observer((props: IChartProps) => {
  const { option, loading, onClickEvent } = props;
  const chartContainerRef = useRef<HTMLDivElement>();
  const chartRef = useRef<echarts.ECharts>(null);

  initChart(chartContainerRef, chartRef);
  if (onClickEvent) handleClickEvent(chartRef, onClickEvent);
  updateOptions(chartRef, option);

  return (
    <Spin className="spin-container" spinning={loading}>
      <div className="chart-container" ref={chartContainerRef} />
    </Spin>
  );
});

init-chart.tsx

export const initChart = (
  chartContainerRef: React.MutableRefObject<HTMLDivElement>,
  chartRef: React.MutableRefObject<echarts.ECharts>
) => {
  useEffect(() => {
    const myChart = echarts.init(chartContainerRef.current);

    chartRef.current = myChart;

    return () => {
      chartRef.current.dispose();
    };
  }, []);
};

export const updateOptions = (
  chartRef: React.MutableRefObject<echarts.ECharts>,
  option: EChartOption<unknown>
) => {
  useEffect(() => {
    chartRef.current.clear();
    chartRef.current.setOption(option);
  }, [option]);
};

export const handleClickEvent = (
  chartRef: React.MutableRefObject<echarts.ECharts>,
  onClickEvent: (p: IEchartEventParams) => void
) => {
  useEffect(() => {
    chartRef.current.on('click', onClickEvent);
  }, []);
};

使用

src/container/xxx

具体的数据在Store里面拼好。

复制代码
@observer
export class XXX extends React.Component {
	render() {
		<div className="xxx">
          <Chart
            option={xxxStore.data.option}
            loading={xxxStore.getLoading(xxx)}
            onClickEvent={(p) => {
	            // sth
	        }}
          />
        )}
      </div>
	}
}
相关推荐
星栈独行22 分钟前
翻完 Pi 源码:它和 Codex、Claude Code 有何不同
开发语言·javascript·人工智能·程序人生
落落Plus1 小时前
浏览器缓存机制详解
javascript·缓存·浏览器缓存
Darling噜啦啦2 小时前
React 组件化实战:从 TodoList 吃透父子通信与状态管理
react.js
浅水壁虎4 小时前
vue基础(第二章 )
前端·javascript·vue.js
界面开发小八哥4 小时前
界面控件DevExtreme v26.1新版亮点——支持Angular 22
前端·javascript·angular.js·devexpress·ui开发·devextreme
mONESY5 小时前
React useState 核心原理与最佳实践:从异步更新到性能优化全解
javascript
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
gis开发之家6 小时前
《Vue3 从入门到大神37篇》Vue3 源码详解(七):watch 与 watchEffect 源码对比——副作用是如何被追踪的?
javascript·前端框架·vue3·vue3源码
bloglin999997 小时前
langchain 和 langgraph 和 react
javascript·react.js·langchain
触底反弹7 小时前
🚀 删了数据刷新又回来?3 组件 × 4 回调 × 3 坑讲透 React 父子通信
前端·javascript·react.js