当前位置:   article > 正文

【Vue】监听div宽高的变化(动态渲染echarts宽高案例)_vue监听宽度设置宽度等分

vue监听宽度设置宽度等分

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

<template>
  <div ref="resizeTarget" class="resize-target">
    <!-- Your content goes here -->
  </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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

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

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

<template>
  <div ref="resizeTarget" class="echart-box">
    <div ref="echart"></div>
  </div>
</template>
  • 1
  • 2
  • 3
  • 4
  • 5
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();
	  });
	},
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
<style scoped>
.echart-box {
  height: 100%;
  width: 100%;
  overflow: auto;
}
</style>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/223144
推荐阅读