|
@@ -5,13 +5,12 @@ import style from './Chart.less';
|
|
|
import { Card, Empty, Spin } from 'antd';
|
|
|
import { getOptions } from '@/components/ChartUtils/utils';
|
|
|
const dataCache = {};
|
|
|
-
|
|
|
+let timer;
|
|
|
function DataCenter(props) {
|
|
|
const [chart, setChart] = useState();
|
|
|
- const [timer, setTimer] = useState();
|
|
|
- const [chartOptions, setChartOptions] = useState(false);
|
|
|
+ // const [timer, setTimer] = useState();
|
|
|
+ const [chartOptions, setChartOptions] = useState({});
|
|
|
const chartEle = useRef();
|
|
|
- const iframeRef = useRef();
|
|
|
const signalRef = useRef();
|
|
|
const [loading, setLoading] = useState(false);
|
|
|
const {
|
|
@@ -25,8 +24,10 @@ function DataCenter(props) {
|
|
|
// const projectId = 92;
|
|
|
|
|
|
const handleClickTabs = id => {
|
|
|
+ if (loading) return;
|
|
|
let item = chartConfigList.find(c => c.id == id);
|
|
|
- getOptionsForConfig(item);
|
|
|
+ setLoading(true);
|
|
|
+ setChartOptions({ ...item });
|
|
|
};
|
|
|
|
|
|
useEffect(() => {
|
|
@@ -42,9 +43,7 @@ function DataCenter(props) {
|
|
|
}, [projectId]);
|
|
|
|
|
|
// useEffect(() => {
|
|
|
- // const chartWindow = iframeRef.current?.contentWindow;
|
|
|
- // console.log(chartOptions);
|
|
|
- // if (!chartWindow || !chartOptions) return;
|
|
|
+ // if (!chartOptions) return;
|
|
|
// renderChart();
|
|
|
// }, [chartOptions]);
|
|
|
|
|
@@ -54,24 +53,24 @@ function DataCenter(props) {
|
|
|
}
|
|
|
}, [chartConfigList]);
|
|
|
|
|
|
- const getOptionsForConfig = item => {
|
|
|
- setChartOptions(item);
|
|
|
- clearTimeout(timer);
|
|
|
- let t = setTimeout(() => {
|
|
|
- getOptionsForConfig({ ...item });
|
|
|
- }, 1000 * 60);
|
|
|
- setTimer(t);
|
|
|
- };
|
|
|
+ // const getOptionsForConfig = item => {
|
|
|
+ // setChartOptions(item);
|
|
|
+ // clearTimeout(timer);
|
|
|
+ // let t = setTimeout(() => {
|
|
|
+ // getOptionsForConfig({ ...item });
|
|
|
+ // }, 1000 * 60);
|
|
|
+ // setTimer(t);
|
|
|
+ // };
|
|
|
|
|
|
- const renderChart = async () => {
|
|
|
+ const renderChart = async e => {
|
|
|
+ var chartWindow = e.target.contentWindow;
|
|
|
let datas = chartOptions.configs;
|
|
|
let values = chartOptions.options;
|
|
|
let formula = JSON.parse(chartOptions.formula || '[]');
|
|
|
if (!datas) return;
|
|
|
- setLoading(true);
|
|
|
try {
|
|
|
let options = await getOptions(values, datas, formula, projectId);
|
|
|
- iframeRef.current.contentWindow.render(options);
|
|
|
+ chartWindow.render(options);
|
|
|
} catch (error) {
|
|
|
console.log(error);
|
|
|
}
|
|
@@ -100,12 +99,14 @@ function DataCenter(props) {
|
|
|
</Card>
|
|
|
<Card title="图表" bodyStyle={{ paddingBottom: 0 }}>
|
|
|
<Spin spinning={loading}>
|
|
|
- <iframe
|
|
|
- ref={iframeRef}
|
|
|
- style={{ width: '100%', height: 'calc(50vh - 80px)', border: 'none' }}
|
|
|
- onLoad={renderChart}
|
|
|
- srcDoc={chartOptions?.template?.Content}
|
|
|
- ></iframe>
|
|
|
+ {chartOptions.template?.Content && (
|
|
|
+ <iframe
|
|
|
+ style={{ width: '100%', height: 'calc(50vh - 80px)', border: 'none' }}
|
|
|
+ // srcDoc拼上id 防止当模板一致时无法触发onLoad
|
|
|
+ srcDoc={chartOptions?.template?.Content + `<div id="${chartOptions.id}"></div>`}
|
|
|
+ onLoad={renderChart}
|
|
|
+ ></iframe>
|
|
|
+ )}
|
|
|
</Spin>
|
|
|
</Card>
|
|
|
</div>
|