首页 > 其他分享 >封装Echarts组件

封装Echarts组件

时间:2024-08-01 15:17:33浏览次数:13  
标签:封装 cInstance echarts current 组件 import Echarts resize

构建配置文件,按需引入相关组件

// echarts.config.js
// * 需要哪些组件和配置,请在 import 时手动添加。
import * as echarts from 'echarts/core';
// 引入用到的图表
import { BarChart, PieChart } from 'echarts/charts';
// 引入提示框、数据集等组件
import {
  DataZoomComponent,
  GridComponent,
  LegendComponent,
  TitleComponent,
  TooltipComponent,
} from 'echarts/components';
// 引入标签自动布局、全局过渡动画等特性
import { LabelLayout } from 'echarts/features';
// 引入 Canvas 渲染器,必须
import { CanvasRenderer } from 'echarts/renderers';
// 引入词云
import 'echarts-wordcloud';

// 注册必须的组件
echarts.use([
  BarChart,
  PieChart,
  TitleComponent,
  TooltipComponent,
  DataZoomComponent,
  LegendComponent,
  GridComponent,
  CanvasRenderer,
  LabelLayout,
]);

export default echarts;

封装Echart组件

import React, { useEffect, useImperativeHandle, useRef } from 'react';
import echarts from './config';

interface Props {
  options: any;
  onClick?: (params: any) => void;
}

//用React.forwardRef暴露自身节点给父组件
const EChart: React.ForwardRefExoticComponent<
  Props & React.RefAttributes<any>
> = React.forwardRef(({ options, onClick }, ref) => {
  //通过ref节点获取dom节点
  //如果用id,则每个Echart组件都为同个id,导致多次调用实际调用同一个组件
  const cDom = useRef<any>(null);
  //echart实例
  const cInstance = useRef<any>(null);

  //echart图表重新构建尺寸
  const resize = () => {
    cInstance.current.resize({
      animation: { duration: 300 },
    });
  };

  // 获取实例方法
  const getInstance = () => cInstance.current;

  //初次渲染
  useEffect(() => {
    //获取Dom节点
    cInstance.current = echarts.getInstanceByDom(cDom.current);
    //判断是否已经存在节点,无节点则初始化图表
    if (!cInstance.current) cInstance.current = echarts.init(cDom.current);

    //设定图表配置项,渲染图表
    //利用定时器,解决初次渲染和resize()后尺寸不一致问题
    setTimeout(() => {
      if (options) cInstance.current?.setOption(options);
      resize();
    }, 1);

    //绑定点击事件
    cInstance.current?.on('click', (event: Event) => {
      if (event && onClick) onClick(event);
    });

    //卸载时接触事件绑定和销毁图表实例
    return () => {
      cInstance.current?.off('click');
      cInstance.current?.dispose();
    };
  }, []);

  //监听options,重新渲染图表
  useEffect(() => {
    cInstance.current?.setOption(options);
  }, [options]);

  //监听resize,重新渲染图表
  useEffect(() => {
    window.addEventListener('resize', resize);

    return () => {
      window.removeEventListener('resize', resize);
    };
  }, [options]);

  //暴露getInstance方法给父组件
  useImperativeHandle(ref, () => ({ getInstance }));

  return <div ref={cDom} style={{ width: '100%', height: '100%' }} />;
});

//利用memo构建组件,优化性能
export default React.memo(EChart);

 

标签:封装,cInstance,echarts,current,组件,import,Echarts,resize
From: https://www.cnblogs.com/karle/p/18336747

相关文章

  • Vue 3组件中监听浏览器窗口的大小变化
    constwindowWidth=ref(window.innerWidth);onMounted(()=>{ //在组件挂载后检查屏幕大小 //添加事件监听,以便在屏幕大小变化时更新条件 window.addEventListener('resize',checkScreenSize); //立即检查屏幕大小 console.log("在组件挂载后检查屏幕大小")})on......
  • 封装
    封装目录封装封装的概念什么是封装类?封装的特点:实现Java封装的步骤封装的概念将东西包在一起,然后以新的完整的形式呈现出来。将方法和字段包装到一个单元中,单元以类的形式实现信息隐藏,隐藏对象的实现细节,不让外部直接访问到。将数据和方法包装进类,加上具体实现的隐藏(访问修饰符......
  • 何为封装
    封装封装是计算机编程中的一个重要概念,它在不同领域有不同的含义和应用。以下是对封装概念的详细解析:在面向对象编程(OOP)中,封装是一种将数据和操作数据的代码(即方法)组合在一起,并对外隐藏内部实现细节的技术。具体来说,封装通过定义类(Class)来实现,其中数据和函数都是类的成员。类的......
  • 封装
    何为封装封装(Encapsulation)是面向对象编程(OOP)中的一个核心概念,它指的是将数据(属性)和操作这些数据的方法组合在一起,形成一个“对象”。封装的主要目的是隐藏对象的内部状态和实现细节,只暴露出一个可以被外界访问和使用的接口。特点:数据隐藏:封装隐藏了对象的内部数据,防止外部......
  • 封装
    封装1.何为封装当我们需要安全地访问对象时,例如限制给对象赋值的范围(避免数据类型的不同或者数据范围超出预计),我们就需要使用封装技术。封装就是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法(getter和setter)来实现对隐藏信息的操作和访问。2.访......
  • 4、vue3总组件/入口文件/路由设置
    1、安装element-plus依赖包npmielement-plus 2、项目主组件修改(App.vue)<scriptlang="ts"setup>import{ElConfigProvider}from'element-plus'import{ElDialog}from"element-plus"//将ElementPlus的语言设置为中文importzhCnfrom&......
  • 封装
    封装1.封装的定义在Java中,封装(Encapsulation)是面向对象编程(OOP)的四大基本特性之一(其他三个是继承、多态和抽象)。封装是一种将对象的属性(成员变量)和方法(成员函数)结合在一起,并隐藏对象的属性和实现细节,仅对外公开接口(即方法)来与对象进行交互的机制。封装的目的主要有两个:保护内......
  • 饮冰十年-人工智能-Vue3-67-组件间数据交互
    上一篇:饮冰三年-人工智能-Vue-66Vue组件化很久以前我对Vue2的组件间数据交互做过学习,兜兜转转再用Vue已经是Vue3版本。Vue3组件间数据交互1、准备工作环境准备使用Vite创建一个新的Vue3项目功能介绍该功能由APPVue+4个组件组成  ......
  • element-plus中el-container组件的重要用法详解
    el-container是ElementPlusUI框架中的一个布局容器组件,用于实现页面的布局结构。它主要用于管理和组织页面中的内容,提供了灵活的布局方式。下面详细解释一下el-container的重要用法和特性:1.基本用法el-container提供了三种基本布局方式:horizontal、vertical和vertica......
  • echarts 地图 geojson 街道级别获取
    echarts地图geojson街道级别获取最近开发遇到需求是要制作echarts地图,原本制作echarts地图也并不难,但是偏偏我要制作街道级别的地图,难就难在如何获取geojson的数据。获取渠道目前遇到的最多的获取geojson的方法是通过阿里的地理工具去获取,https://datav.aliyun.com/por......