vue中echarts点击事件点击一次多次触发问题
前言
vue中使用echarts图,并且使用他的点击事件就会发现一个问题,第一次我echarts图的点击事件是生效的而且正常的,但是一旦重新渲染这个echarts图以后,就会出现再重新渲染一次,(相当于2次渲染echarts图),点击事件会被调用2次,第二次重新渲染,点击事件就会被调用3次,这个问题。
问题展示
(我这里是调用后台,我的日历刷新一次时间,就会重新渲染一次我的echarts图)
正常点击事件
(前,点击一次调用一次后台)
异常
(当我选了日历以后,重新渲染echarts图,再点击的时候,重新渲染几次,点击多几次)
解决办法
再渲染echarts图前加
this.myChart.off('click') // 这里很重要!!解决重复点击
this.myChart = echarts.init(this.$refs.chart); this.myChart.off('click') // 这里很重要!!解决重复点击 this.myChart.setOption({
封装组件源码
<template> <div class="echarts" ref="chart"></div> </template> <script> const echarts = require('echarts'); export default { props:{ data:{//echarts数据 type:Array, default:()=>[] }, Params:Object, }, data () { return { name:'柱图', myChart:null, }; }, components: {}, mounted() { this.initCharts(this.data); }, watch:{ data(val){ this.initCharts(val); } }, methods: { initCharts(data){ if(data.length==0){ return; } let unit = this.Params.unit;//单位 /** * 处理数据 */ // let dataAxis = ['10.24', '10.25', '10.26', '10.27', '10.28', '10.29', '今日']; // let Ydata = [220, 182, 191, 234, 290, 330, 310]; let dataAxis = []; let Ydata = []; data.forEach(item => { dataAxis.push(item.date);//日期 Ydata.push(item.value);//积分 }); let maxLengthVal = Ydata.length-1; /** * 获取数据内部最大值,+100来设置背景图高度 */ var max = Ydata.reduce( (a,b)=> b > a ? b : a );//获取最大值 var dataShadow = []; var yMax; if(max<100){ yMax = max+30; }else if(max>100 && max<500){ yMax = max+100; }else{ yMax = max+200; } for (var i = 0; i < Ydata.length; i++) { dataShadow.push(yMax); } this.myChart = echarts.init(this.$refs.chart); this.myChart.off('click') // 这里很重要!!解决重复点击 this.myChart.setOption({ xAxis: { data: dataAxis, axisLabel: { inside: true, textStyle: { color: '#000', fontSize:'100%' } }, axisTick: { show: false }, axisLine: { show: false }, position: "top", z:10 }, yAxis: { axisLine: { show: false }, axisTick: { show: false }, axisLabel: { show: false }, splitLine:{//网格线 show:false } }, dataZoom: [ { type: 'inside' } ], series: [ { // For shadow type: 'bar', itemStyle: { normal: {color: '#F6FBFE'}, emphasis: {color: 'rgba(255,188,117,.3)'} }, barGap:'-100%', barCategoryGap:'40%', data: dataShadow, animation: false }, { type: 'bar', label: { normal: { show: true, position: 'top', color:'#000', fontSize:'100%', formatter: function (params) { return params.value+unit; }, }, }, itemStyle: { normal: { // color: new echarts.graphic.LinearGradient( // 0, 0, 0, 1, // [ // {offset: 0, color: '#FF3405'}, // {offset: 0.5, color: '#FF6A47'}, // {offset: 1, color: '#FF9076'} // ] // ) color: function(params) { if(params.dataIndex == maxLengthVal){ return new echarts.graphic.LinearGradient( 0, 0, 0, 1, [ {offset: 0, color: '#FF3405'}, {offset: 0.5, color: '#FF6A47'}, {offset: 1, color: '#FF9076'} ] ); }; return new echarts.graphic.LinearGradient( 0, 0, 0, 1, [ {offset: 0, color: '#FFBD77'}, {offset: 0.5, color: '#FF9F38'}, {offset: 1, color: '#FF8505'} ] ); } }, emphasis: { color: new echarts.graphic.LinearGradient( 0, 0, 0, 1, [ {offset: 0, color: '#FF3405'}, {offset: 0.5, color: '#FF6A47'}, {offset: 1, color: '#FF9076'} ] ) } }, data: Ydata } ] }) this.myChart.on('click',(params)=>{ let name = ''; data.forEach(item=>{ if(item.date == params.name){ name = item.dateYear } }) this.$emit('echartsClick',name); }); }, }, } </script> <style lang='less' scoped> .echarts{ width: 100%; height:100%; } </style>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Vue+Openlayer批量设置闪烁点的实现代码(基于postrender机制)
本篇文章给大家介绍基于postrender机制使用Vue+Openlayer批量设置闪烁点的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2021-09-09Vue中iframe 结合 window.postMessage 实现跨域通信
window.postMessage() 方法可以安全地实现跨源通信,在一个项目的页面中嵌入另一个项目的页面,需要实现父子,子父页面的通信,对Vue中iframe 结合 window.postMessage 实现跨域通信相关知识感兴趣的朋友跟随小编一起看看吧2022-12-12vue路由事件beforeRouteLeave及组件内定时器的清除方法
今天小编就为大家分享一篇vue路由事件beforeRouteLeave及组件内定时器的清除方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-09-09vue清除浏览器全部cookie的问题及解决方法(绝对有效!)
最近项目要实现关闭浏览器清除用户缓存的功能,下面这篇文章主要给大家介绍了关于vue清除浏览器全部cookie的问题及解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2023-06-06
最新评论