123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- <script setup>
- import util from "@tools/util";
- import chartTheme from './barChart.json'
- import { ref, toRaw, computed, onMounted, watch, nextTick } from 'vue';
- import * as echarts from 'echarts'
- const chartId = 'chart-' + util.newGUID(); //chartId
- const chartIns = ref(null) //chart 实例
- const emits = defineEmits(['getSelected'])
- const props = defineProps({
- xAxis: {
- type: Object,
- required: true,
- default: () => ({})
- },
- yAxis: {
- type: Array,
- required: false
- },
- series: {
- type: Array,
- required: true
- },
- dataset: {
- type: Array,
- required: false,
- default: () => ([])
- },
- height: {
- type: String,
- required: false,
- default: '500px'
- },
- width: {
- type: String,
- required: false,
- default: '500px'
- },
- title: {
- type: String,
- required: false
- },
- subtext: {
- type: String,
- required: false
- },
- brush: {
- type: Boolean,
- required: false,
- default: false
- }
- })
- /**定义option */
- const option = computed({
- get() {
- return {
- color:[
- "rgb(50,93,171)",
- "#0098d980",
- "#626c91",
- "#a0a7e6",
- "#c4ebad",
- "#96dee8"
- ],
- title: {
- text: props.title || '',
- subtext: props.subtext || '',
- top: 6,
- left: '5%',
- },
- xAxis: props.xAxis || {},
- yAxis: props.yAxis || {},
- brush: {
- seriesIndex: [1],
- yAxisIndex: 0,
- transformable: true,
- throttleType: "debounce",
- throttleDelay: 1000,
- removeOnClick: true,
- brushType: props.brush? "polygon" : false,
- brushMode: "multiple",
- brushStyle: {
- borderWidth: 1,
- borderColor: "#ff2424",
- },
- },
- toolbox:{
- show: props.brush,
- },
- tooltip: {
- confine: true,
- trigger: "axis",
- },
- dataset: props.dataset || [],
- series: props.series || [],
- legend: {
- right: "120",
- top: "5",
- itemWidth: 6,
- },
- grid: {
- top: 80,
- left: 40,
- right: 40,
- bottom: 40,
- },
- dataZoom: [
- {
- type: "inside", //图表下方的伸缩条
- show: false, //是否显示
- realtime: true, //拖动时,是否实时更新系列的视图
- start: 0, //伸缩条开始位置(1-100),可以随时更改
- end: 100, //伸缩条结束位置(1-100),可以随时更改
- },
- {
- type: "slider", //图表下方的伸缩条
- show: false, //是否显示
- realtime: true, //拖动时,是否实时更新系列的视图
- start: 0, //伸缩条开始位置(1-100),可以随时更改
- end: 100, //伸缩条结束位置(1-100),可以随时更改
- },
- ],
- }
- },
- set(val) { }
- })
- watch(() => option, (newVal, oldVal) => {
- if (chartIns.value) {
- const echartIns = toRaw(chartIns.value)
- echartIns.setOption(toRaw(newVal.value))
- }
- }, { deep: true })
- watch([() => props.width, () => props.height],(newVal, oldVal) => {
- if(chartIns.value){
- const echartIns = toRaw(chartIns.value)
- nextTick(() => echartIns.resize())
- }
- })
- const funBrushChange = (flag) => {
- const echartIns = toRaw(chartIns.value)
- echartIns.dispatchAction({
- type: "takeGlobalCursor",
- // 如果想变为“可刷选状态”,必须设置。不设置则会关闭“可刷选状态”。
- key: "brush",
- brushOption: {
- seriesIndex: [1],
- yAxisIndex: 0,
- transformable: true,
- throttleType: "debounce",
- throttleDelay: 1000,
- removeOnClick: true,
- brushType: flag? "polygon" : false,
- brushMode: "multiple",
- brushStyle: {
- borderWidth: 1,
- color: "rgba(255,36,36,0.2)",
- borderColor: "#ff2424",
- },
- },
- });
- echartIns.off("brushSelected");
- echartIns.on("brushSelected", (params) => {
- emits("getSelected", params.batch || []);
- });
- }
- watch(() => props.brush, (newVal, oldVal) => funBrushChange(newVal))
- onMounted(() => {
- nextTick(() => {
- echarts.registerTheme('chartTheme', chartTheme)
- const echartIns = echarts.init(document.getElementById(chartId),'chartTheme')
- chartIns.value = echartIns
- echartIns.setOption(option.value)
- funBrushChange(props.brush)
- window.addEventListener('resize', () => {
- echartIns.resize()
- })
- })
- })
- </script>
- <template>
- <div :id="chartId" :style="{ height: props.height, width: props.width }"></div>
- </template>
|