|  | @@ -0,0 +1,294 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <div class="echarts-line" :id="ids"></div>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<script>
 | 
	
		
			
				|  |  | +import * as echarts from 'echarts'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default {
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    legendChecked: {
 | 
	
		
			
				|  |  | +      // 图例
 | 
	
		
			
				|  |  | +      default: true
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    ids: {
 | 
	
		
			
				|  |  | +      // id
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: 'echartsline'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    fontColor: {
 | 
	
		
			
				|  |  | +      // 字体颜色
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: '#89949F'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    yLine: {
 | 
	
		
			
				|  |  | +      // x轴分割线
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    chartData: {
 | 
	
		
			
				|  |  | +      // echarts·数据
 | 
	
		
			
				|  |  | +      default: function () {
 | 
	
		
			
				|  |  | +        return []
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    // Y轴单位
 | 
	
		
			
				|  |  | +    Yunit: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: true
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    theme: {
 | 
	
		
			
				|  |  | +      default: function () {
 | 
	
		
			
				|  |  | +        return ['#3da4fe', '#23cef2', '#65b664', '#00FDCB']
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  watch: {
 | 
	
		
			
				|  |  | +    chartData: {
 | 
	
		
			
				|  |  | +      // 深度监听,可监听到对象、数组的变化
 | 
	
		
			
				|  |  | +      handler() {
 | 
	
		
			
				|  |  | +        this.$nextTick(() => {
 | 
	
		
			
				|  |  | +          if (this.chartData && this.chartData.length > 0) {
 | 
	
		
			
				|  |  | +            this.dataValue(this.chartData)
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      deep: true, // 深度监听,可监听到对象、数组的变化
 | 
	
		
			
				|  |  | +      immediate: true // 立刻执行
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  data() {
 | 
	
		
			
				|  |  | +    return {}
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  mounted() {},
 | 
	
		
			
				|  |  | +  methods: {
 | 
	
		
			
				|  |  | +    dataValue(newVal) {
 | 
	
		
			
				|  |  | +      if (newVal && newVal.length > 0) {
 | 
	
		
			
				|  |  | +        const seriesConfig = []
 | 
	
		
			
				|  |  | +        const Yconfig = []
 | 
	
		
			
				|  |  | +        const unit = []
 | 
	
		
			
				|  |  | +        for (let i = 0; i < newVal.length; i++) {
 | 
	
		
			
				|  |  | +          if (newVal[i].areaStyle) {
 | 
	
		
			
				|  |  | +            const obj = {
 | 
	
		
			
				|  |  | +              type: 'line',
 | 
	
		
			
				|  |  | +              name: newVal[i].name,
 | 
	
		
			
				|  |  | +              data: newVal[i].yData,
 | 
	
		
			
				|  |  | +              smooth: newVal[i].smooth ? newVal[i].smooth : false,
 | 
	
		
			
				|  |  | +              showSymbol: newVal[i].showSymbol ? newVal[i].showSymbol : false,
 | 
	
		
			
				|  |  | +              lineStyle: {
 | 
	
		
			
				|  |  | +                color: newVal[i].lineColor
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              areaStyle: {
 | 
	
		
			
				|  |  | +                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
 | 
	
		
			
				|  |  | +                  {
 | 
	
		
			
				|  |  | +                    offset: 0,
 | 
	
		
			
				|  |  | +                    color: newVal[i].areaColor
 | 
	
		
			
				|  |  | +                  },
 | 
	
		
			
				|  |  | +                  {
 | 
	
		
			
				|  |  | +                    offset: 1,
 | 
	
		
			
				|  |  | +                    color: 'rgba(0,0,0,0)'
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                ])
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (i === 1) {
 | 
	
		
			
				|  |  | +              obj.yAxisIndex = 1
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            seriesConfig.push(obj)
 | 
	
		
			
				|  |  | +            if (this.Yunit) {
 | 
	
		
			
				|  |  | +              Yconfig.push({
 | 
	
		
			
				|  |  | +                type: 'value',
 | 
	
		
			
				|  |  | +                name:
 | 
	
		
			
				|  |  | +                    (newVal.length > 1 ? newVal[i].name : '单位') +
 | 
	
		
			
				|  |  | +                    ':' +
 | 
	
		
			
				|  |  | +                    newVal[i].unit,
 | 
	
		
			
				|  |  | +                nameTextStyle: {
 | 
	
		
			
				|  |  | +                  fontSize: 12,
 | 
	
		
			
				|  |  | +                  color: this.fontColor
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                splitNumber: 5,
 | 
	
		
			
				|  |  | +                axisTick: {
 | 
	
		
			
				|  |  | +                  show: false
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                splitLine: {
 | 
	
		
			
				|  |  | +                  show: this.yLine,
 | 
	
		
			
				|  |  | +                  lineStyle: {
 | 
	
		
			
				|  |  | +                    color: 'rgba(153, 153, 153, 0.3)'
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                axisLine: {
 | 
	
		
			
				|  |  | +                  show: false
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                axisLabel: {
 | 
	
		
			
				|  |  | +                  color: this.fontColor,
 | 
	
		
			
				|  |  | +                  fontSize: 12
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              })
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +              Yconfig.push({
 | 
	
		
			
				|  |  | +                type: 'value',
 | 
	
		
			
				|  |  | +                nameTextStyle: {
 | 
	
		
			
				|  |  | +                  fontSize: 12,
 | 
	
		
			
				|  |  | +                  color: this.fontColor
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                splitNumber: 5,
 | 
	
		
			
				|  |  | +                axisTick: {
 | 
	
		
			
				|  |  | +                  show: false
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                splitLine: {
 | 
	
		
			
				|  |  | +                  show: this.yLine,
 | 
	
		
			
				|  |  | +                  lineStyle: {
 | 
	
		
			
				|  |  | +                    color: 'rgba(153, 153, 153, 0.3)'
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                axisLine: {
 | 
	
		
			
				|  |  | +                  show: false
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +                axisLabel: {
 | 
	
		
			
				|  |  | +                  color: this.fontColor,
 | 
	
		
			
				|  |  | +                  fontSize: 12
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              })
 | 
	
		
			
				|  |  | +              Yconfig[0].name = '(m³/s)'
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            unit.push(newVal[i].unit)
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            seriesConfig.push({
 | 
	
		
			
				|  |  | +              type: 'line',
 | 
	
		
			
				|  |  | +              name: newVal[i].name,
 | 
	
		
			
				|  |  | +              data: newVal[i].yData,
 | 
	
		
			
				|  |  | +              smooth: newVal[i].smooth ? newVal[i].smooth : false,
 | 
	
		
			
				|  |  | +              symbolSize: newVal[i].showSymbol ? newVal[i].showSymbol : false,
 | 
	
		
			
				|  |  | +              lineStyle: {
 | 
	
		
			
				|  |  | +                color: newVal[i].lineColor
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +            Yconfig.push({
 | 
	
		
			
				|  |  | +              type: 'value',
 | 
	
		
			
				|  |  | +              name: newVal[i].name + ':' + newVal[i].unit,
 | 
	
		
			
				|  |  | +              nameTextStyle: {
 | 
	
		
			
				|  |  | +                fontSize: 12,
 | 
	
		
			
				|  |  | +                color: this.fontColor
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              splitNumber: 5,
 | 
	
		
			
				|  |  | +              axisTick: {
 | 
	
		
			
				|  |  | +                show: false
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              splitLine: {
 | 
	
		
			
				|  |  | +                show: this.yLine,
 | 
	
		
			
				|  |  | +                lineStyle: {
 | 
	
		
			
				|  |  | +                  color: '#e5e5e5'
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              axisLine: {
 | 
	
		
			
				|  |  | +                show: false
 | 
	
		
			
				|  |  | +              },
 | 
	
		
			
				|  |  | +              axisLabel: {
 | 
	
		
			
				|  |  | +                color: this.fontColor,
 | 
	
		
			
				|  |  | +                fontSize: 12
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            })
 | 
	
		
			
				|  |  | +            unit.push(newVal[i].unit)
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        this.setEcharts(seriesConfig, Yconfig, newVal[0].xData, unit)
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    setEcharts(series, Yconfig, dataAxis, unit) {
 | 
	
		
			
				|  |  | +      let legend = []
 | 
	
		
			
				|  |  | +      if (this.legendChecked) {
 | 
	
		
			
				|  |  | +        legend = this.chartData.map((data, i) => {
 | 
	
		
			
				|  |  | +          return {
 | 
	
		
			
				|  |  | +            name: data.name,
 | 
	
		
			
				|  |  | +            icon: 'roundRect',
 | 
	
		
			
				|  |  | +            itemStyle: series[i].lineStyle
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        legend = []
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      const myChart = echarts.init(document.getElementById(this.ids))
 | 
	
		
			
				|  |  | +      const option = {
 | 
	
		
			
				|  |  | +        color: this.theme,
 | 
	
		
			
				|  |  | +        tooltip: {
 | 
	
		
			
				|  |  | +          trigger: 'axis',
 | 
	
		
			
				|  |  | +          formatter: function (data) {
 | 
	
		
			
				|  |  | +            if (!data.length) return
 | 
	
		
			
				|  |  | +            if (data.length > 1) {
 | 
	
		
			
				|  |  | +              let html = ''
 | 
	
		
			
				|  |  | +              html = `<div class="toolTips"><div style="font-size: 12px;color: #fff">${data[0].axisValue}</div>`
 | 
	
		
			
				|  |  | +              for (let i = 0; i < data.length; i++) {
 | 
	
		
			
				|  |  | +                html += `<div style="font-size: 12px;color: #fff">${series[i].name}: ${data[i].value} ${unit[i]}</div>`
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +              html += '</div>'
 | 
	
		
			
				|  |  | +              return html
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +              return `<div class="toolTips"><div style="font-size: 12px;color: #fff">${data[0].axisValue}: ${data[0].value} ${unit[0]}</div></div>`
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          backgroundColor: '#487892',
 | 
	
		
			
				|  |  | +          borderWidth: 0,
 | 
	
		
			
				|  |  | +          padding: [3, 5],
 | 
	
		
			
				|  |  | +          axisPointer: {
 | 
	
		
			
				|  |  | +            lineStyle: {
 | 
	
		
			
				|  |  | +              color: '#299acb'
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        legend: {
 | 
	
		
			
				|  |  | +          top: 0,
 | 
	
		
			
				|  |  | +          right: 'center',
 | 
	
		
			
				|  |  | +          width: 240,
 | 
	
		
			
				|  |  | +          data: legend,
 | 
	
		
			
				|  |  | +          itemWidth: 15,
 | 
	
		
			
				|  |  | +          itemHeight: 5,
 | 
	
		
			
				|  |  | +          show: true,
 | 
	
		
			
				|  |  | +          selectedMode: false,
 | 
	
		
			
				|  |  | +          textStyle: {
 | 
	
		
			
				|  |  | +            color: this.fontColor
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        xAxis: {
 | 
	
		
			
				|  |  | +          type: 'category',
 | 
	
		
			
				|  |  | +          data: dataAxis,
 | 
	
		
			
				|  |  | +          boundaryGap: false,
 | 
	
		
			
				|  |  | +          axisTick: {
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +            inside: true
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          splitLine: {
 | 
	
		
			
				|  |  | +            show: false
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          axisLine: {
 | 
	
		
			
				|  |  | +            lineStyle: {
 | 
	
		
			
				|  |  | +              color: 'rgba(135,142,148,0.5)'
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          axisLabel: {
 | 
	
		
			
				|  |  | +            color: this.fontColor,
 | 
	
		
			
				|  |  | +            fontSize: 12
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        yAxis: Yconfig,
 | 
	
		
			
				|  |  | +        grid: {
 | 
	
		
			
				|  |  | +          left: 20,
 | 
	
		
			
				|  |  | +          right: 35,
 | 
	
		
			
				|  |  | +          top: this.legendChecked ? 30 : 30,
 | 
	
		
			
				|  |  | +          bottom: 0,
 | 
	
		
			
				|  |  | +          containLabel: true
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        series: series
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      myChart.clear()
 | 
	
		
			
				|  |  | +      myChart.setOption(option, true)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<style scoped lang="scss">
 | 
	
		
			
				|  |  | +.echarts-line {
 | 
	
		
			
				|  |  | +  width: 80%;
 | 
	
		
			
				|  |  | +  height: 80%;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</style>
 |