话不多说,间接上代码吧
新增一个MyCharts.vue文件,文件内容如下
<!--/*** Author: 前端小高* Desc: MyCharts 图表组件*/--><template> <div :id="chartId" :style="getChartStyle"></div></template><script name="MyCharts" lang="ts" setup>import { ref, shallowRef, computed, watch, onMounted, onBeforeUnmount, getCurrentInstance, PropType} from 'vue'import { debounce } from 'lodash'const { proxy } = getCurrentInstance() as anyconst props = defineProps({ options: { type: Object, default: () => { return {} } }, height: { type: Number, default: 300 }, // 是否不跟之前的传入值合并 notMerge: { type: Boolean, default: true }})const getChartStyle = computed(() => { return { width: '100%', height: `${props.height}px` }})watch( () => props.options, () => { initChart() }, { deep: true })// 默认显示的图表配置数据const defaultOptions = { tooltip: { trigger: 'axis' }, legend: { data: ['Email', 'Union Ads'] }, grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, xAxis: { type: 'category', boundaryGap: false, data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { name: 'Email', type: 'line', smooth: true, stack: 'Total', data: [120, 132, 101, 134, 90, 230, 210] }, { name: 'Union Ads', type: 'line', smooth: true, stack: 'Total', data: [220, 182, 191, 234, 290, 330, 310] } ]}const getRandomStr = () => { const randomNumStr = String(Math.random()).split('.')[1] return randomNumStr}const chartId = ref('chart-id')const getChartId = () => { const str = 'chart-id-' + getRandomStr() chartId.value = str}getChartId()const resizeHandler = () => { eChartsRef.value.resize()}const resizeHandlerOrigin = debounce(resizeHandler, 500)const eCharts = proxy.$EChartsconst eChartsRef = shallowRef<any>()const initChart = () => { eChartsRef.value = eCharts.init(document.getElementById(chartId.value)) let options = {} if (isEmptyObj(props.options)) { options = defaultOptions } else { options = props.options } eChartsRef.value.setOption(options, props.notMerge) window.addEventListener('resize', resizeHandlerOrigin)}const isEmptyObj = (obj) => { return typeof obj === 'object' && JSON.stringify(obj) === '{}'}onMounted(() => { initChart()})onBeforeUnmount(() => { window.removeEventListener('resize', resizeHandlerOrigin) eChartsRef.value.dispose()})watch( () => props.options, () => { initChart() }, { deep: true })</script><style lang="scss" scoped></style>
页面下援用组件及应用办法
<template> <my-charts></my-charts></template><script name="TestPage" lang="ts" setup> import MyCharts from './MyCharts.vue'</script>
预览成果如下