使用Echarts中遇到值得記錄的小案例(一)

需求部分

在開發項目的時候遇到一個需求,就是如何保證echarts圖表裏至少顯示一個圖例的數據(也就是最後一個圖例不能變成unselected的狀態)
下圖是最初加載時的畫面
clipboard.pngjson

不想出現圖例都被點擊取消致使圖表只有一個座標軸,太醜了數組

clipboard.png

參考依據

在發帖前查閱了一些思路:echarts

  • 有用單選模式曲線救國的,可是就沒有辦法看到多條圖例的數據在同一個圖表裏顯示
  • 有圖例爲最後一個的時候,禁用全部圖例的點擊事件

都不是可以很好的解決,找到一個能夠參考的代碼this

var option = {
    title: {
        text: '折線圖堆疊'
    },
    tooltip: {
        trigger: 'axis'
    },
    legend: {
        data:['郵件營銷','聯盟廣告','視頻廣告','直接訪問','搜索引擎']
    },
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    toolbox: {
        feature: {
            saveAsImage: {}
        }
    },
    xAxis: {
        type: 'category',
        boundaryGap: false,
        data: ['週一','週二','週三','週四','週五','週六','週日']
    },
    yAxis: {
        type: 'value'
    },
    series: [
        {
            name:'郵件營銷',
            type:'line',
            stack: '總量',
            data:[120, 132, 101, 134, 90, 230, 210]
        },
        {
            name:'聯盟廣告',
            type:'line',
            stack: '總量',
            data:[220, 182, 191, 234, 290, 330, 310]
        },
        {
            name:'視頻廣告',
            type:'line',
            stack: '總量',
            data:[150, 232, 201, 154, 190, 330, 410]
        },
        {
            name:'直接訪問',
            type:'line',
            stack: '總量',
            data:[320, 332, 301, 334, 390, 330, 320]
        },
        {
            name:'搜索引擎',
            type:'line',
            stack: '總量',
            data:[820, 932, 901, 934, 1290, 1330, 1320]
        }
    ]
};
myChart.setOption(option);
myChart.on('legendselectchanged', function (params) {
    let option = this.getOption();
    let select_key = Object.keys(params.selected);
    if (!params.selected[params.name]) {
        select_key.map(res => {
            option.legend[0].selected[res] = !params.selected[res];//只點擊了一個圖例,因此select_key裏只有被選中的爲false,
                                                                   //對應的option.legend[0].selected[res]值就爲true,
                                                                   //即爲高亮狀態,其餘的都取消顯示,通俗的講就成了單選模式
        });
    } else {
        select_key.map(res => {
            option.legend[0].selected[res] = false;//先讓全部圖例下的數據顯示狀態爲false
        });
        option.legend[0].selected[params.name] = true;//再讓你選中的那個圖例的顯示狀態變爲true
    }
    this.setOption(option)
});

分析依據

關鍵代碼就是myChart.on('legendselectchanged', function (params){...}部分,這裏涉及到了echarts裏如何獲取legend的點擊事件,可是查看文檔後沒有示例不會寫怎麼辦?不要緊,用上面的示例代碼,咱們把代碼裏不明白的變量都打印出來分析一下例如console.log('params',params)和console.log('option',option),打印出來後,對照着官方文檔一看就清晰明瞭不少,這段截圖後面我會補上。搜索引擎

下面說一下上面的這段代碼的意思,select_key是legend圖例選中狀態的對應key-value對json,高亮的爲false,取消的是true(這裏和我們理解的高亮爲true是相反的),進入if語句後用map將select_key中的每個元素遍歷使得option.legend[0].selected[res]值爲select_key裏boolean值的相反值。spa

說到這裏可能會有點繞,option.legend[0]裏的selected也是一個key-value對json,高亮爲true,取消爲false,和select_key裏的表現效果偏偏相反。code

因此,這段代碼的實現效果就是,當圖例均爲高亮時select_key = {'a':false,'b':false,'c':false,'d':false},點擊b圖例,此時select_key['b']=true,因而進入了else代碼塊,如上面代碼註釋所寫,圖例由多變一,此時select_key = {'a':true,'b':false,'c':true,'d':true},這時候有兩種操做:視頻

  1. 再次點擊b圖例後select_key = {'a':true,'b':true,'c':true,'d':true},圖例狀態均爲不顯示的狀態,此時代碼進入if代碼塊,全部的圖例狀態變成相反值,因而四個圖例所有被選中,圖表顯示四條折線
  2. 點擊其餘圖例,好比c,同理進入else代碼塊後,全部狀態爲不顯示,再給選中的c圖例從新賦值使其顯示

解決方案

OK,到這裏咱們就明白了上面那段代碼究竟是什麼意思了,因此究竟該如何實現咱們須要的功能呢,有意思的是Object.values(params.selected)會返回一個圖例選中態的布爾值數組,至關於重組了咱們以前聲明的select_key裏各項的value值,咱們只需在這個布爾值數組裏只有一個false的時候,手動將其顯示狀態從新賦值爲true便可(option.legend[0].selected[params.name] = true;)索引

話很少說上代碼事件

myChart.on('legendselectchanged', function (params) {
                            let option = this.getOption();
                            let select_key = Object.keys(params.selected);
                            let select_value = Object.values(params.selected);
                            console.log('select_value',select_value,'length',select_value.length)
                            var n = 0;
                            select_value.map(res => {
                                if(!res){                
                                    n++;
                                }
                            });
                            console.log('n',n)
                            if( n ==select_value.length){   //若是最後一個圖例點擊後select_key裏的選中態會變爲false,
                                                            //既有四個false,當有4個false的時候將最後選中的圖例的實際顯示值改成true
                                option.legend[0].selected[params.name] = true;
                            }
                            this.setOption(option)
                        });

第一次寫博文總結,可能有點表述不清,還請見諒,歡迎討論

相關文章
相關標籤/搜索