123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <script setup>
- import util from "@tools/util";
- import chartTheme from './../rateAnalysis.json'
- import {
- ref,
- toRaw,
- computed,
- onMounted,
- watch,
- nextTick
- } from 'vue';
- import {
- useStore
- } from 'vuex';
- import * as echarts from 'echarts'
- const chartId = 'chart-' + util.newGUID(); //chartId
- const chartIns = ref(null) //chart 实例
- const props = defineProps({
- xAxis: {
- type: Object,
- required: true,
- default: () => ({})
- },
- series: {
- type: Array,
- required: true
- },
- height: {
- type: String,
- required: false,
- default: '500px'
- },
- width: {
- type: String,
- required: false,
- default: '500px'
- },
- title: {
- type: String,
- required: false
- },
- subtext: {
- type: String,
- required: false
- },
- // 是否为dialog中单表
- isDiaAlone: {
- type: Boolean,
- default: false
- },
- // 是否含雷达图
- isRadar: {
- type: Boolean,
- default: false
- },
- theme: {
- type: Boolean,
- default: false
- },
- echartsTheme: {
- type: String,
- default: ''
- },
- })
- /**定义option */
- const option = computed({
- get() {
- let radar = null
- if (props.isRadar && props.xAxis.data.length) {
- radar = {
- radius: '70%',
- center: ['60%', '50%'],
- indicator: props.xAxis.data.map(o => {
- return {
- text: '',
- max: 1000
- }
- }),
- splitArea: {
- show: false
- },
- splitLine: {
- show: false
- }
- }
- }
- return {
- backgroundColor: '',
- title: {
- text: props.title || '',
- subtext: props.subtext || '',
- top: 10,
- left: props.isDiaAlone ? '22%' : '5%',
- },
- angleAxis: props.xAxis || {},
- radiusAxis: {},
- polar: {
- radius: '70%',
- center: ['60%', '50%']
- },
- radar: radar,
- tooltip: {
- formatter: (params) => {
- return params.componentSubType === 'radar' ?
- `${params.marker}${params.seriesName}` :
- `${params.marker}${params.seriesName}m<br/>${params.value>1? '频次:'+ params.value: ''}`
- },
- confine: true
- },
- series: props.series || [],
- legend: {
- show: true,
- orient: 'vertical',
- left: props.isDiaAlone ? '22%' : '5%',
- itemWidth: 16,
- itemHeight: 10,
- textStyle: {
- fontSize: util.vh(10)
- },
- top: 'middle',
- // data: ['0-2.5', '2.5-5', '5-7.5', '7.5-10', '10-12.5', '12.5-15', '15-17.5', '17.5-20',
- // '20-22.5', '22.5-25', '25-inf'
- // ]
- data: ['0-3', '3-5', '5-10', '10-12', '12-25', '25-inf']
- }
- }
- },
- set(val) {}
- })
- watch(() => option, (newVal, oldVal) => {
- if (chartIns.value) {
- const echartIns = toRaw(chartIns.value)
- echartIns.setOption(newVal.value)
- }
- }, {
- deep: true
- })
- watch([() => props.width, () => props.height], (newVal, oldVal) => {
- if (chartIns.value) {
- const echartIns = toRaw(chartIns.value)
- nextTick(() => echartIns.resize())
- }
- })
- const store = useStore()
- const collapse = computed({
- get() {
- return store.state.collapse
- },
- set(val) {}
- })
- watch(collapse, (val) => {
- if (chartIns.value) {
- setTimeout(() => {
- chartIns.value.resize()
- }, 300)
- }
- })
- onMounted(() => {
- nextTick(() => {
- init()
- })
- })
- watch(() => props.echartsTheme, (newVal, oldVal) => init())
- const init = () => {
- echarts.registerTheme('chartTheme', chartTheme)
- const echartIns = echarts.init(document.getElementById(chartId), props.echartsTheme)
- document.getElementById(chartId).removeAttribute("_echarts_instance_") ? document.getElementById(chartId)
- .removeAttribute("_echarts_instance_") : ''
- chartIns.value = echartIns
- echartIns.setOption(option.value)
- window.addEventListener('resize', () => {
- echartIns.resize()
- })
- }
- </script>
- <template>
- <div :id="chartId" :style="{ height: props.height, width: props.width }"></div>
- </template>
|