• liang's avatar
    init · dad95e78
    liang authored
    dad95e78
RadarChart.vue 3.29 KB
<template>
  <div :class="className" :style="{ height: height, width: width }" />
</template>

<script>
import * as echarts from 'echarts';;
require("echarts/theme/macarons"); // echarts theme
import resize from "./mixins/resize";
const animationDuration = 2600;
export default {
  mixins: [resize],
  props: {
    className: {
      type: String,
      default: "chart",
    },
    width: {
      type: String,
      default: "100%",
    },
    height: {
      type: String,
      default: "350px",
    },
    autoResize: {
      type: Boolean,
      default: true,
    },
    chartData: {
      required: true,
    },
  },
  data() {
    return {
      chart: null,
      config: {
        // tooltip: {
        // },
        radar: {
          top: 10,
          radius: "66%",
          center: ["50%", "42%"],
          splitNumber: 8,
          splitArea: {
            areaStyle: {
              color: "rgba(127,95,132,.3)",
              opacity: 1,
              shadowBlur: 45,
              shadowColor: "rgba(0,0,0,.5)",
              shadowOffsetX: 0,
              shadowOffsetY: 15,
            },
          },
          indicator: [
            // { name: "服务接诊量指数-接诊量1586人次/年(★★★★★)", max: 5 },
            // { name: "单次服务费用指数(◼◼◼◼)", max: 5 },
            // { name: "服务病例严重指数(★★★)", max: 5 },
            // { name: "服务供应指数(★★★★★)", max: 5 },
            // { name: "信任度指数(★★★★★)", max: 5 },
            // { name: "老年人偏好指数(★★★★★)", max: 5 },
          ],
        },
        series: [
          {
            type: "radar",
            symbolSize: 0,
            areaStyle: {
              normal: {
                shadowBlur: 13,
                shadowColor: "rgba(0,0,0,.2)",
                shadowOffsetX: 0,
                shadowOffsetY: 10,
                opacity: 1,
              },
            },
            data: [
              {
                value: [],
              },
            ],
            animationDuration: 2600,
          },
        ],
      },
    };
  },
  watch: {
    chartData: {
      deep: true,
      handler(val) {
        this.setOptions(val);
      },
    },
  },
  mounted() {
    this.$nextTick(() => {
      this.initChart();
    });
  },
  beforeDestroy() {
    if (!this.chart) {
      return;
    }
    this.chart.dispose();
    this.chart = null;
  },
  methods: {
    getIcon(icon, n) {
      if (!icon || !n) return "";
      let str = "";
      Array.apply(null, Array(Math.round(n))).forEach(() => {
        str += icon;
      });
      return `(${str})`;
    },
    initChart() {
      this.chart = echarts.init(this.$el, "macarons");
      this.setOptions(this.chartData);
    },
    setOptions(chartData) {
      if (!chartData.data) return;
      let option = {};
      option = this.config;
      const series = chartData.data.map((v) => {
        let max = v.max || 5; //标准值
        let val = v.value > max ? max : v.value; //实际值
        return {
          name: `${v.name}${this.getIcon(v.icon, val)}`,
          value: Number(val),
          max,
        };
      });
      option.radar.indicator = series;
      option.series[0].data[0].value = series.map((_) => _.value);
      this.chart.setOption(option);
    },
  },
};
</script>