import React, { useContext, useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import Highcharts from 'highcharts/highstock'; import HighchartsReact from 'highcharts-react-official'; import { ConfigProvider } from 'antd'; import './index.less'; let chartWidth = 0; // chart width let chartHeight = 0; // chart height const BasicChart = (props) => { const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); const prefixCls = getPrefixCls('basic-chart'); const { chartOptions, constructorType } = props; const [options, setOptions] = useState(defaultOptions); const container = useRef(null); // 处理图表options const handleChartOptions = () => { const options = { ...defaultOptions, ...chartOptions, }; if (container.current) { if (container.current.offsetWidth !== 0) { chartWidth = container.current.offsetWidth; chartHeight = container.current.offsetHeight; } Highcharts.setOptions({ // 处理 chart 高度坍塌 chart: { width: container.current.offsetWidth === 0 ? chartWidth : container.current.offsetWidth, height: container.current.offsetHeight === 0 ? chartHeight : container.current.offsetHeight, }, }); } Highcharts.setOptions({ global: { timezoneOffset: -8 * 60 }, }); return options; }; useEffect(() => { setOptions({ ...handleChartOptions() }); }, [chartOptions]); return ( <div className={classNames(prefixCls)} ref={container}> <HighchartsReact immutable={true} highcharts={Highcharts} constructorType={constructorType} options={options} {...props} /> </div> ); }; BasicChart.defaultProps = { constructorType: 'chart', chartOptions: {}, }; BasicChart.propTypes = { columns: PropTypes.string, chartOptions: PropTypes.object, }; export default BasicChart; const defaultOptions = { chart: { zoomType: 'x', backgroundColor: 'rgba(255, 255, 255, 0.5)', }, title: null, credits: false, rangeSelector: { enabled: false, }, xAxis: [ { lineWidth: 0, crosshair: true, type: 'datetime', dateTimeLabelFormats: { second: '%H:%M:%S', minute: '%H:%M', hour: '%H:%M', day: '%d', week: '%d', month: '%d', year: '%Y', }, }, ], yAxis: [ { title: null, opposite: false, // 即坐标轴会显示在对立面 lineWidth: 1, }, ], tooltip: { shared: true, split: false, valueDecimals: 3, dateTimeLabelFormats: { second: '%H:%M:%S', minute: '%H:%M', hour: '%H:%M', day: '%d', week: '%d', month: '%d', year: '%Y', }, }, plotOptions: { series: { showInNavigator: true, connectNulls: false, zoneAxis: 'x', }, }, legend: { verticalAlign: 'top', }, series: [], };