<template> <div :class="className"> <div :id="id" class="spiritChartBox"></div> </div> </template> <script> import { mapState } from "vuex"; import echarts from "@/utils/initEcharts"; import deepMerge from "@/utils/deepMerge"; export default { name: "spiritChart", props: { className: { type: String, default: "spiritChartBox" }, id: { type: String, default: "spiritChart" }, options: { type: Object, default: function() { return {}; } } }, data() { return { chart: null }; }, watch: { options() { this.setOption(); }, clientWidth() { this.setOption(); } }, mounted() { const self = this; self.initChart(); }, computed: { ...mapState({ clientWidth: state => state.init.clientWidth }) }, methods: { initChart() { const self = this; self.chart = echarts.init(document.getElementById(self.id)); window.addEventListener("resize", () => { self.chart.resize(); }); self.setOption(); }, setOption() { const self = this; const { options, clientWidth } = self; const maxData = 100; const spirit = "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAA+CAYAAADeQLDtAAAACXBIWXMAAAsSAAALEgHS3X78AAABpElEQVRYhe2YQU6EMBSGf4n7coTxBHoAFrhg7dxAvcEcAW/g3ABP4Ljuxkk4gNwAb1BOgHljIQ22fR2GMcb0Twjh9ZWvpS389KLve3Aq6u4GQAngzkhtKCYzsePqs5Ci7tYAXj0pjzIT1WxIUXcpgBaAYBp7KzPx7ipMmMoPAYAhzykOkgcA2DwOkgZCvHkc5CMQ4s3jIN5ZE5rnhchMUAu3DKDhpjDXEwJtADw5it9CJkfQisf3mlnpG9JZAdjJTLQhdYMhp+jSvCjqLj9ibfjUmuM09qSoOwreL9gBeoHmMhMq0YByYQDpepjah54UdacC31FzdJXocTgXgLRm18kCSn8Dwq/4c0Kamfez1nNBNjMh1nr/f0wiJEIiJEL+OkRZ4kHO0KHPSVgl2lS/GMFtqP10qDTC9BGrTHNHrkVpKF3P8a+Hf0ftm1fDf+RoU30/ltMbAXjW5s0q/STGp3H07NKNsY2jU3HFR0iEREiEREiEnAIZ7I7r82uN+yC2vUcyEObZ1H5wOlNx2+i0c00HtbAyN/+1haIysj8Up/KfPQHwBdyuiCoNTDAkAAAAAElFTkSuQmCC"; self.chart.setOption({ title: { text: "景区饱和度", x: "center", y: "15%", textStyle: { color: "#fff", fontSize: 24, fontWeight: 600 } }, tooltip: { show: false }, xAxis: { max: maxData, splitLine: { show: false }, axisTick: { show: false }, axisLine: { show: false }, axisLabel: { show: false } }, yAxis: { data: options.yAxisData || [], inverse: true, axisTick: { show: false }, axisLine: { show: false }, axisLabel: { formatter: val => { const strArr = val.split("_"); return `{a|${strArr[0]}} {b|${strArr[1]}}`; }, rich: { a: { color: "#fff", fontSize: 12, lineHeight: 20 }, b: { color: "#fbee21", fontSize: 16 } } } }, grid: { top: "25%", height: "60%", "43%", right: "10%" }, series: [ { type: "pictorialBar", symbol: spirit, symbolRepeat: "fixed", symbolMargin: "15%", symbolClip: true, symbolSize: [15, 30], symbolBoundingData: maxData, data: options.seriesData || [], z: 10 }, { type: "pictorialBar", itemStyle: { normal: { opacity: 0.2 } }, animationDuration: 0, symbolRepeat: "fixed", symbolMargin: "15%", symbol: spirit, symbolSize: [15, 30], symbolBoundingData: maxData, data: options.seriesData || [], z: 5 } ] }); } } }; </script> <style scoped> .spiritChartBox { width: 100%; height: 100%; } </style>