|
@@ -10,14 +10,14 @@ import * as echarts from 'echarts';
|
|
|
|
|
|
const props = defineProps({
|
|
|
rowData: {
|
|
|
- type: Array as PropType<{ [key: string]: number }[]>,
|
|
|
+ type: Object,
|
|
|
required: true,
|
|
|
},
|
|
|
});
|
|
|
|
|
|
const chartRef = ref<HTMLElement | null>(null);
|
|
|
let chart: echarts.ECharts | null = null;
|
|
|
-let resizeObserver: ResizeObserver | null = null
|
|
|
+let resizeObserver: ResizeObserver | null = null;
|
|
|
|
|
|
onMounted(() => {
|
|
|
initChart();
|
|
@@ -26,28 +26,29 @@ onMounted(() => {
|
|
|
onUnmounted(() => {
|
|
|
// 清理 ResizeObserver
|
|
|
if (resizeObserver) {
|
|
|
- resizeObserver.disconnect()
|
|
|
+ resizeObserver.disconnect();
|
|
|
}
|
|
|
if (chart) {
|
|
|
- chart.dispose()
|
|
|
- chart = null
|
|
|
+ chart.dispose();
|
|
|
+ chart = null;
|
|
|
}
|
|
|
-})
|
|
|
+});
|
|
|
|
|
|
watch(
|
|
|
- () => props.rowData,
|
|
|
- () => {
|
|
|
- updateChart();
|
|
|
- },
|
|
|
- { immediate: true, deep: true }
|
|
|
+ () => props.rowData,
|
|
|
+ () => {
|
|
|
+ updateChart();
|
|
|
+ },
|
|
|
+ { immediate: true, deep: true }
|
|
|
);
|
|
|
|
|
|
function updateChart() {
|
|
|
- if (!chart || !props.rowData || props.rowData.length === 0) return;
|
|
|
+ if (!chart || !props.rowData) return;
|
|
|
|
|
|
- const data = props.rowData[0];
|
|
|
- const dates = Object.keys(data);
|
|
|
- const values = Object.values(data);
|
|
|
+ const dates = Object.keys(props.rowData.searchFrequencyRank[0]);
|
|
|
+ const searchFrequencyValues = Object.values(props.rowData.searchFrequencyRank[0]);
|
|
|
+ const clickShareValues = Object.values(props.rowData.clickShare[0]);
|
|
|
+ const conversionShareValues = Object.values(props.rowData.conversionShare[0]);
|
|
|
|
|
|
const option: echarts.EChartsOption = {
|
|
|
xAxis: {
|
|
@@ -58,17 +59,85 @@ function updateChart() {
|
|
|
interval: 0,
|
|
|
},
|
|
|
},
|
|
|
- yAxis: {
|
|
|
- type: 'value',
|
|
|
- },
|
|
|
+ yAxis: [
|
|
|
+ {
|
|
|
+ id: 0,
|
|
|
+ type: 'value',
|
|
|
+ name: 'Search Frequency Rank',
|
|
|
+ nameTextStyle: {
|
|
|
+ fontWeight: 'bold',
|
|
|
+ fontSize: 14,
|
|
|
+ color: '#333'
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ show: true, // 设置显示分割线
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ type: 'value',
|
|
|
+ name: 'Share Rate',
|
|
|
+ nameTextStyle: {
|
|
|
+ fontWeight: 'bold',
|
|
|
+ fontSize: 14,
|
|
|
+ color: '#333'
|
|
|
+ },
|
|
|
+ position: 'right',
|
|
|
+ splitLine: {
|
|
|
+ show: false, // 设置显示分割线
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ formatter: '{value}%',
|
|
|
+ },
|
|
|
+ // axisLine: {
|
|
|
+ // show: true,
|
|
|
+ // },
|
|
|
+ // show: true,
|
|
|
+ },
|
|
|
+ ],
|
|
|
series: [
|
|
|
{
|
|
|
- data: values,
|
|
|
+ name: 'Search Frequency Rank',
|
|
|
+ data: searchFrequencyValues,
|
|
|
+ type: 'bar',
|
|
|
+ barWidth: '18px',
|
|
|
+ itemStyle: {
|
|
|
+ color: '',
|
|
|
+ borderRadius: [4, 4, 4, 4],
|
|
|
+ },
|
|
|
+ yAxisIndex: 0,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'Click Share',
|
|
|
+ data: clickShareValues,
|
|
|
type: 'line',
|
|
|
+ yAxisIndex: 1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: 'Conversion Share',
|
|
|
+ data: conversionShareValues,
|
|
|
+ type: 'line',
|
|
|
+ yAxisIndex: 1,
|
|
|
},
|
|
|
],
|
|
|
tooltip: {
|
|
|
trigger: 'axis',
|
|
|
+ formatter: function(params) {
|
|
|
+ let result = params[0].axisValueLabel + '<br/>';
|
|
|
+ params.forEach(param => {
|
|
|
+ let value = param.value;
|
|
|
+ if (param.seriesName === 'Click Share' || param.seriesName === 'Conversion Share') {
|
|
|
+ value = value + '%';
|
|
|
+ } else if (param.seriesName === 'Search Frequency Rank') {
|
|
|
+ value = value.toLocaleString(); // 使用逗号分隔
|
|
|
+ }
|
|
|
+ result += param.marker + ' ' + param.seriesName + ': ' + value + '<br/>';
|
|
|
+ });
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ legend: {
|
|
|
+ data: ['Search Frequency Rank', 'Click Share', 'Conversion Share'],
|
|
|
},
|
|
|
};
|
|
|
chart.setOption(option);
|
|
@@ -81,11 +150,11 @@ function initChart() {
|
|
|
|
|
|
// 创建 ResizeObserver
|
|
|
resizeObserver = new ResizeObserver(() => {
|
|
|
- chart?.resize()
|
|
|
- })
|
|
|
+ chart?.resize();
|
|
|
+ });
|
|
|
|
|
|
// 观察 chartRef 元素
|
|
|
- resizeObserver.observe(chartRef.value)
|
|
|
+ resizeObserver.observe(chartRef.value);
|
|
|
}
|
|
|
}
|
|
|
</script>
|