首页 前端知识 在 vue 中使用 window.onresize及div的resize事件

在 vue 中使用 window.onresize及div的resize事件

2024-04-01 10:04:50 前端知识 前端哥 293 634 我要收藏

项目场景:

  1. 如何在 vue 中使用 window.onresize
  2. 如何避免 覆盖其它的 window.onresize
  3. 手动触发 window.onresize
  4. echarts 监听图表容器的大小并改变图表大小
  5. 使用vue-resize 监听图表容器的大小并改变图表大小

div resize 解决方案:

绝大多数据场景下我们只是希望echarts感知外层包裹的resize事件而改变大小
但div并没有resize事件,我们需要借助插件完成该功能

插件 vue-resize

//安装
npm install --save vue-resize

// 引入 vue-resize
import ‘vue-resize/dist/vue-resize.css’
import VueResize from ‘vue-resize’
Vue.use(VueResize)

/**
* echarts + vue-resize
*/
<template>
<!-- 父容器的position为static以外的值,如relative-->
<div class="w" style="position: relative;">
<!-- vue-resize 放在容器根下与echarts 绘制区同级-->
<resize-observer @notify="handleResize" />
<!-- echarts 绘制区 -->
<div ref="canvas" class="canvas" />
</div>
</template>
<script>
export default {
data() {
return {
loading: false,
myChart: {},
srcData: [
['product', '2015', '2016', '2017'],
['Matcha Latte', 43.3, 85.8, 93.7],
['Milk Tea', 83.1, 73.4, 55.1],
['Cheese Cocoa', 86.4, 65.2, 82.5],
['Walnut Brownie', 72.4, 53.9, 39.1]
]
}
},
mounted() {
this.myChart = this.$echarts.init(this.$refs.canvas)
this.init()
this.draw(this.srcData)
},
methods: {
// echarts 初始化样式
init() {
var option = {
dataset: {
source: []
},
xAxis: { type: 'category' },
yAxis: {},
series: [{ type: 'bar' }, { type: 'bar' }, { type: 'bar' }]
}
this.myChart.setOption(option)
},
// 绘制图表数据
draw(val) {
this.myChart.setOption({
dataset: {
source: val
}
})
},
handleResize() {
this.myChart && this.myChart.resize()
}
}
}
</script>
<style lang="less" scoped>
</style>
复制

window.onresize解决方案:

<script>
/* echarts 监听图表容器的大小并改变图表大小 */
export default {
mounted() {
this.myChart = this.$echarts.init(this.$refs.canvas)
// 监听 window.onresize
window.addEventListener('resize', this.resize, false)
},
// 注销 window.onresize
beforeDestroy() {
window.removeEventListener('resize', this.resize)
},
methods: {
resize() {
this.myChart.resize()
},
// 手动触发window.onresize
dispatchResize(){
try {
var ev = document.createEvent('Event');
ev.initEvent('resize', true, true);
window.dispatchEvent(ev)
} catch (e) {}
}
}
}
</script>
复制

错误分析

常见的错误代码 1

<script>
export default {
mounted() {
// 窗口自适应,关键代码
window.onresize = () => {
this.$refs.chart1.resize()
}
},
// 注销window.onresize事件
destroyed() {
window.onresize = null
}
}
</script>
复制
  1. 会覆盖其它的 window.onresize,导致页面中只有一个window.onresize生效.
  2. 不要在destroyed中注销,容易引起不必要的麻烦.请使用beforeDestroy
    <script>
    export default {
    beforeDestroy() {
    // 输出结果: {canvas: div.canvas}
    console.log('beforeDestroy', this.$refs)
    },
    destroyed() {
    // 输出结果: {canvas: div.undefined}
    console.log('destroyed', this.$refs)
    }
    }
    </script>
    复制

常见的错误代码 2

<script>
window.addEventListener('resize', this.resize(), false)
</script>
复制

抄作业都没抄明白的代码
window.addEventListener 第二个参数接收了this.resize()执行结果,而不是一个function


常见的错误代码 3

<script>
window.addEventListener('resize', () => {
this.resize()
})
</script>
复制

匿名函数你怎么销毁?

转载请注明出处或者链接地址:https://www.qianduange.cn//article/4389.html
标签
评论
还可以输入200
共0条数据,当前/页
发布的文章

前端vue实现甘特图

2024-04-19 21:04:35

HTML入门(详细)

2024-04-19 21:04:24

HTML 入门手册(一)

2024-04-19 21:04:58

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!