You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
6.1 KiB

<!--
* @Author: your name
* @Date: 2021-10-08 19:12:07
* @LastEditTime: 2021-12-29 17:29:10
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edi
* @FilePath: /data-show/src/components/v-echars/index.vue
-->
<template>
<div class="echars-cont" ref="myChart" v-resize="changeWin">
</div>
</template>
<script>
import * as echarts from "echarts";
export default {
name: "v-echarts",
props: {
opt: {
type: Object,
default: () => {
return {};
},
},
},
watch: {
opt: {
handler(val) {
if (JSON.stringify(val) != "{}") {
this.$nextTick(() => {
if (!this.myChart) {
this.drawFun(val);
} else {
this.myChart.clear();
this.myChart.setOption(val);
}
this.myChart.off('click'); //解绑点击事件
// this.myChart.on('mouseover', (params) => {
// if(params.componentType === 'markPoint') {
// console.log('hover');
// }
// })
this.myChart.on('click', (params) => {
if(params.componentSubType === 'bar') {
let obj = {
axisValueLabel: params.name,
value: params.data
}
this.$emit("getData", obj);
}
if(params.componentSubType === 'sankey') {
let o = {
key: params.data.name || params.data.source,
value: params.value
}
this.$emit("getData", o);
}
if(params.componentType === 'markPoint') {
params.event.event.stopPropagation();
let o = {
key: params.data.name,
index: params.seriesIndex,
}
this.$emit("clickMark", o);
}
});
// this.myChart.off("click");
// 给图像加点击事件
this.myChart.getZr().on("dblclick", (params) => {
//param.name x轴值,param.data y轴值
let pointInPixel = [params.offsetX, params.offsetY];
if (
this.myChart.containPixel("grid", pointInPixel)
) {
// let pointInGrid = this.myChart.convertFromPixel(
// {
// seriesIndex: 0,
// },
// pointInPixel
// );
// let xIndex = pointInGrid[0]; //索引
// let handleIndex = Number(xIndex);
// let seriesObj = this.myChart.getOption(); //图表object对象
let obj =
this.myChart._componentsViews[1]
._cbParamsList;
let ex = obj[0]
if(ex && ex.componentSubType === 'line') {
this.$emit("getData", obj);
}
};
});
// 将鼠标变成小手
this.myChart.getZr().on("mousemove", () => {
this.myChart.getZr().setCursorStyle("pointer");
});
this.roundDefaultSelect(this.myChart);
this.$emit("echarsUpdate", this.myChart);
});
}
},
immediate: true,
},
},
data() {
return {
myChart: null,
};
},
methods: {
// 画图
drawFun(opt) {
let eRef = this.$refs.myChart;
this.myChart = echarts.init(eRef);
this.myChart.setOption(opt);
},
// 针对圆特定图形加个默认被选择
roundDefaultSelect(myChart) {
if (!myChart.getOption().series[0] || myChart.getOption().series[0].type != "pie") {
return;
}
let index = 0;
myChart.dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: 0,
});
myChart.on("mouseover", function (e) {
if (e.dataIndex != index) {
myChart.dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: index,
});
}
});
myChart.on("mouseout", function (e) {
index = e.dataIndex;
myChart.dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: e.dataIndex,
});
});
},
// 窗口变化
changeWin() {
if(this.myChart) {
this.myChart.resize()
}
}
},
};
</script>
<style lang="less" scoped>
.echars-cont {
width: 100%;
height: 100%;
}
</style>