ReactHooks+TS项目echarts3D立体环形图

echarts3D立体环形图

效果图如下
在这里插入图片描述

components 中的echarts/index.tsx

import * as React from 'react';

import classnames from 'classnames';

import * as echarts from 'echarts';

import 'echarts-gl';

import _ from 'lodash';

import { useSize, useUnmount } from 'ahooks';

import Util from '@/common/util';

import style from './style.less';

import { getParametricEquation } from './util';

export type EChartsProps = {
  option: echarts.EChartsOption;
  opts?: {
    devicePixelRatio?: number;
    renderer?: 'canvas' | 'svg';
    useDirtyRect?: boolean;
    width?: number;
    height?: number;
    locale?: any;
  };
  theme?: string | object;
  style?: React.CSSProperties;
  className?: string;
  getContainer?: () => HTMLElement | React.RefObject<HTMLElement>;
  onClick?: (params: any) => void;
  allowListen?: boolean;
  loop?: boolean;
  onmouseover?: () => () => void;
  onmouseout?: () => () => void;
};

type EChartOptionProperty = echarts.EChartsOption[keyof echarts.EChartsOption];

const ECharts = React.forwardRef<echarts.ECharts | undefined, EChartsProps>(
  (props, ref) => {
    const {
      style: $style,
      className,
      option,
      theme,
      opts,
      getContainer,
      onClick,
      allowListen = false,
      loop = false,
      // onmouseover,
      // onmouseout,
    } = props;

    const chartDOMRef = React.useRef<HTMLDivElement>(null);
    const cachedOptionRef = React.useRef<echarts.EChartsOption>();
    const chartInstance = React.useRef<echarts.ECharts>();
    const tooltipRef = React.useRef<NodeJS.Timeout>();

    const { width = 0, height = 0 } = useSize(
      _.isFunction(getContainer)
        ? getContainer()
        : () => chartDOMRef.current?.parentElement || null,
    ) || { width: 0, height: 0 };

    const mergeDefaultProperty = React.useCallback(
      (
        property: EChartOptionProperty,
        defaultProperty: EChartOptionProperty,
      ) => {
        if (_.isArray(property)) {
          return property.map((item) => {
            if (_.isObject(item)) {
              return _.merge({}, defaultProperty, item);
            }
            return item;
          });
        }
        if (!Util.isEmpty(property) && _.isObject(property)) {
          return _.merge({}, defaultProperty, property);
        }
        return property;
      },
      [],
    );

    const mergeDefaultOption = React.useCallback(
      ($option: echarts.EChartsOption) => {
        const defaultOption: echarts.EChartsOption = {
          animation: true,
          animationDuration: 3000,
          grid: {
            left: 0,
            right: 0,
            top: 0,
            bottom: 0,
            containLabel: true,
          },
        };
        const defaultProperty: echarts.EChartsOption = {
          legend: {
            itemWidth: 16,
            itemHeight: 16,
          },
          series: {
            barWidth: 14,
          },
        };
        const mergeOption: echarts.EChartsOption = _.merge(
          {},
          defaultOption,
          $option,
        );
        Object.keys($option).forEach((key) => {
          if (key in defaultProperty) {
            mergeOption[key] = mergeDefaultProperty(
              $option[key],
              defaultProperty[key],
            );
          } else {
            mergeOption[key] = $option[key];
          }
        });
        return mergeOption;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值