您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)使用Echart怎么實(shí)現(xiàn)折線圖手柄觸發(fā)事件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1 環(huán)境:
vue-cli(2.0)+ vue-echarts
2 場(chǎng)景:
需求,需要拖動(dòng)手柄,等松開(kāi)手柄時(shí),要根據(jù)手柄所在的位置(獲取手柄在的x軸信息),重新發(fā)送請(qǐng)求,來(lái)渲染數(shù)據(jù)。
3圖:
4遇到的bug:
4.1 手柄上的label信息,有時(shí)會(huì)刷新不出來(lái)。即上圖中的2016-10-07消失。
4.2 echarts的點(diǎn)擊事件對(duì)折線圖并不友好,必須點(diǎn)在折線圖的點(diǎn)坐標(biāo)上才會(huì)觸發(fā)事件。so,要實(shí)現(xiàn)點(diǎn)擊圖中任意位置來(lái)即可實(shí)現(xiàn)觸發(fā)自己的事件。
4.3 echarts提供了可以拖動(dòng)的手柄,但是并沒(méi)有松開(kāi)手柄后觸發(fā)的事,這個(gè)沒(méi)有滿足我們產(chǎn)品的需求。當(dāng)然有可能是我沒(méi)有找到,若有請(qǐng)告知,謝謝。
5解決以上的bug:
頁(yè)面的展示如下:
<template> <div> <div id='line' @touchend='touchs' @mouseup='touchs'> <v-chart auto-resize class='zhexian' :options='lineOption' :initOptions='initOptions' ref='line' /> </div> </div> </template> <script> //初始化折線的數(shù)據(jù) import lineoption from '@/assets/js/handleline.js' export default{ data(){ return{ lineOption:lineoption, initOptions:{ renderer: 'svg' || 'canvas' }, date:'',//發(fā)送Ajax時(shí)所需的參數(shù) reFlag:'',//避免重復(fù)發(fā)送請(qǐng)求時(shí)的中間變量 } }, } </script>
拖動(dòng)手柄時(shí),會(huì)實(shí)時(shí)觸發(fā)formater,
解決第一個(gè)bug ,label有時(shí)會(huì)消失,因?yàn)槲乙院蟮拇a會(huì)用到formatter,第一次要用formater ,我是這樣寫(xiě)的,
this.lineOption.xAxis.axisPoint.label.formatter=function(param){ //param是X軸的信息 let value = _this.$echart.format.formatTime('yyyy-MM-dd', params.value); _this.date =value; console.log('實(shí)時(shí)獲取的X軸的事件'+_this.date) return value; },
,axisPoint對(duì)象的其他數(shù)據(jù)寫(xiě)在了handleline.js中,解決方案就是把a(bǔ)xisPoint的其他數(shù)據(jù)也重新setOption了,
mounted(){ // let _this = this; this.lineOption.xAxis.axisPointer={ value: '2016-10-7', snap: true, lineStyle: { color: '#004E52', opacity: 0.5, width: 2 }, label: { show: true, formatter: function (params) { let value = _this.$echart.format.formatTime('yyyy-MM-dd', params.value); _this.date =value; console.log('實(shí)時(shí)獲取的X軸的事件'+_this.date) return value; }, backgroundColor: '#004E52' }, handle: { show: true, color: '#004E52' } } },
解決第三個(gè)bug,結(jié)合了formatter 和 vue的touchend事件,單獨(dú)的formatter并沒(méi)有用,因?yàn)槭种鸽x開(kāi)時(shí),formatter的param數(shù)據(jù)會(huì)獲取多個(gè),也有可能會(huì)是多個(gè)重復(fù)的數(shù)據(jù)。效果并不好。so結(jié)合了touchend事件,手指離開(kāi)時(shí)獲取最終的date.
methods:{ touchs(){ //手指離開(kāi)手柄事件,因?yàn)槭直瑒?dòng)時(shí),就會(huì)觸發(fā)formatter,這時(shí),this.date 就會(huì)發(fā)生改變。當(dāng)你手指觸發(fā)其他的地方時(shí) //并不會(huì)改變this.date的值,so。為了避免手指離開(kāi)時(shí)重復(fù)發(fā)送請(qǐng)求,需要一個(gè)中間變量。只有兩個(gè)值不相等才會(huì)去做自己想做的事。 if (this.reFlag == this.date) { return } this.reFlag = this.date //重新發(fā)送請(qǐng)求,渲染數(shù)據(jù),這時(shí)已經(jīng)或得了X軸的時(shí)間。 console.log(this.date) // this.getPieData() }, }
解決第二個(gè)bug ,這是從網(wǎng)上找到的。實(shí)現(xiàn)點(diǎn)擊折線圖的任意地方獲取x軸的信息,發(fā)送請(qǐng)求。同時(shí),要讓lineOption中的tooltip:{triggerOn:'click'}
,否則點(diǎn)擊無(wú)效。
sendTime() { //寫(xiě)在mounted中調(diào)用 var chart = this.$echart.init(this.$refs.line.$el) chart.getZr().on('click', params => { var pointInPixel = [params.offsetX, params.offsetY] if (chart.containPixel('grid', pointInPixel)) { let xIndex = chart.convertFromPixel({ seriesIndex: 0 }, [ params.offsetX, params.offsetY ])[0]; let a =this.$echart.format.formatTime('yyyy-MM-dd', xIndex); /*事件處理代碼書(shū)寫(xiě)位置*/ // xIndex是個(gè)重要信息,用的時(shí)候最好打印看下具體的內(nèi)容再用 console.log(xIndex); // this.date = this.linedata[xIndex + 1][0]; // 手指點(diǎn)擊后,讓這兩個(gè)值相等,避免觸發(fā)touchend事件, this.reFlag = this.date=a; //重新發(fā)送請(qǐng)求 //this.getPieData() } }) },
看完上述內(nèi)容,你們對(duì)使用Echart怎么實(shí)現(xiàn)折線圖手柄觸發(fā)事件有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。