过程
由于需要在vue项目中使用echarts图表,基于canvas的echarts不能随窗口大小改变而改变。这时就需要监听窗口大小,并实时执行echarts的resize方法。
1. 向 Window 对象添加事件句柄
1 2 3 4 5 6 7 8 9 10 11
| mounted() { window.addEventListener('resize', this.resizeHandler) }, destroyed() { window.removeEventListener('resize', this.resizeHandler) }, methods:{ resizeHandler(){ } }
|
2. 在 window 的onresize中挂载方法
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
| watch: { screenWidth(val) { if (!this.timer) { this.screenWidth = val this.timer = true const that = this setTimeout(function() { console.log(that.screenWidth) that.timer = false }, 400) } } }, mounted () { const that = this window.onresize = () => { return (() => { window.screenWidth = document.body.clientWidth that.screenWidth = window.screenWidth })() } }
|
这种方法略显臃肿,而且data里还需要额外维护两个变量
3. 使用 resize-observer-polyfill 监听dom大小变化
这个方法相比于前两个只能监听window大小变化,它可以监听元素大小变化。可以对页面中一些可变元素进行响应,使用方法来自element-ui源码,感谢这位老哥的发现:使用element-ui封装好的resize事件方法
使用代码转自这位老哥:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event';
export default { mounted(){ addResizeListener(this.$el, this.resizeListener); }, methods:{ resizeListener(){ } }, destroyed() { if (this.resizeListener) removeResizeListener(this.$el, this.resizeListener); } }
|
整理
在整个过程中,跟着源码看到了不少东西,不过没有系统性的去学习,只是大概了解了一下,这里做个整理
- Polyfills or Ponyfills?
- echarts官网 (在2021.1.28明天,echarts出新版本了。我看了一下,除了canvas,也有用svg渲染的图)
- resize-observer-polyfill