首页 > 其他分享 >react hooks echart自适应解决方案

react hooks echart自适应解决方案

时间:2022-11-15 11:01:18浏览次数:47  
标签:current const echart hooks react import return echarts chartRef

//index.tsx

import React, { useEffect, useRef, useState } from "react";
import * as echarts from "echarts";
import useEchartResizer from "./useEchartResizer";
export interface BaseChartProps {
    options: echarts.EChartsOption;
}

const Echart: React.FC<BaseChartProps> = ({ options }) => {
    const chartRef = useRef<HTMLDivElement>(null);
    useEchartResizer(chartRef);
    let myChart: any = null;
    /**
     * @description: resize
     * @return {*}
     */
    const handleResize = () => {
        myChart?.resize();
    };
    /**
     * @description: 初始化
     * @return {*}
     */
    const initChart = () => {
        window.removeEventListener("resize", handleResize);
        myChart?.dispose();
        const renderedInstance = echarts.getInstanceByDom(chartRef?.current);
        if (renderedInstance) {
            myChart = renderedInstance;
        } else {
            myChart = echarts?.init(chartRef?.current as HTMLElement);
        }
        myChart?.setOption(options, true);
        window.addEventListener("resize", handleResize);
    };

    useEffect(() => {
        initChart();
        return () => {};
    }, [options]);

    return <div ref={chartRef} style={{ height: "100%", width: "100%" }} />;
};
export default Echart;

  

//useEchartResizer.ts

import useComponentSize from "./useComponentSize";
import * as echarts from "echarts";
import React, { useEffect } from "react";

const useEchartResizer = (chartRef: React.MutableRefObject<HTMLDivElement>) => {
    const size = useComponentSize(chartRef);

    useEffect(() => {
        const chart =
            chartRef.current && echarts.getInstanceByDom(chartRef.current);
        if (chart) {
            chart.resize();
        }
    }, [chartRef, size]);
};
export default useEchartResizer;

 // useComponentSize.ts

import React, { useState, useLayoutEffect } from "react";

function getSize(el) {
    if (!el) {
        return {};
    }
    return {
        width: el.offsetWidth,
        height: el.offsetHeight,
    };
    // 之前求高度都是用的getComputedClientRect()这个方法
}

export default function useComponentSize(ref) {
    let [size, setSize] = useState(getSize(ref.current));

    function handleResize() {
        if (ref && ref.current) {
            setSize(getSize(ref.current));
        }
    }
    useLayoutEffect(() => {
        handleResize();
        // 第一次初始化就执行一遍
        let resizeObserver = new ResizeObserver(() => handleResize());
        // 定义一个检测变动的状态机
        resizeObserver.observe(ref.current);
        // 把这个检测机制绑定到当前元素
        return () => {
            resizeObserver.disconnect(ref.current);
            resizeObserver = null;
        };
    }, []);

    return size;
}
 

标签:current,const,echart,hooks,react,import,return,echarts,chartRef
From: https://www.cnblogs.com/fmixue/p/16891667.html

相关文章

  • TypeScript 使用 echart 小结
    可使用封装好的echarts-for-weixin下载说明引入组件说明导入组件{"usingComponents":{"ec-canvas":"../../ec-canvas/ec-canvas"}}ts/js引入echa......
  • 面试官:React怎么做性能优化
    前言最近一直在学习关于React方面的知识,并有幸正好得到一个机会将其用在了实际的项目中。所以我打算以博客的形式,将我在学习和开发(React)过程中遇到的问题记录下来。这两......
  • 我的react面试题笔记整理(附答案)
    shouldComponentUpdate有什么用?为什么它很重要?组件状态数据或者属性数据发生更新的时候,组件会进入存在期,视图会渲染更新。在生命周期方法shouldComponentUpdate中,允许选......
  • 面试官让你说说react状态管理?
    开发者普遍认为状态是组件的一部分,但是同时却又在剥离状态上不停的造轮子,这不是很矛盾么?对于一个最简单的文本组件而言functionText(){const[text,setText]=......
  • 我的react面试题整理2(附答案)
    如何在React中使用innerHTML增加dangerouslySetInnerHTML属性,并且传入对象的属性名叫_htmlfunctionComponent(props){return<divdangerouslySetInnerHTML={{_htm......
  • React组件基础四
    一.组件生命周期概述意义:组件的生命周期有助于理解组件的运行方式、完成更复杂的组件功能、分析组件错误原因等组件的生命周期:组件从被创建到挂载到页面中运行,再到组......
  • 66.有没有碰到过数组响应丢失(问的是ref和reactive的用法,什么情况下用)
    由于vue3使用proxy,对于对象和数组都不能直接整个赋值。  直接赋值丢失了响应性只有push或者根据索引遍历赋值才可以保留reactive数组的响应性 ;可以使用toRefs解决......
  • Reactor模式
    Reactor模式基本设计思想,简单来讲就是I/O复用结合线程池 Reactor模式,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。服务端程序处理传......
  • 59.ref和reactive的区别
    首先,ref和reactive定义响应式数据的,&vue3中的数据分为2类,一类没有响应式数据第二类是响应式数据;如果没有使用ref或者reactive定义数据,那么默认是第一类没有响应......
  • 「React」PropTypes提供的验证器
    前言通常,我们在项目中使用自定义组件时,需要对组件的props进行类型检测。而React提供了专门的库,可以校验组件的props类型,也可以做一些特定的限制。下面行详细介绍。以下内容......