创建文件 resize.js
import { ref, onMounted, onUnmounted } from 'vue';export function useResize(initChartFn) {const debounce = (func, wait, immediate) => {let timeout, args, context, timestamp, result;const later = function () {const last = +new Date() - timestamp;if (last < wait && last > 0) {timeout = setTimeout(later, wait - last);} else {timeout = null;if (!immediate) {result = func.apply(context, args);if (!timeout) context = args = null;}}};return function (...args) {context = this;timestamp = +new Date();const callNow = immediate && !timeout;if (!timeout) timeout = setTimeout(later, wait);if (callNow) {result = func.apply(context, args);context = args = null;}return result;};}const clientWidth = ref(window.innerWidth ||document.documentElement.clientWidth ||document.body.clientWidth);const fontSizeRem = (res) => {if (!clientWidth.value) return;let fontSize = 100 * (clientWidth.value / 1920);return res * fontSize;};const handleResize = debounce(() => {clientWidth.value =window.innerWidth ||document.documentElement.clientWidth ||document.body.clientWidth;if (typeof initChartFn === 'function') {initChartFn();}}, 500);onMounted(() => {window.addEventListener('resize', handleResize);});onUnmounted(() => {window.removeEventListener('resize', handleResize);});return {clientWidth,fontSizeRem,updateChart: initChartFn, };
}
父组件引用 chart1.vue
<template><div class="w100 h100" id="container1"></div>
</template><script setup>
import { useResize } from "./mixins/resize_test";
import {ref,reactive,toRefs,
} from "vue";
import { useRoute, useRouter } from "vue-router";
import Highcharts from "highcharts";
import Highcharts3D from "highcharts/highcharts-3d";
import variablePie from "highcharts/modules/variable-pie";
variablePie(Highcharts);
Highcharts3D(Highcharts);const props = defineProps({themeColors: {type: Array,default: ["#2ab6ee","#1189ff","#bd78fa","#f78722","#0df7fe","#f7c824","#6605ff","#d67f0b",],},
});
const data = reactive({});
let dataCount = ref([]);
let initChart = () => {Highcharts.setOptions({colors: props.themeColors,});Highcharts.chart("container1",{tooltip: {headerFormat: "<span>{point.key}</span><br/>",pointFormat: "<b>{point.percentage:.1f}%</b>",style: {fontSize: fontSizeRem(0.15),},},});
};
const { fontSizeRem, updateChart } = useResize(initChart);
const handleChart = (arr) => {dataCount.value = arr.map((item) => ({name: item.deviceType,y: item.deviceCount,z: item.deviceCount + 16,}));setTimeout(() => {updateChart();}, 500);
};
defineExpose({...toRefs(data),handleChart,
});
</script>
<style scoped lang="scss">
#container1 {background: linear-gradient(80.97deg,rgba(8, 49, 92, 0.5) 0%,rgba(8, 48, 92, 0) 100%);border: 0.00625rem solid rgba(0, 0, 0, 1);
}
</style>