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>
	}
}
相关推荐
我叫黑大帅12 分钟前
解决聊天页内部滚轮改为页面滚动问题
javascript·后端·面试
新酱爱学习33 分钟前
手搓 10 个 Skill 后,我把重复劳动收敛成了一套零依赖 CLI 工具
前端·javascript·人工智能
罗超驿40 分钟前
13.JavaScript 新手入门指南:语法、变量、流程控制全解析
开发语言·javascript
ct9781 小时前
Three.js 性能优化(测量-定位-优化)
javascript·性能优化·three
陈_杨2 小时前
鸿蒙开发-疾阅App阅读训练功能技术解析
前端·javascript
不好听6132 小时前
Node.js 工程化开发流程 — 知识点总结
javascript·node.js
ZengLiangYi2 小时前
sql.js WASM 深度解析
javascript·数据库·后端
JustHappy3 小时前
古法编程秘籍(三):为什么需要函数?因为程序员讨厌重复劳动
前端·javascript·后端
weixin_397574093 小时前
AgentRAG与ReAct推理链:从检索增强到推理增强
前端·react.js·前端框架
想要狠赚笔的小燕3 小时前
vue项目的入口文件是什么 main.js还是index.html,他俩有啥区别
前端·javascript