vue 결합 원생 js 해결 echarts resize 문제
왼쪽 메뉴 표시 줄 모듈 은 줄 일 수 있 습 니 다.왼쪽 상단 의 icon 을 클릭 하면 줄 일 수 있 습 니 다.그러나 왼쪽 상단 의 icon 을 클릭 한 후에 오른쪽 echarts 그림 은 해당 하 는 수축 을 하지 않 았 습 니 다.element-resize-detector 플러그 인 을 사용 하면 문 제 를 해결 할 수 있 습 니 다Vue 프로젝트 에서 echarts 를 사용 하 는 방법,너비 변화 로 인해 그림 의 크기 를 조정 할 수 없습니다..그러나 약간 끊 길 수 있 기 때문에 원생 의 방법 으로 처리 합 니 다.windows 자체 테이프 의 원생 resize 이벤트 처리 브 라 우 저 너비 높이 변 화 를 결합 하여 플러그 인 을 사용 하지 않 고 문 제 를 처리 할 수 있 습 니 다.
<template>
<div
id="leftEchartPie"
ref="leftEchartPie"
></div>
</template>
<script>
export default {
props: {
leftPieData: {
type: Object,
default: {}
}
},
data() {
return {
myChart: null,
option: null,
observe: null,
optionData: []
};
},
watch: {
leftPieData: {
deep: true,
handler(leftPieData) {
if (leftPieData) {
this.initChart(leftPieData);
}
}
}
},
mounted() {
const option = {
title: {
zlevel: 0,
text: null,
rich: {
value: {
color: "#3F495A",
fontSize: 14,
lineHeight: 16
},
name: {
color: "#3F495A",
fontSize: 14,
lineHeight: 16
}
},
top: "center",
left: "19.3%",
textAlign: "center",
textStyle: {
rich: {
value: {
color: "#3F495A",
fontSize: 14,
lineHeight: 16
},
name: {
fontSize: 16,
color: "#3F495A",
lineHeight: 30
}
}
}
},
tooltip: {
show: true,
trigger: "item",
formatter: "{a} <br/>{b}: {c} ({d}%)"
},
legend: {},
series: [
{
name: "Security Status",
type: "pie",
center: ["20%", "50%"],
radius: ["80%", "45%"],
itemStyle: {
borderWidth: 6,
borderColor: "#fff"
},
hoverAnimation: false,
avoidLabelOverlap: false,
label: {
show: false,
position: "center"
},
emphasis: {
label: {
show: false,
fontSize: "30",
fontWeight: "bold"
}
},
labelLine: {
show: false
},
data: []
}
]
};
this.option = option;
var dom = document.getElementById("leftEchartPie");
var myChart = this.echarts.init(dom);
this.myChart = myChart;
// MutationObserver
const observer = new MutationObserver(() => {
setTimeout(this.myChart.resize, 201);
});
const config = { attributes: true, childList: true, subtree: false };
this.observe = observer;
observer.observe(document.getElementsByClassName("spoc-menu")[0], config);
// resize
window.addEventListener("resize", this.resizeEchart, true);
},
beforeDestroy() {
this.observe.dis;
window.removeEventListener("resize", this.resizeEchart, true);
},
methods: {
resizeEchart() {
this.myChart.resize();
},
initChart(leftPieData) {
this.option.text = [
"{name|Total}",
"{value|" + leftPieData.totalNum + "}"
].join("
");
this.option.legend.data = [
`Very High Risk`,
`High Risk`,
`Medium Risk`,
`Low Risk`,
`Very Low Risk`
];
this.option.series[0].data = [
{
value: this.leftPieData.veryHighRiskNum,
name: `Very High Risk`,
itemStyle: {
color: "#FF4D4F"
}
},
{
value: this.leftPieData.highRiskNum,
name: `High Risk`,
itemStyle: {
color: "#FA9314"
}
},
{
value: this.leftPieData.mediumRiskNum,
name: `Medium Risk`,
itemStyle: {
color: "#FACB14"
}
},
{
value: this.leftPieData.lowRiskNum,
name: `Low Risk`,
itemStyle: {
color: "#4ED6CC"
}
},
{
value: this.leftPieData.veryLowNum,
name: `Very Low Risk`,
itemStyle: {
color: "#2BD374"
}
}
];
this.optionData = this.option.series[0].data;
const optionData = this.optionData;
this.option.legend = {
textStyle: {
fontSize: 14,
color: "#3F495A"
},
orient: "vertical",
left: "60%",
itemGap: 30, //
top: "middle",
icon: "circle",
itemHeight: 10, //
// data: [],
formatter(params) {
if (optionData.length) {
switch (params) {
case "Very High Risk":
return params + " " + optionData[0].value;
break;
case "High Risk":
return params + " " + optionData[1].value;
break;
case "Medium Risk":
return params + " " + optionData[2].value;
break;
case "Low Risk":
return params + " " + optionData[3].value;
break;
case "Very Low Risk":
return params + " " + optionData[4].value;
break;
default:
return "";
}
}
}
};
//
this.myChart.setOption(this.option);
}
}
};
</script>
<style>
#leftEchartPie {
width: 100%;
height: calc(100% - 60px);
}
</style>
핵심 코드
// MutationObserver
const observer = new MutationObserver(() => {
setTimeout(this.myChart.resize, 201);
});
const config = { attributes: true, childList: true, subtree: false };
this.observe = observer;
observer.observe(document.getElementsByClassName("spoc-menu")[0], config);
// resize
window.addEventListener("resize", this.resizeEchart, true);
MutationObserver에 대한 사용 참고마지막 으로 beforeDestroy 에서 감청 시간 과 Mutation Observer 가 감청 한 사건 을 없 애 야 합 니 다.사건 이 페이지 에 계속 있 고 메모리 가 소모 되 지 않도록 해 야 합 니 다.
마지막 으로 개발 한 후에 예전 에 사 용 했 던 플러그 인과 비 교 했 습 니 다.원생 js 처리 체험 은 플러그 인보 다 반응 이 빠 르 고 플러그 인 이 사람 에 게 주 는 느낌 방패 입 니 다.
ok 이것 이 바로 vue 가 원생 js 와 결합 하여 echarts resize 문 제 를 해결 하 는 데 관 한 개발 소감 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fastapi websocket 및 vue 3(Composition API)1부: FastAPI virtualenv 만들기(선택 사항) FastAPI 및 필요한 모든 것을 다음과 같이 설치하십시오. 생성main.py 파일 및 실행 - 브라우저에서 이 링크 열기http://127.0.0.1:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.