函数式组件写Echart


/*
* @Author: 作者 * @Date: 2022-07-05 17:16:05 * @LastEditors: 最后修改人 * @LastEditTime: 2022-07-06 14:39:27 * @Description: 描述 */ import React, { useState, useEffect, useRef } from 'react import * as echarts from 'echarts'; const FirstLacp = (props) => { // 基于准备好的dom,初始化echarts实例 const myLcap = useRef(null); const { charts } = props.data; const myChart = useRef(null); // const [myChart, setMyChart] = useState(); //useState的Set方法实际上是覆盖掉以前的数据 ,所以选择用useref存储,这样的话没有覆盖一说,更好理解。 useEffect(() => {
myChart.current = echarts.init(myLcap.current); } }, []);
//写两个useEffect有先后顺序。满足先创建Echart后再调用Echart中的方法控制样式和数据 useEffect(()
=> {
//判断数据是否已经传过来 避免第一次初始化时。数据为空 下列方法获取不到对应参数而报错
if (charts) { var color = ['rgba(23, 255, 243', 'rgba(119,61,190']; var lineY = []; for (var i = 0; i < charts.names.length; i++) { var x = i; if (x > color.length - 1) { x = color.length - 1; } var data = { name: charts.names[i], type: 'line', color: color[x] + ')', smooth: true, areaStyle: { normal: { color: new echarts.graphic.LinearGradient( 0, 0, 0, 1, [ { offset: 0, color: color[x] + ', 0.3)', }, { offset: 0.8, color: color[x] + ', 0)', }, ], false, ), shadowColor: 'rgba(0, 0, 0, 0.1)', shadowBlur: 10, }, }, symbol: 'circle', symbolSize: 5, data: charts.value[i], }; lineY.push(data); } // lineY[0].markLine = { // silent: true, // data: [ // { // yAxis: 5, // }, // { // yAxis: 100, // }, // { // yAxis: 200, // }, // { // yAxis: 300, // }, // { // yAxis: 400, // }, // ], // }; // // 绘制图表 myChart.current.setOption({ backgroundColor: '#0d235e', tooltip: { trigger: 'axis', }, legend: { data: charts.names, textStyle: { fontSize: 12, color: 'rgb(0,253,255,0.6)', }, right: '4%', }, grid: { top: '14%', left: '4%', right: '4%', bottom: '12%', containLabel: true, }, xAxis: { type: 'category', boundaryGap: false, data: charts.lineX, axisLabel: { textStyle: { color: 'rgb(0,253,255,0.6)', }, formatter: function (params) { return params.split(' ')[0]; }, }, }, yAxis: { name: charts.unit, type: 'value', axisLabel: { formatter: '{value}', textStyle: { color: 'rgb(0,253,255,0.6)', }, }, splitLine: { lineStyle: { color: 'rgb(23,255,243,0.3)', }, }, axisLine: { lineStyle: { color: 'rgb(0,253,255,0.6)', }, }, }, series: lineY, }); setInterval(() => { myChart.current.setOption({ legend: { selected: { 出口: false, 入口: false, }, }, }); myChart.current.setOption({ legend: { selected: { 出口: true, 入口: true, }, }, }); }, 1000); } }, [charts]); return ( <div ref={myLcap} id="lacpEchart" style={{ width: '1200px', height: '500px', backgroundColor: 'white', }} ></div> ); }; export default FirstLacp;

 

优化完毕的函数式echart组件

/*
 * @Author: 作者
 * @Date: 2022-07-05 17:16:05
 * @LastEditors: 最后修改人
 * @LastEditTime: 2022-07-07 09:20:06
 * @Description: 描述
 */
import React, { useEffect, useRef, useMemo } from 'react';
import * as echarts from 'echarts';
const FirstLacp = (props) => {
  // 基于准备好的dom,初始化echarts实例
  const myLcap = useRef(null);
  const { data } = props;
  const myChart = useRef(null);

  useEffect(() => {
    if (myLcap.current) {
      myChart.current = echarts.init(myLcap.current);
    }
  }, []);

  const lineY = useMemo(() => {
    var color = ['rgba(23, 255, 243', 'rgba(119,61,190'];
    //如果data有值则执行&&后面的   如果data为空则不执行
    return (
      data.value &&
      data.value.map((item, index) => {
        return {
          name: item.name,
          type: 'line',
          color: color[index] + ')',
          smooth: true,
          areaStyle: {
            normal: {
              color: new echarts.graphic.LinearGradient(
                0,
                0,
                0,
                1,
                [
                  {
                    offset: 0,
                    color: color[index] + ', 0.3)',
                  },
                  {
                    offset: 0.8,
                    color: color[index] + ', 0)',
                  },
                ],
                false,
              ),
              shadowColor: 'rgba(0, 0, 0, 0.1)',
              shadowBlur: 10,
            },
          },
          symbol: 'circle',
          symbolSize: 5,
          data: item.data,
        };
      })
    );
  }, [data]);
  useEffect(() => {
    console.log('%%%%%%', data);
    if (data.length != 0) {
      myChart.current.setOption({
        backgroundColor: '#0d235e',
        tooltip: {
          trigger: 'axis',
        },
        legend: {
          data: '',
          textStyle: {
            fontSize: 12,
            color: 'rgb(0,253,255,0.6)',
          },
          right: '4%',
        },
        grid: {
          top: '14%',
          left: '4%',
          right: '4%',
          bottom: '12%',
          containLabel: true,
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: data.lineX,
          axisLabel: {
            textStyle: {
              color: 'rgb(0,253,255,0.6)',
            },
            formatter: function (params) {
              return params.split(' ')[0];
            },
          },
        },
        yAxis: {
          name: data.unit,
          type: 'value',
          axisLabel: {
            formatter: '{value}',
            textStyle: {
              color: 'rgb(0,253,255,0.6)',
            },
          },
          splitLine: {
            lineStyle: {
              color: 'rgb(23,255,243,0.3)',
            },
          },
          axisLine: {
            lineStyle: {
              color: 'rgb(0,253,255,0.6)',
            },
          },
        },
        series: lineY,
      });
    }
  }, [data]);
  return (
    <div
      ref={myLcap}
      id="lacpEchart"
      style={{
        width: '1200px',
        height: '500px',
        backgroundColor: 'white',
      }}
    ></div>
  );
};

export default FirstLacp;

 

posted @ 2022-07-05 18:00  SimoonJia  阅读(237)  评论(0编辑  收藏  举报