Vue3 + Echarts集成时柱状图和折线图的tooltip不显示问题

背景介绍

今天在使用echarts绘制一个双图表的数据统计图时候,发现 tooltip 无法显示,经过一番排查,发现是使用上错误导致,如下图所示,鼠标悬浮上不能正确触发tooltip和自定义的 valueFormatter

问题原因

Vue3 底层使用了 proxy 代理创建实例,其创建出来的实例与echarts真正使用的那个存在兼容性问题,所以Echarts 无法从中获取内部变量;故设置echarts实例时,不要使用ref、reactive等响应式方法创建echarts对象,应该使用shallowReactive、shallowRef、或者普通变量即可

示例代码

import {defineComponent, getCurrentInstance, onBeforeUnmount, onMounted, PropType, ref,shallowRef, watch} from 'vue'
import type { Ref } from 'vue'
import * as echarts from "echarts";
import {useI18n} from "vue-i18n";
import {EChartsType} from "echarts/types/dist/echarts";
import {HostBillHistory} from "@/service/budget";
const props = {
	height: {
		type: [String, Number] as PropType<string | number>,
		default: 590
	},
	width: {
		type: [String, Number] as PropType<string | number>,
		default: '100%'
	},
	data: {
		type: Array as PropType<Array<HostBillHistory>>
	}
}

const HistoryBill = defineComponent({
	name: 'HistoryBill',
	props,
	setup(props) {

		const updateChartData = () => {

			let dateArr = props.data.map(obj=>obj.day)
			let hostArr = props.data.map(obj=>obj.hostCount)
			let moneyArr = props.data.map(obj=> parseFloat((obj.money/10000).toFixed(2)))

			option.xAxis[0].data=dateArr
			option.series[0].data=hostArr
			option.series[1].data=moneyArr
		}
		const option = {
			backgroundColor: 'white',
			tooltip: {
				trigger: 'axis',
				axisPointer: {
					type: 'shadow',
					crossStyle: {
						color: '#999'
					}
				}
			},
			toolbox: {
				feature: {
					dataView: { show: true, readOnly: false },
					magicType: { show: true, type: ['line', 'bar'] },
					restore: { show: true },
					saveAsImage: { show: true }
				}
			},
			legend: {
				data: ['主机数量', '账单金额']
			},
			xAxis: [
				{
					type: 'category',
					data: props.data.map(obj=>obj.day),
					axisPointer: {
						type: 'shadow'
					}
				}
			],
			yAxis: [
				{
					type: 'value',
					name: '主机数量',
					min: 0,
					max: 250,
					interval: 10,
					axisLabel: {
						formatter: '{value} 台'
					}
				},
				{
					type: 'value',
					name: '账单金额',
					min: 0,
					max: 50,
					interval: 2,
					axisLabel: {
						formatter: '{value} 万'
					}
				}
			],
			series: [
				{
					name: '主机数量',
					type: 'line',
					tooltip: {
						valueFormatter: value => value + ' 台'
					},
					data: props.data.map(obj=>obj.hostCount)
				},
				{
                    name: '账单金额',
                    type: 'bar',
                    tooltip: {
                        valueFormatter: value => value + ' 万'
                    },
                    yAxisIndex: 1,
                    data: props.data.map(obj=> parseFloat((obj.money/10000).toFixed(2)))
                }
            ]
        }


        const globalProperties = getCurrentInstance()?.appContext.config.globalProperties
        const billChartRef: Ref<HTMLDivElement | null> = ref(null)
        let chart = null // 此处不要使用vue3的响应式方法创建
        const init = () => {
            chart = globalProperties?.echarts.init(billChartRef.value)
            chart.setOption(option)
        }


        const resize = echarts.throttle(() => {
            chart && chart.resize()
        }, 20)



        watch(
            () => props.data,
            () => {
                // option.series[0].data= top10()
                updateChartData()
                chart.setOption(option)

            }
        )

        onMounted(() => {
            init()
            addEventListener('resize', resize)
        })


        return { billChartRef }
    },
    render() {
        const { height, width } = this
        return (
            <div
                ref='billChartRef'
                id={'myChart'}
                style={{
                    height: "100%",
                    width: typeof width === 'number' ? width + 'px' : width
                }}
            >

            </div>
        )
    }
})

export default HistoryBill

参考链接

vue3.0 echarts折线图堆叠图 tooltip.trigger = 'axis',提示框不显示,且不触发tooltip的formatter · Issue #15457 · apache/echarts · GitHub

vue3 setup echarts 相关 - 掘金

5.3 - 版本特性 - 入门篇 - 使用手册 - Apache ECharts

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当然可以,ECharts是一个基于JavaScript的开源可视化库,专门用于制作动态的、交互式的数据可视化图表。它提供了多种类型的图表,包括柱状图折线图、散点图、饼图、地图等等。ECharts不仅可以在PC端上使用,也可以在移动端上使用,还支持大数据量的展示。 在Vue项目中使用ECharts,首先需要通过npm安装echarts: ``` npm install echarts --save ``` 然后在需要使用ECharts的组件中引入: ```javascript import echarts from 'echarts' ``` 接下来,我们可以在组件的mounted钩子中创建一个实例: ```javascript mounted() { var myChart = echarts.init(document.getElementById('myChart')) // 绘制图表 myChart.setOption({/* options */}) } ``` 其中,document.getElementById('myChart')是div元素的id,用于渲染图表。setOption()方法用于设置图表的配置项和数据。 下面是一个简单的柱状图示例: ```javascript <template> <div id="myChart" style="width: 600px;height:400px;"></div> </template> <script> import echarts from 'echarts' export default { mounted() { var myChart = echarts.init(document.getElementById('myChart')) myChart.setOption({ title: { text: '销售统计' }, tooltip: {}, xAxis: { data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] }) } } </script> ``` 这个例子中,我们创建了一个柱状图,用于展示不同商品的销售情况。xAxis表示x轴的数据,yAxis表示y轴的数据,series表示数据系列。在series中,我们设置了销量的数据,并指定了数据类型为柱状图。最后,我们将图表渲染到id为myChart的div中。 这只是一个简单的例子,ECharts还有很多强大的功能和配置项可以使用。如果你想深入学习ECharts,可以查看官方文档:https://echarts.apache.org/zh/index.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值