lfqian's picture
Fix MiniEchart: move to standalone Vue component for proper template compilation
dda1ac1
raw
history blame
3.26 kB
<template>
<div ref="chartContainer" class="echart-mini"></div>
</template>
<script>
import * as echarts from 'echarts/core'
import { LineChart } from 'echarts/charts'
import { GridComponent, TooltipComponent } from 'echarts/components'
import { CanvasRenderer } from 'echarts/renderers'
import { nextTick } from 'vue'
echarts.use([LineChart, GridComponent, TooltipComponent, CanvasRenderer])
export default {
name: 'MiniEchart',
props: {
data: { type: Array, default: () => [] },
color: { type: String, default: '#22c55e' }
},
data() {
return {
chart: null,
resizeObserver: null
}
},
mounted() {
console.log('[MiniEchart] Mounted with data:', this.data?.length || 0, 'items')
nextTick(() => this.initChart())
},
beforeUnmount() {
if (this.resizeObserver) {
this.resizeObserver.disconnect()
this.resizeObserver = null
}
if (this.chart) {
this.chart.dispose()
this.chart = null
}
},
watch: {
data(newVal) {
if (this.chart && Array.isArray(newVal)) {
this.updateChart(newVal)
}
}
},
methods: {
initChart() {
const el = this.$refs.chartContainer
console.log('[MiniEchart] initChart - el:', el)
if (!el) {
console.log('[MiniEchart] No element found')
return
}
const { clientWidth: w, clientHeight: h } = el
console.log('[MiniEchart] Element size:', w, 'x', h)
if (!w || !h) {
console.log('[MiniEchart] Size is 0, will retry on next tick')
setTimeout(() => this.initChart(), 100)
return
}
console.log('[MiniEchart] Initializing ECharts...')
this.chart = echarts.init(el, null, { renderer: 'canvas' })
console.log('[MiniEchart] Chart initialized, rendering data:', this.data?.length || 0)
this.renderChart(this.data)
// Listen for container resize
this.resizeObserver = new ResizeObserver(() => {
if (this.chart) {
this.chart.resize()
}
})
this.resizeObserver.observe(el)
},
renderChart(arr) {
if (!this.chart) return
const d = Array.isArray(arr) ? arr : []
console.log('[MiniEchart] Rendering chart with', d.length, 'data points')
this.chart.setOption({
animation: true,
grid: { left: 0, right: 0, top: 0, bottom: 0 },
xAxis: {
type: 'category',
show: false,
boundaryGap: false,
data: d.map((_, i) => i)
},
yAxis: {
type: 'value',
show: false,
scale: true
},
tooltip: { show: false },
color: [this.color || '#22c55e'],
series: [{
type: 'line',
data: d,
showSymbol: false,
smooth: 0.35,
lineStyle: { width: 2 },
areaStyle: { opacity: 0.15 }
}]
})
},
updateChart(newData) {
if (!this.chart) return
const d = Array.isArray(newData) ? newData : []
this.chart.setOption({
xAxis: { data: d.map((_, i) => i) },
series: [{ data: d }]
})
}
}
}
</script>
<style scoped>
.echart-mini {
width: 100%;
height: 100%;
}
</style>