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>
	}
}
相关推荐
山河木马3 小时前
矩阵专题3-怎么创建投影矩阵(uProjectionMatrix)
javascript·webgl·计算机图形学
泯泷5 小时前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
泯泷5 小时前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
朦胧之6 小时前
页面白屏卡住排查方法
前端·javascript
Ruihong6 小时前
Vue withDefaults 转 React:VuReact 怎么处理?
vue.js·react.js·面试
犇驫聊AI7 小时前
Chrome DevTools MCP + Claude Code 自定义skills生成接口代码生成器
前端·javascript
kyriewen7 小时前
别再这样写 async/await 了:我在 Code Review 中见过最多的 8 个错误
前端·javascript·面试
用户2986985301412 小时前
在 React 中使用 JavaScript 将 Excel 转换为 SVG
前端·javascript·react.js
labixiong12 小时前
手写Promise--微任务、静态方法、async/await 全搞懂(三)
前端·javascript
铁皮饭盒13 小时前
3行代码搞定页面截图,Bun.WebView真的简单
javascript