当前位置:   article > 正文

vue中如何实现对dom元素大小改变的监听_vue监听dom尺寸变化

vue监听dom尺寸变化

1、背景

在窗口大小没改变的时候,有些dom元素的大小发生了变化,导致页面某些元素没有重新渲染,出现不适应的情况。如下图所示:在这里插入图片描述

 

2、处理方案
(1)方案一、vue项目中,我们可以使用element-resize-detector插件来实现,简单粗暴。实现方案如下:

1、安装相关插件,npm install element-resize-detector
2、在main.js中引入依赖,并挂在vue原型链上:
import ElementResizeDetectorMaker from "element-resize-detector"
Vue.prototype.$erd = ElementResizeDetectorMaker()
3、在界面中使用_this.$erd.listenTo()去做监听,示例代码如下:

  1. mounted() {
  2. let _this = this
  3. _this.$erd.listenTo(_this.$refs.container, element => {
  4. _this.$nextTick(() => {
  5. _this.$refs.messageInfoTableRef.resizeTo(element.clientWidth)
  6. _this.$refs.transcodingTableRef.resizeTo(element.clientWidth)
  7. })
  8. })
  9. },
  10. beforeDestroy() {
  11. let _this = this
  12. // 离开页面删除检测器和所有侦听器
  13. _this.$erd.uninstall(_this.$refs.container) // 这里用ref是因为vue离开页面后获取不到dom
  14. }

2)方案二、最开始我也是用方案一去实现的,但是因为项目中用到了handsonTable,使用方案一,导致表格的复选框无法勾选,排查发现可能是resizeTo()影响到了,所以才有了方案二,通过ResizeObserver来实现的监听方案。

ResizeObserver接口参考,实现代码如下:

  1. //import ResizeObserver from "resize-observer-polyfill";
  2. data() {
  3. return {
  4. resizeObserver: null,
  5. }
  6. },
  7. mounted() {
  8. let _this = this
  9. _this.resizeObserver = new ResizeObserver(entries => {
  10. _this.$nextTick(() => {
  11. _this.$refs.messageInfoTableRef.resizeTo(entries[0].target.clientWidth)
  12. _this.$refs.transcodingTableRef.resizeTo(entries[0].target.clientWidth)
  13. })
  14. });
  15. _this.resizeObserver.observe(document.getElementById("container"));
  16. },
  17. beforeDestroy() {
  18. let _this = this
  19. // 离开页面删除检测器和所有侦听器
  20. _this.resizeObserver.disconnect();
  21. }

最后实现效果如下图:
在这里插入图片描述

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/223166
推荐阅读
相关标签
  

闽ICP备14008679号