ResizeObserve 在 Echarts 的使用

2023-05-16

前言

前端图表经常要进行 resize 操作,一般我们会想到监听 window resize event, 但是这个事件只能监听 window 窗口大小的改变, 没有办法监听到某个div大小的改变

目前解决方案

ResizeObserver

下面是使用的例子

const resizeObserver = new ResizeObserver((enties, observer)=> {
   // 这里可以拿到观察的所有实体
});
const elem = document.querySelect('a');
// 观察 elem 这个元素
resizeObserver.observer(elem);

ResizeObserver 有兼容问题,但是我们可以用 resize-observer-polyfill

npm install resize-observer-polyfill --save
yarn add resize-observer-polyfill --save

下面看一个完整的例子 echart.vue

<template>
  <div class="chart-container" ref="chart"></div>
</template>

<script>
import Vue from 'vue';
import ResizeObserver from 'resize-observer-polyfill';
import throttle from 'lodash/throttle';

const echarts = require('echarts');
Vue.prototype.$echarts = echarts;

let resizeObserver = null;

export default {
  name: 'VEchart',
  props: {
    theme: String,
    options: {
      type: Object,
      default() {
        return null;
      },
      isLoading: {
        type: Boolean,
        default: false,
      },
    },
  },
  data() {
    return {
      instance: null,
    };
  },
  watch: {
    options(val) {
      if (val) {
        this.refresh(val);
      }
    },
    isLoading(val) {
      this.initChart();
      if (val) {
        this.instance.showLoading();
      } else {
        this.instance.hideLoading();
      }
    },
  },
  methods: {
    // init chart
    initChart() {
      this.instance = this.instance || this.$echarts.init(this.$refs.chart);
    },
    // 获取chart 实例
    getInstance() {
      this.initChart();
      return this.instance;
    },
    // 获取现有的 options
    getOption() {
      return this.getInstance.getOption();
    },
    // 刷新chart
    refresh(options, notMerge = false) {
      this.initChart();
      this.instance.setOption(options || this.options, notMerge);
    },
    // bind resize
    bindResize() {
      const deboundResize = throttle(() => {
        this.instance && this.instance.resize();
      }, 250);

      resizeObserver = new ResizeObserver((entries, observer) => {
        deboundResize();
      });

      resizeObserver.observe(this.$refs.chart);
    },
    // 解绑 resize
    unbindResize() {
      resizeObserver.unobserve(this.$refs.chart);
    },
  },
  mounted() {
    this.bindResize();
  },
  beforeDestroy() {
    // 销毁组件时,解绑 reszie
    this.unbindResize();
  },
};
</script>

<style scoped></style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ResizeObserve 在 Echarts 的使用 的相关文章

  • 手机模拟器安装证书抓包

    目录 1 抓包软件 2 抓取HTTPS包 3 不同抓包软件配置步骤 4 代理 1 抓包软件 由于是手机模拟器 xff0c 所以可以使用adb进入命令行 xff0c 方便一些 抓包软件手机上的有HTTPCanary xff0c 电脑上需要配置

随机推荐

  • JAVA BP插件开发(一):基础插件开发

    本文会包括BP插件开发流程及打包 xff0c API xff0c javaswing xff08 UI xff09 部分的内容 阅读完本文后 xff0c 读者将初步具有开发BP插件的能力 1 开始开发 我们使用IDEA作为开发工具 xff0
  • 【C/C++】解决“两个类的头文件相互引用/超前引用”问题的方法

    一 什么是超前引用 xff1f 所谓 超前引用 是指一个类型在定义之前就被用来定义变量和声明函数 一般情况下C C 43 43 要求所有的类型必须在使用前被定义 xff0c 但是会存在一些特殊情况导致这种要求无法满足 xff0c 例如 类A
  • Kali linux2020.3下载与安装详细教程

    Kali linux下载与安装 你点进来看了 xff0c 想必你一定知道kali linux 我就不做解释了 xff0c 话不多说直接开始教程 要是不了解kali的点击此链接kali inux详情 1 前往官网下载kali镜像文件 http
  • EnvironmentNotWritableError: The current user does not have write permissions to the target environm

    在Anaconda虚拟环境中安装失败 xff0c 出现以下情况 EnvironmentNotWritableError The current user does not have span class token function wri
  • java线程池中的核心参数

    线程池中的核心参数 int corePoolSize xff1a 核心线程数 xff0c 即使线程池中无任务执行 xff0c 也会创建该数量的线程 int maximumPoolSize xff1a 最大线程数 xff0c 当核心线程数不够
  • vue初始化项目结构,并引入ant-design

    前提 xff1a node已经安装好 npm install cnpm g 安装淘宝镜像 npm可能速度不快 xff0c 所以可以使用cnpm来替代 cnpm install vue 安装vue cnpm install global vu
  • Argument for @NotNull parameter ‘quickFixes‘ of com/intellij/ope

    项目启动不了 idea 报错 xff1a Argument for 64 NotNull parameter quickFixes of com intellij ope 未配置jdk
  • 在同类中方法互调事务失效

    同类中A方法未加 64 Transactional xff0c B方法加 64 Transactional A调用B B的事务注解并未生效 众所周知 xff0c 事务是通过Aop动态代理实现的 xff0c 当A方法不加 64 Transac
  • @PropertySource和@ImportResource

    person properties person name 61 admin person address 61 shanghai person email 61 123 64 qq com person user card 61 3213
  • jdk1.8中HashMap的扩容,从新增第一个元素开始

    置灰部分在当前场景下不考虑 1 新增第一个元素 新增第一个元素总结 xff1a 先进行数组容量初始化 xff0c 初始大小为16 xff0c 扩容界限为12 xff0c 再找出数组对应位置 xff0c 将新增的值放入 2 继续新增元素 xf
  • redis解决分布式定时任务问题

    场景分析 xff1a 多服务器针对于定时任务带来的问题 xff0c 保证任务只在一个服务器上在执行 解决方案1 xff1a 只对一个服务器上的应用开启定时任务 xff0c 通过配置文件参数来设置 xff0c 不推荐 解决方案2 xff1a
  • Java堆中的分区

    Java堆分区 1 新生代 xff1a 新生代中分为Eden xff0c ServicorTo xff0c ServicorFrom区 Eden俗称伊甸区 xff0c 顾名思义 xff0c 就是新对象首次存在的区域 之后 xff0c 对象会
  • 打好基础之try-catch-finally执行顺序

    try catch finally是用来捕获异常 xff0c 保证程序的执行 先看一小段代码 xff1a public class TryCatchDemo public static void main String args div 4
  • Flask

    文章目录 Flask简介学习资料基本概念部署环境配置安装 Python3在Linux中配置Python3的虚拟环境配置Git安装第三方包 开始部署部署方式一 xff1a 直接启动部署方式二 xff1a gunicorn部署方式三 xff1a
  • iOS本地数据搜索 - UISearchController的简单实用

    在页面数据很多的时候我们通常会被要求加一个本地的搜索功能 xff0c 苹果给我们提供了一个封装的很好的控件UISearchController xff0c 下边介绍一下他的简单使用 定义需要的全局变量并初始化 span class hljs
  • 矩阵遍历问题

    这里记录些常见的矩阵遍历问题 xff0c 矩阵遍历没有什么简单的方法 xff0c 必须要遍历矩阵的每个元素 xff0c 因此在时间复杂度上没有什么简单的方法 xff0c 不过遍历时的方式可以不同 首先看下面例题 leetcode54 给定一
  • ubuntu系统添加环境变量3种方法

    说明 工作中 xff0c 我们自己编译安装的软件 xff0c 在系统中是无法在全局目录下自动识别的 xff0c 只能进入到相关目录下才能运行 xff0c 如在命令行下运行编译安装的php程序 xff0c 就得 usr local LAMP
  • Codeforces 897C(递归)

    点击打开链接 扎心题 xff0c 当时想法完全正确 xff0c 姿势不对 xff08 思维不够细腻 xff09 没过 题意 xff1a 给出四个字符串x y f0 z xff0c 并且给出递推公式 xff1a fi 61 x 43 fi 1
  • 天气预报API汇总

    目录 文章目录 一 天气预报平台 1 中国气象平台 2 心知天气 3 实况天气 4 YY天气 5 聚合天气 6 和风天气 7 彩云天气 8 咕咕天气 9 彩云天气 总结 一 天气预报平台 1 中国气象平台 优点 xff1a 中国气象局对外提
  • ResizeObserve 在 Echarts 的使用

    前言 前端图表经常要进行 resize 操作 xff0c 一般我们会想到监听 window resize event xff0c 但是这个事件只能监听 window 窗口大小的改变 xff0c 没有办法监听到某个div大小的改变 目前解决方