echarts图例全选功能实现

需求说明

图标涉及图例较多,为方便操作,故新增全选/全取消功能,通过全选框控制全选/全取消

 

实现思路

主要用到echarts > legend > selected属性以及legendselectchanged方法。当全选/全取消时通过selected属性动态赋值,改变图例选中状态。legendselectchanged方法用来动态监听单个图例点击状态,使得图例选中状态与全选框状态保持一致:若至少有一个图例没选中,则全选框不勾选,若所有图例均选中,则全选框勾选。

 

开发须知

selected属性对应值为json对象,例:

{ 图例名称:true/false // 是否选中}

selected属性默认所有图例均选中,若需展示指定图例,可将其他不需展示的图例设置为false,例:

// 不展示图例1-3
{
  图例1: false,
  图例2: false,
  图例3: false
}

 

核心代码

// 全选框html片段(本例采用vue开发)
<p><input type="checkbox"  :checked="checkAll" @change="selectAll"/> 全选</p>

 

// 对selected动态赋值
    selectAll() {
      this.checkAll = !this.checkAll; // 全选框状态取反
      // 获取图列数据
      const legendData = this.legendArr; // 本例legendArr为动态赋值的图例数组
      let checkData = {} // 中转空对象,用来存放最新状态的selected值
      for (let key in legendData) {
        checkData[legendData[key]] = this.checkAll // 将全选框状态赋值给每个图例
      }

      this.options.legend.selected = checkData; // 动态赋值selected值
      this.chartLine.setOption(this.options); 
  }

 

// 绑定legendselectedchanged方法到图表实例,以便对单个图例选中状态发生变化时修改全选框勾选状态
  this.chartLine.on('legendselectchanged', obj => {
        const { selected, name } = obj; // selected:包含所有图例的状态,name:当前点击图例的名称
        if (selected){
          // 如果当前图例为false,设置全选状态为false
          if (selected[name] === false) {
            this.checkAll = false;
          } else {// 否则对所有图例做遍历,若图例为true的个数=图例总数,设置全选状态为true
            let flagnum = 0; // 标记图例为true的个数
            if (this.legendArr && this.legendArr.length > 0) {// legendArr为图例数组,因本例中图例为动态数组且已赋值,所以直接可用
              this.legendArr.forEach(key => {
                if (selected[key] === true) {
                  flagnum += 1;
                }
              });
              if (flagnum === this.legendArr.length) {
                this.checkAll = true;
              }
            } 
          }
        }
      });

 

posted @ 2020-02-11 19:11  南韵  阅读(3618)  评论(0编辑  收藏  举报