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>
	}
}
相关推荐
小迷糊的学习记录20 分钟前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜31 分钟前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
不爱吃糖的程序媛42 分钟前
Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南
前端·javascript·flutter
利刃大大42 分钟前
【Vue】Element-Plus快速入门 && Form && Card && Table && Tree && Dialog && Menu
前端·javascript·vue.js·element-plus
NEXT061 小时前
AI 应用工程化实战:使用 LangChain.js 编排 DeepSeek 复杂工作流
前端·javascript·langchain
光影少年2 小时前
react的hooks防抖和节流是怎样做的
前端·javascript·react.js
小毛驴8502 小时前
Vue 路由示例
前端·javascript·vue.js
发现一只大呆瓜2 小时前
AI流式交互:SSE与WebSocket技术选型
前端·javascript·面试
m0_719084113 小时前
React笔记张天禹
前端·笔记·react.js
Ziky学习记录3 小时前
从零到实战:React Router 学习与总结
前端·学习·react.js