echarts监控容器ResizeObserver

背景

我们在使用echarts绘图的时候往往需要我们监控浏览器或者图表容器的宽高来实现echarts图表的resize()功能。这里总结了几种方法来实现

实现方案

window的resize

最常见的就是监控浏览器窗口的大小

window.addEventListener('resize', this.chartResize)

其中

this.echartsObj = this.$echarts.init(document.getElementById('testId'))
...
chartResize () {
  this.echartsObj && this.echartsObj.resize()
},

这种方法自然是有用的,但是有些场景不适用。
如果我们有个可以收缩的侧边栏,当我们收缩侧边栏的时候其实浏览器窗口大小是没有变化的,但由于我们的页面是响应式的,所以内容区域容器大小是变化的,所以这个时候我们要监控的就是容器大小来实现echarts图表的resize()

ResizeObserver

Web API提供了一个方法ResizeObserver来实现

const resizeObserver = new ResizeObserver(() => this.chartResize())
resizeObserver.observe(document.getElementById('testId')

element-resize-detector

npm提供了一个库element-resize-detector,同样可以帮助我们实现这个功能

import elementResizeDetector from 'element-resize-detector'
...
let erd = elementResizeDetector()
erd.listenTo(document.getElementById('testId'), this.chartResize)

当resize遇到节流

我们在使用以上功能时,可能会结合节流,比如我们的侧边栏的收缩使用了CSS3transition过渡效果的时候,这时候可能展开一次,会执行多个this.chartResize(),这就需要我们使用节流来提供性能。
安装:

npm i lodash

element-resize-detector中使用节流很简单:

import elementResizeDetector from 'element-resize-detector'
...
let erd = elementResizeDetector()
erd.listenTo(document.getElementById('testId'), _.throttle(this.chartResize), 300)

但是,如果我们在ResizeObserver中这样使用就不起效果:

const resizeObserver = new ResizeObserver(() => {
	_.throttle(this.chartResize(), 300) // chartResize()不走
	_.throttle(this.chartResize(), 300)() // chartResize()可以执行了,但是throttle节流不起作用
})
resizeObserver.observe(document.getElementById('testId')

那么要如何实现节流呢?自己写一个节流总可以吧(参考之前的文章如何理解js中的函数节流和防抖):

canResize: true
...
const resizeObserver = new ResizeObserver(() => {
	if (!this.canResize) {
		return
	}
	this.canResize = false
	setTimeout(() => {
		this.chartResize() // 注意这里需要在这里执行,因为如果你有transition的话需要在transition之后再执行
		this.canResize = true
	}, 300)
})
resizeObserver.observe(document.getElementById('testId')

记得销毁

销毁可以选择在beforeDestroy生命钩子中进行,通常很容易忘记,所以可以选择在监听的地方随手销毁:

...
resizeObserver.observe(document.getElementById('testId')
this.$once('hook:beforeDestroy', () => {
	resizeObserver.disconnect()
})
在Vue中使用Echarts实现容器大小自适应有以下几种方法: 1. 使用`watch`监听容器大小变化,手动调用`resize`方法: ```javascript <template> <div ref="chart" style="height: 300px;"></div> </template> <script> import echarts from 'echarts' export default { data() { return { chart: null } }, mounted() { this.chart = echarts.init(this.$refs.chart) this.initChart() }, methods: { initChart() { // 初始化图表 }, resize() { this.chart.resize() } }, watch: { '$refs.chart': { immediate: true, handler() { window.addEventListener('resize', this.resize) } } }, beforeDestroy() { window.removeEventListener('resize', this.resize) } } </script> ``` 2. 使用`resize-detector`插件自动监听容器大小变化: ```javascript <template> <div ref="chart" style="height: 300px;"></div> </template> <script> import echarts from 'echarts' import resizeDetector from 'resize-detector' export default { data() { return { chart: null } }, mounted() { this.chart = echarts.init(this.$refs.chart) this.initChart() // 监听容器大小变化 resizeDetector.addResizeListener(this.$refs.chart, this.resize) }, methods: { initChart() { // 初始化图表 }, resize() { this.chart.resize() } }, beforeDestroy() { resizeDetector.removeResizeListener(this.$refs.chart, this.resize) } } </script> ``` 3. 使用`vue-echarts`组件库自动监听容器大小变化: ```javascript <template> <v-chart :options="options"></v-chart> </template> <script> import { VChart } from 'vue-echarts/components' import 'echarts/lib/chart/bar' // 引入图表类型 import 'echarts/lib/component/tooltip' // 引入图表组件 export default { components: { VChart }, data() { return { options: { // 图表配置 } } } } </script> ``` 以上几种方法均可以实现Echarts容器大小自适应,选择哪种方法取决于项目需求和个人喜好。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值