CN-418 曲线图legend交互逻辑更改

This commit is contained in:
hyx
2022-03-29 15:07:24 +08:00
parent b9cdb81bc6
commit ace8dc51b7
2 changed files with 311 additions and 11 deletions

View File

@@ -132,7 +132,7 @@ export default {
}
if (this.isEchartsLine) {
serie.data = serie.data.slice(1, serie.data.length - 2)
if (this.chartData.length === 1) {
if (this.chartData.length === 1) {//只有一条曲线
serie.markLine = {
silent: true,
symbol: 'none',
@@ -174,6 +174,8 @@ export default {
},
],
}
} else if(this.chartData.length > 1){//有多条曲线
this.handleLegendClick()//自定义legend的点击事件
}
}
return serie
@@ -207,6 +209,138 @@ export default {
this.loadEchart()
},
//点击前高亮legend个数
getSelectedNum(params){
let selectedNum = 0
let legendItem = params.selected
for(let name in legendItem){
if(name === params.name){
if(!legendItem[name]){
selectedNum = selectedNum + 1
}
}else {
if(legendItem[name]){
selectedNum = selectedNum + 1
}
}
}
return selectedNum
},
//点击后高亮legend个数
getAfterSelectedNum(params){
let selectedNum = 0
let legendItem = params.selected
for(let name in legendItem){
if(legendItem[name]){
selectedNum = selectedNum + 1
}
}
return selectedNum
},
//自定义legend的点击事件:此方法只处理多条曲线的情况单条曲线正常切换legend和曲线
handleLegendClick(){
const self = this
// legend点击事件
this.myChart.off('legendselectchanged')
this.myChart.on('legendselectchanged', function (params) {
let legendNum = Object.keys(params.selected).length
let selectedNum = self.getSelectedNum(params)
let legendItem = params.selected
if(selectedNum === legendNum){//点击前:全部曲线高亮
for(let name in legendItem){
if (name === params.name) {
legendItem[name] = true
}else {
legendItem[name] = false
}
}
}else if(selectedNum === 1 && !params.selected[params.name]){//点击前:多条曲线,且只有一条曲线高亮时
for(let name in legendItem){
legendItem[name] = true
}
}
self.myChart.setOption({
legend: {
selected: legendItem
}
})
if(self.getAfterSelectedNum(params) === 1){//点击后只有一条曲线高亮
const chartParams = self.chartInfo.params
//多条曲线且只有一条曲线高亮时显示P50 P90 分位值,不止一个时隐藏标线
let selectedName = ''
for(let name in legendItem){
if(legendItem[name]){
selectedName = name
}
}
let markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter(params) {
const arr = unitConvert(
params.value,
chartParams.unitType,
).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
},
},
data: [
{
name: 'P50',
yAxis: self.chartData[0].aggregation.p50
? self.chartData[0].aggregation.p50
: 50,
},
{
name: 'P90',
yAxis: self.chartData[0].aggregation.p90
? self.chartData[0].aggregation.p90
: 90,
},
],
}
let serieArray = []
self.chartOption.series.forEach((item,i) =>{
if(item.name === selectedName){
item.markLine = markLine
}
serieArray.push(item)
})
self.myChart.setOption({
series:serieArray
})
} else {//不止一条线高亮时隐藏标线
let serieArray = []
self.chartOption.series.forEach((item,i) =>{
item.markLine = []
serieArray.push(item)
})
self.myChart.setOption({
series:serieArray
})
}
})
}
},
}
</script>

View File

@@ -11,6 +11,7 @@ import {
getChartColor
} from '@/views/charts/charts/tools'
import chartEchartMixin from './chart-echart-mixin'
import unitConvert from '@/utils/unit-convert'
export default {
name: 'ChartEchartWithStatistics',
@@ -56,23 +57,188 @@ export default {
}
}
})
let markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter(params) {
const arr = unitConvert(
params.value,
chartParams.unitType,
).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
},
},
data: [
{
name: 'P50',
yAxis: this.chartData[0].aggregation.p50
? this.chartData[0].aggregation.p50
: 50,
},
{
name: 'P90',
yAxis: this.chartData[0].aggregation.p90
? this.chartData[0].aggregation.p90
: 90,
},
],
}
if(this.statisticsData.length === 1){
let serieTmp = this.chartOption.series[0]
this.chartOption.series[0] = {
...serieTmp,
markLine:markLine
}
}
this.loadEchart()
},
dispatchLegendSelectAction(name) {
this.myChart.dispatchAction({
type: 'legendSelect',
name: name
})
},
dispatchLegendUnSelectAction(name) {
this.myChart.dispatchAction({
type: 'legendUnSelect',
name: name
})
},
toggleStatisticsLegend (index) {
this.statisticsData[index].active = !this.statisticsData[index].active
this.statisticsData.forEach((d, i) => {
if (d.active) {
this.myChart.dispatchAction({
type: 'legendSelect',
name: d.legend
let legendNum = this.statisticsData.length
const chartParams = this.chartInfo.params
let markLine = {
silent: true,
symbol: 'none',
label: {
distance: [-50, 0],
formatter(params) {
const arr = unitConvert(
params.value,
chartParams.unitType,
).join(' ')
let desc = ''
switch (params.dataIndex) {
case 0: {
desc = 'P50'
break
}
case 1: {
desc = 'P90'
break
}
default:
break
}
return `${arr} (${desc})`
},
},
data: [
{
name: 'P50',
yAxis: this.chartData[0].aggregation.p50
? this.chartData[0].aggregation.p50
: 50,
},
{
name: 'P90',
yAxis: this.chartData[0].aggregation.p90
? this.chartData[0].aggregation.p90
: 90,
},
],
}
if(legendNum > 1){
let selectedNum = this.statisticsData.filter(item => {return item.active === true}).length //点击前高亮legend个数
if(selectedNum === legendNum){//全部曲线高亮时
this.statisticsData.forEach((item, indexTmp) => {
if(indexTmp === index){
item.active = true
this.dispatchLegendSelectAction(item.legend)
}else {
item.active = false
this.dispatchLegendUnSelectAction(item.legend)
}
})
} else if(selectedNum === 1 && this.statisticsData[index].active){//多条曲线,且只有一条曲线高亮, 且点击的曲线为高亮曲线时
this.statisticsData.forEach((item) => {
item.active = true
this.dispatchLegendSelectAction(item.legend)
})
} else {
this.myChart.dispatchAction({
type: 'legendUnSelect',
name: d.legend
this.statisticsData[index].active = !this.statisticsData[index].active
this.statisticsData.forEach((item, i) => {
if (item.active) {
this.dispatchLegendSelectAction(item.legend)
} else {
this.dispatchLegendUnSelectAction(item.legend)
}
})
}
})
let selectedAfterNum = this.statisticsData.filter((item,i) => {return item.active === true}).length //点击后高亮legend个数
if(selectedAfterNum === 1) {//点击后只有一条曲线高亮
const chartParams = this.chartInfo.params
//多条曲线且只有一条曲线高亮时显示P50 P90 分位值,不止一个时隐藏标线
let selectedName = this.statisticsData.filter((item,i) => {return item.active === true})[0].legend
let serieArray = []
this.chartOption.series.forEach((item,i) =>{
if(item.name === selectedName){
item.markLine = markLine
}
serieArray.push(item)
})
this.myChart.setOption({
series:serieArray
})
}else {//不止一条线高亮时隐藏标线
let serieArray = []
this.chartOption.series.forEach((item,i) =>{
item.markLine = []
serieArray.push(item)
})
this.myChart.setOption({
series:serieArray
})
}
}else {
this.statisticsData[index].active = !this.statisticsData[index].active
this.statisticsData.forEach((item, i) => {
if (item.active) {
this.dispatchLegendSelectAction(item.legend)
} else {
this.dispatchLegendUnSelectAction(item.legend)
}
})
let selectedAfterNum = this.statisticsData.filter((item,i) => {return item.active === true}).length //点击后高亮legend个数
if(selectedAfterNum === 1) {//点击后只有一条曲线高亮
this.chartOption.series[0].markLine = markLine
}else {
this.chartOption.series[0].markLine = []
}
}
}
},
watch: {