echarts中tooltip默认展示的样式
在echarts中tooltip默认展示的样式是这样的:
X轴的name + ':' + value 如下图
tooltip:读音是/tu l ti p/ 工具提示 兄弟们 够意思嘛 发音都备注了
自定义tooltip样式
有些时候,我们想自定义tooltip的样式,比如:
在名称前新增上其他描述,在数值的后面新增上单位。
这个时候我们就需要使用 formatter。
formatter:支持字符串模板和回调函数两种形式
下面我们来看一下回调函数这一种
自定义tooltip样式formatter的回调函数
<template>
<div>
<div class="box" id="box"></div>
</div>
</template>
<script>
import echarts from 'echarts'
export default {
data() {
return {
myChart: null,
xAxisData :['1月', '2月', '3月', '4月', '5月', '6月', '7月'],
seriesData: [
{
data: [1150, 200, 300, 356, 105, 200, 345],
type: 'line'
}
]
}
},
mounted(){
this.myChart = echarts.init(document.getElementById('box'));
this.drawCharts()
},
methods:{
drawCharts(xAxisData, seriesData){
if(!this.myChart){
this.myChart = echarts.init(document.getElementById('box'));
}
// 指定图表的配置项和数据
let option = {
xAxis: {
type: 'category',
data: this.xAxisData
},
yAxis: {
type: 'value'
},
tooltip: {
trigger:'axis',
formatter (res) {
if(res&& res.length){
let name, value;
res.forEach(element => {
name = element.name
value = element.value
});
return '张三'+ name +'的收入:' + value +'元'
}else{
return res
}
}
},
series: this.seriesData
};
// 使用刚指定的配置项和数据显示图表。
this.myChart.setOption(option);
}
}
}
</script>
<style lang="scss" scoped>
.box {
width: 800px;
height: 400px;
}
</style>
发现一个问题
从这张图片中,我们发现鼠标滑到附近的某个点,就能看到tooltip的样式。
它是通过哪一个属性来实现的呢?
下面我们的主角开始登场了。
trigger:'axis'
tooltip下的trigger属性
trigger是触发类型,下面是它的值
trigger:'axis' | 'item' | 'none'
axis:坐标轴触发,主要在柱状图,折线图等,使用类目轴的图表中使用。
用户可以通过点击或悬停在坐标轴上的某个位置,来触发显示该位置附近的数据项信息。
我们就可以使用trigger:'axis'来刚刚我们发现的问题
item:数据项触发,主要在饼图,雷达图,散点图等,无类目轴的图表中使用。
none:什么都不触发。
【特别提醒】 当trigger:axis时,formatter的参数类型由对象变成了一个数组。
我们怎么来区分是否是类目轴呢?
在ECharts中,可以通过xAxis或配置项的type字段来判断当前图表是否是类目轴。
如果xAxis的type设置为'category',则表明该坐标轴是类目轴。
xAxis: {
type: 'category', // 类目轴
data: this.xAxisData
}
鼠标放上去就能看附近某个点tooltip的样式
tooltip: {
// 触发方式
trigger:'axis',
formatter (res) {
if(res&& res.length){
let name, value;
res.forEach(element => {
name = element.name
value = element.value
});
return '张三'+ name +'的收入:' + value +'元'
}else{
return res
}
}
}
如果多条线tooltip还能正常展示吗?
...其他代码不变...
export default {
data() {
return {
myChart: null,
xAxisData :['1月', '2月', '3月', '4月', '5月', '6月', '7月'],
seriesData: [
{
data: [1150, 200, 300, 356, 105, 200, 345],
type: 'line'
},
{
data: [10, 290, 10, 36, 15, 20, 315],
type: 'line'
}
]
}
},
...其他代码不变...
}
</script>
如何处理只能显示出1条线?
tooltip: {
trigger: 'axis',
formatter: (c) => {
let str = ''
let temp = {
name: '',// X轴的名称
marker: '', // 颜色
valueData: '', // 数值
setWidthSpan: '',
}
c.forEach((item) => {
console.log('item', item)
temp.marker = item.marker
temp.name = item.name
temp.valueData = item.value
temp.setWidthSpan = '<span style="display:inline-block;width:10px;height:10px;"></span>'
str += temp.marker + temp.setWidthSpan + temp.valueData + '元' + '<br />'
})
return temp.name + '的收入与支出' + '<br />' + str
},
},
tooltip中自定义组件
params的回调函数:支持返回 HTML 字符串或者创建的 DOM 实例。
在echarts中,仅仅支持HTML字符串。
但是我们可以通过innerHTML将DOM实例变为字符串。
下面我来举个例子:
tooltip:{
trigger:'axis',
formatter (res) {
return `
<div>2024年张三的支出与收入</div>
<div>我是字符串模板模板哈哈</div>
</div>`;
},
},
我们发现使用模板字符串拼接是非常麻烦的。
我们如果使用veu组件,将会非常的简单,也方便我们后期的维护。
如何将vue组件转化为HTML字符串或者DOM实例。
我记得我们render函数和h函数吗?它就可以做到。
render函数和h函数的简单使用
render 函数接受一个 createElement(h) 函数作为参数,并返回一个虚拟 DOM 节点。
createElement 函数用于创建 Vue 的虚拟节点(VNode)。
render(h){
return h('div',{
class:{ // 第二个参数
'is-red': this.isRed
}
},
//第三个参数
[h('p','这是一个render')]
);
}
h函数的三个参数用法(vue2)
第一个参数是必须的。
类型:{String | Object | Function}
一个 HTML 标签名、一个组件、一个异步组件、或一个函数式组件。
是要渲染的html标签。
第一个参数div 是表示创建一个div的元素
第二个参数是可选的。
类型:{Object} 主要是当前html中的各种属性。
如attrs,class,style等
在开发时。建议传,实在没有传的时候,传入 null
第三个参数可选的。
类型:{String | Array | Object} children
虚拟子节点(vnodes),当前html标签的元素。
参考地址:www.cnblogs.com/weichen913/…
tooltip自定义内容使用Vue组件渲染
<!-- toolTipCom.vue -->
<template>
<div>
<div v-for="(item,index) in propsData">
{{ item.data.type==='z' ? '支出:' : '收入:' }} {{ item.data.value }} (元)
</div>
<div>下面你还可以自定义其他详情信息</div>
</div>
</template>
<script>
export default {
props: {
propsData: {
type: Array,
default: ()=>{
return []
}
}
}
}
</script>
import toolTipCom from '@/components/toolTipCom.vue'
import Vue from 'vue'
...其他代码保持不变...
data() {
return {
myChart: null,
xAxisData :['1月', '2月', '3月', '4月', '5月', '6月', '7月'],
// 现在是多条线了
seriesData: [
{
data: [
{value:123, type:'z'},
{value:13, type:'z'},
{value:123, type:'z'},
{value:143, type:'z'},
{value:163, type:'z'},
{value:173, type:'z'},
{value:193, type:'z'}
],
type: 'line',
},
{
data: [
{value:123, type:'s'},
{value:123, type:'s'},
{value:1223, type:'s'},
{value:1433, type:'s'},
{value:1623, type:'s'},
{value:1733, type:'s'},
{value:193, type:'s'}
],
type: 'line',
}
]
}
},
...其他代码保持不变...
tooltip:{
trigger:'axis',
formatter (res) {
console.log(res)
const div = document.createElement('div');
let mapTooltip = new Vue({render: (h) => h( toolTipCom, { props: { propsData: res } }) });
console.log('mapTooltip', mapTooltip)
// 将vue(mapTooltip)组件实例挂载到创建的这个div元素上。
mapTooltip.$mount(div);
// 从挂载的 mapTooltip实例上通过$el属性中获取渲染后的HTML字符串。
return mapTooltip.$el.innerHTML;
}
},
自定义参数type:'s'可以在formatter函数中的res参数中获取到
这个 type:'s' 是在data中自定义的属性。
我们在tooltip中的formatter函数中res参数中是可以获取到的。
通过下面的图我们就一目了然了:
尾声
如果觉得我写的不错的话,请给我一点一个赞,收藏,写下你的想法。
感谢!
各位掘友, 周六啦,加班的掘友记得好好摸鱼。休息的掘友,一起打王者呀