vue echarts 折线图 堆叠面积图

vue echarts 折线图 堆叠面积图

1、默认只展示指数1和指数2的数据,可以手动点击legend展示其他数据;
2、legend手动添加 '全选' 选项;

javascript 复制代码
<template>
  <div>
    <div id="lineChart" 
      ref="lineChartRef" 
      style="width: 100%; height: 550px"></div>	
  </div>
</template>
  
<script>
import * as echarts from 'echarts';
export default {
  name: '',
  props: {},
  components: {},
  data() {
    return {
      chart: null,
      _thisForChart: null,
      _thisForWindow: null,
    }
  },
  watch: {},
  mounted () {
    this.$nextTick(() => {
      this.initAssetsChart();
      this.addEventListenerToSidebarContainer(this)
      this.addEventListenerToWindowResize(this)
    });
  },
  beforeDestroy () {
    this.removeEventListenerToSidebarContainer()
    this.removeEventListenerToWindowResize()
  },
  methods: {
    initAssetsChart () {
      let xAxisData = ['2024-01-01','2024-01-02','2024-01-03','2024-01-04','2024-01-05','2024-01-06',]
      let index1 = ["1.92", "1.12", "1.83", "1.13", "1.44", "1.04",]
      let index2 = ["7.12", "7.13", "7.14", "7.15", "7.17", "7.17",]
      let index3 = ["4.11", "4.12", "4.13", "4.13", "4.13", "4.13",]
      let index4 = ["1.69", "1.67", "1.67", "1.66", "1.66", "1.66", ]
      let index5 = ["6.68", "6.69", "6.66", "6.65", "6.65", "6.65",]
      let index6 = ["20.57", "20.58", "20.56", "20.55", "20.55", "20.55",]
      let index7 = ["50.61", "50.59", "50.61", "50.62", "50.62", "50.62",]
      let index8 = ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00",]
      let index9 = ["0.01", "0.01", "0.01", "0.01", "0.01", "0.01", ]

      var chartDom = document.getElementById('lineChart');
      this.chart = echarts.init(chartDom);
      let option = {
        color: ['#B22222','#ff1717','#ff6161','#e0815b','#e0a188','#ffaf33','#637be6', '#879dff', '#a1b2ff', '#b3daff',],
        tooltip: {
          trigger: 'axis',
          backgroundColor: 'rgba( 0, 0, 0,0.7)',
          borderColor: 'rgba( 0, 0, 0,0.7)',
          formatter:function(params) {
            var str = params[0].name + '</br>'
            for(let item of params) {
              str = `<span style='color: #fff;'>${str}</span><div style='display:flex;align-items:center;justify-content:space-between;'><span>${item.marker}<span style='color: #fff;'>${item.seriesName}</span></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style='color: #fff;'>${item.value}%</span></div>`
            }
            return str;
          }
        },
        legend: {
          top: 40,
          left: 'center',
          data: ['全选', '指数1', '指数2', '指数3', '指数4','指数5', '指数6', '指数7','指数8','指数9'],
          selected: {'全选': false,'指数1': true, '指数2':true, '指数3':false, '指数4':false,'指数5':false, '指数6':false, '指数7':false,'指数8':false,'指数9':false}
        },
        grid: {
          left: '1.5%',
          right: '2%',
          bottom: '3%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          axisLabel: {
            // color: '#fff',
            // interval: 40
          },
          axisLine: {
            show: true,
            lineStyle: {
            },
          },
          splitLine: {
            show: false,
          },
          data: xAxisData
        },
        
        yAxis: {
          type: 'value',
          axisLabel: {
            show: true,
            formatter: '{value}%'
          },
          axisLine: {
            show: false
          },
          splitLine: {
              show: false,
          },
        },
        series: [
          {
            name: '全选',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            label: {
              show: true,
              position: 'top'
            },
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: [],
          },
          {
            name: '指数1',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            label: {
              show: true,
              position: 'top'
            },
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index1
          },
          {
            name: '指数2',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            label: {
              show: true,
              position: 'top'
            },
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index2
          },
          {
            name: '指数3',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            label: {
              show: true,
              position: 'top'
            },
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index3
          },
          {
            name: '指数4',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index4
          },
          {
            name: '指数5',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index5
          },
          {
            name: '指数6',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            label: {
              show: true,
              position: 'top'
            },
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index6
          },
          {
            name: '指数7',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index7
          },
          {
            name: '指数8',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index8
          },
          
          {
            name: '指数9',
            type: 'line',
            stack: 'total',
            symbol: 'none',
            label: {
              show: true,
              position: 'top'
            },
            areaStyle: {},
            itemStyle: {
              normal: {
                label: {
                  show: false
                }
              }
            },
            data: index9
          },
        ]
      };
      this.chart.setOption(option,true);
      this.chart.on("legendselectchanged",function(params) {
        if (params.name == "全选") {
          let selectMark = option.legend.selected["全选"]; //获取图例中的全选状态,作为一个标记变量
          console.log(selectMark,'selectMark---');
          //option为上面的Echarts对象
          var data = option.legend.data;
          if (selectMark) {
            //判断
            for (var i = 0; i < data.length; i++) {
              option.legend.selected[data[i]] = false;
            }
          } else {
            for (var i = 0; i < data.length; i++) {
              option.legend.selected[data[i]] = true;
            }
          }
          this.setOption(option);
        }
      })
    },

    // 监听侧边栏导航的宽度发生变化
    addEventListenerToSidebarContainer(_this) {
      let sidebarContainer = document.getElementsByClassName("sidebar-container")[0];
      this._thisForChart = _this;
      sidebarContainer &&
        sidebarContainer.addEventListener("transitionend", this.sidebarResizeHandler);
    },
    removeEventListenerToSidebarContainer() {
      let sidebarContainer = document.getElementsByClassName("sidebar-container")[0];
      this._thisForChart = null
      sidebarContainer &&
        sidebarContainer.removeEventListener("transitionend", this.sidebarResizeHandler);
    },

    sidebarResizeHandler(e) {
      if (e.propertyName === "width") {
        this._thisForChart.chart.resize();
      }
    },

    // window 的尺寸发生变化的时候 会执行图表的resize
    addEventListenerToWindowResize(_this) {
      this._thisForWindow = _this;
      window.addEventListener("resize", this.windowResizeHandler);
    },
    removeEventListenerToWindowResize(_this) {
     this. _thisForWindow = null
      window.removeEventListener("resize", this.windowResizeHandler);
    },

    windowResizeHandler(e) {
      this._thisForWindow.chart.resize();
    },

  }
}
</script>
  
<style lang="scss" scoped>  
</style>

展示效果图:

默认效果

全选效果

相关推荐
Liu.7746 小时前
Vue3 中如何使用 GET 请求传递复杂参数
vue.js·vue3
定栓7 小时前
Webpack迁到Vite第一节:模块系统迁移:require → import
运维·前端·webpack
小熊在忙fpga7 小时前
N32G430芯片的flash表示
前端·javascript·html
Data analyse4567 小时前
App埋点版本兼容的字段迁移校验
大数据·运维·服务器·前端·数据库·数据分析
todoitbo7 小时前
本来只想给内网开个口子,Natapp 却多给了一道防护
前端·javascript·vue.js·内网穿透·网络防护·natapp
会灭火的程序员7 小时前
SuperMap AgentX Server智能体接入WEB应用技术文档
前端·supermap·agentx·agentx server
CRMEB7 小时前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源
Chloe.Zz7 小时前
一篇入门Agent
开发语言·前端·javascript
java1234_小锋7 小时前
【技术专题】HTML5 网页技术 - HTML5 表格标签
前端·html·html5
雪芽蓝域zzs7 小时前
JS 项目转 TS 项目(Vue3 + 若依这类后台项目)完整改造清单
前端·vue.js