【Vue】监听div宽高的变化(动态渲染echarts宽高案例)

在Vue.js中,要监听一个div元素的宽度和高度的变化,你可以使用ResizeObserverResizeObserver是一个现代的JavaScript API,它允许你监听元素的大小变化。以下是一个简单的Vue组件示例,演示如何使用ResizeObserver监听div宽高的变化:

<template>
  <div ref="resizeTarget" class="resize-target">
    
  div>
template>

<script>
export default {
  mounted() {
    // 获取要监听的 div 元素
    const resizeTarget = this.$refs.resizeTarget;

    // 创建 ResizeObserver 实例
    const resizeObserver = new ResizeObserver(entries => {
      // entries 是一个 ResizeObserverEntry 对象数组,包含目标元素的大小信息
      for (const entry of entries) {
        // 获取宽度和高度
        const { width, height } = entry.contentRect;
        console.log('Width:', width, 'Height:', height);

        // 在这里可以触发自定义的处理逻辑,例如将宽高信息传递给 Vue 组件的方法
        this.handleResize(width, height);
      }
    });

    // 开始监听目标元素的大小变化
    resizeObserver.observe(resizeTarget);

    // 在组件销毁时停止监听,防止内存泄漏
    this.$once('hook:beforeDestroy', () => {
      resizeObserver.disconnect();
    });
  },

  methods: {
    handleResize(width, height) {
      // 在这里可以执行你想要的操作,比如更新组件的状态
      // 例如:this.$emit('resize', { width, height });
    }
  }
};
script>

<style>
.resize-target {
  /* 设置一些样式,使 div 元素可见 */
  width: 100%;
  height: 100%;
  border: 1px solid #ccc;
  box-sizing: border-box;
  overflow: hidden;
}
style>

在这个例子中,我们使用mounted生命周期钩子来获取目标div元素的引用,并创建了一个ResizeObserver实例。在ResizeObserver的回调函数中,我们可以获取目标元素的新宽度和高度,并在handleResize方法中进行自定义处理。最后,确保在组件销毁时停止观察,以防止内存泄漏。

这在echarts中自适应宽高动态响应渲染echarts图表很有意义,如下:

<template>
  <div ref="resizeTarget" class="echart-box">
    <div ref="echart">div>
  div>
template>
mounted () {
  this.initEchart()
},
methods: {
	initEchart () {
	  this.myChart = this.$echarts.init(this.$refs.echart);
	
	  const resizeObserver = new ResizeObserver(entries => {
	    // entries 是一个 ResizeObserverEntry 对象数组,包含目标元素的大小信息
	    for (const entry of entries) {
	      const { width, height } = entry.contentRect;
	      // 根据外部盒子的宽度来设置echarts图的宽度
	      this.myChart.resize({ width, height });
	    }
	  });
	
	  // 开始监听最外层的 resizeTarget 元素的大小变化
	  const resizeTarget = this.$refs.resizeTarget;
	  resizeObserver.observe(resizeTarget);
	
	  // 在组件销毁时停止监听,防止内存泄漏
	  this.$once('hook:beforeDestroy', () => {
	    resizeObserver.disconnect();
	  });
	},
}
<style scoped>
.echart-box {
  height: 100%;
  width: 100%;
  overflow: auto;
}
style>

你可能感兴趣的:(Vue,vue.js,echarts,前端)